mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-18 11:54:37 +08:00
Merge branch 'for-linus' into work.lookups
This commit is contained in:
commit
df889b3631
@ -9,24 +9,6 @@
|
|||||||
|
|
||||||
#include "blk.h"
|
#include "blk.h"
|
||||||
|
|
||||||
static bool iovec_gap_to_prv(struct request_queue *q,
|
|
||||||
struct iovec *prv, struct iovec *cur)
|
|
||||||
{
|
|
||||||
unsigned long prev_end;
|
|
||||||
|
|
||||||
if (!queue_virt_boundary(q))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (prv->iov_base == NULL && prv->iov_len == 0)
|
|
||||||
/* prv is not set - don't check */
|
|
||||||
return false;
|
|
||||||
|
|
||||||
prev_end = (unsigned long)(prv->iov_base + prv->iov_len);
|
|
||||||
|
|
||||||
return (((unsigned long)cur->iov_base & queue_virt_boundary(q)) ||
|
|
||||||
prev_end & queue_virt_boundary(q));
|
|
||||||
}
|
|
||||||
|
|
||||||
int blk_rq_append_bio(struct request_queue *q, struct request *rq,
|
int blk_rq_append_bio(struct request_queue *q, struct request *rq,
|
||||||
struct bio *bio)
|
struct bio *bio)
|
||||||
{
|
{
|
||||||
@ -125,31 +107,18 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
|||||||
struct rq_map_data *map_data,
|
struct rq_map_data *map_data,
|
||||||
const struct iov_iter *iter, gfp_t gfp_mask)
|
const struct iov_iter *iter, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
struct iovec iov, prv = {.iov_base = NULL, .iov_len = 0};
|
bool copy = false;
|
||||||
bool copy = (q->dma_pad_mask & iter->count) || map_data;
|
unsigned long align = q->dma_pad_mask | queue_dma_alignment(q);
|
||||||
struct bio *bio = NULL;
|
struct bio *bio = NULL;
|
||||||
struct iov_iter i;
|
struct iov_iter i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!iter || !iter->count)
|
if (map_data)
|
||||||
return -EINVAL;
|
copy = true;
|
||||||
|
else if (iov_iter_alignment(iter) & align)
|
||||||
iov_for_each(iov, i, *iter) {
|
copy = true;
|
||||||
unsigned long uaddr = (unsigned long) iov.iov_base;
|
else if (queue_virt_boundary(q))
|
||||||
|
copy = queue_virt_boundary(q) & iov_iter_gap_alignment(iter);
|
||||||
if (!iov.iov_len)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keep going so we check length of all segments
|
|
||||||
*/
|
|
||||||
if ((uaddr & queue_dma_alignment(q)) ||
|
|
||||||
iovec_gap_to_prv(q, &prv, &iov))
|
|
||||||
copy = true;
|
|
||||||
|
|
||||||
prv.iov_base = iov.iov_base;
|
|
||||||
prv.iov_len = iov.iov_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = *iter;
|
i = *iter;
|
||||||
do {
|
do {
|
||||||
|
20
fs/namei.c
20
fs/namei.c
@ -2946,22 +2946,10 @@ no_open:
|
|||||||
dentry = lookup_real(dir, dentry, nd->flags);
|
dentry = lookup_real(dir, dentry, nd->flags);
|
||||||
if (IS_ERR(dentry))
|
if (IS_ERR(dentry))
|
||||||
return PTR_ERR(dentry);
|
return PTR_ERR(dentry);
|
||||||
|
}
|
||||||
if (create_error) {
|
if (create_error && !dentry->d_inode) {
|
||||||
int open_flag = op->open_flag;
|
error = create_error;
|
||||||
|
goto out;
|
||||||
error = create_error;
|
|
||||||
if ((open_flag & O_EXCL)) {
|
|
||||||
if (!dentry->d_inode)
|
|
||||||
goto out;
|
|
||||||
} else if (!dentry->d_inode) {
|
|
||||||
goto out;
|
|
||||||
} else if ((open_flag & O_TRUNC) &&
|
|
||||||
d_is_reg(dentry)) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
/* will fail later, go on to get the right error */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
looked_up:
|
looked_up:
|
||||||
path->dentry = dentry;
|
path->dentry = dentry;
|
||||||
|
@ -1143,6 +1143,9 @@ static long do_splice_to(struct file *in, loff_t *ppos,
|
|||||||
if (unlikely(ret < 0))
|
if (unlikely(ret < 0))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (unlikely(len > MAX_RW_COUNT))
|
||||||
|
len = MAX_RW_COUNT;
|
||||||
|
|
||||||
if (in->f_op->splice_read)
|
if (in->f_op->splice_read)
|
||||||
splice_read = in->f_op->splice_read;
|
splice_read = in->f_op->splice_read;
|
||||||
else
|
else
|
||||||
|
@ -87,6 +87,7 @@ size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
|
|||||||
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
|
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
|
||||||
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
|
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
|
||||||
unsigned long iov_iter_alignment(const struct iov_iter *i);
|
unsigned long iov_iter_alignment(const struct iov_iter *i);
|
||||||
|
unsigned long iov_iter_gap_alignment(const struct iov_iter *i);
|
||||||
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
|
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
|
||||||
unsigned long nr_segs, size_t count);
|
unsigned long nr_segs, size_t count);
|
||||||
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *kvec,
|
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *kvec,
|
||||||
|
@ -569,6 +569,25 @@ unsigned long iov_iter_alignment(const struct iov_iter *i)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iov_iter_alignment);
|
EXPORT_SYMBOL(iov_iter_alignment);
|
||||||
|
|
||||||
|
unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
|
||||||
|
{
|
||||||
|
unsigned long res = 0;
|
||||||
|
size_t size = i->count;
|
||||||
|
if (!size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
iterate_all_kinds(i, size, v,
|
||||||
|
(res |= (!res ? 0 : (unsigned long)v.iov_base) |
|
||||||
|
(size != v.iov_len ? size : 0), 0),
|
||||||
|
(res |= (!res ? 0 : (unsigned long)v.bv_offset) |
|
||||||
|
(size != v.bv_len ? size : 0)),
|
||||||
|
(res |= (!res ? 0 : (unsigned long)v.iov_base) |
|
||||||
|
(size != v.iov_len ? size : 0))
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(iov_iter_gap_alignment);
|
||||||
|
|
||||||
ssize_t iov_iter_get_pages(struct iov_iter *i,
|
ssize_t iov_iter_get_pages(struct iov_iter *i,
|
||||||
struct page **pages, size_t maxsize, unsigned maxpages,
|
struct page **pages, size_t maxsize, unsigned maxpages,
|
||||||
size_t *start)
|
size_t *start)
|
||||||
|
Loading…
Reference in New Issue
Block a user