Loading block/blk-map.c +8 −39 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -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; iov_for_each(iov, i, *iter) { unsigned long uaddr = (unsigned long) iov.iov_base; 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; copy = true; else if (iov_iter_alignment(iter) & align) prv.iov_base = iov.iov_base; copy = true; prv.iov_len = iov.iov_len; else if (queue_virt_boundary(q)) } copy = queue_virt_boundary(q) & iov_iter_gap_alignment(iter); i = *iter; i = *iter; do { do { Loading fs/namei.c +4 −16 Original line number Original line Diff line number Diff line Loading @@ -2946,22 +2946,10 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, 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; error = create_error; if ((open_flag & O_EXCL)) { if (!dentry->d_inode) goto out; 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; Loading fs/splice.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading include/linux/uio.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading lib/iov_iter.c +19 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
block/blk-map.c +8 −39 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -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; iov_for_each(iov, i, *iter) { unsigned long uaddr = (unsigned long) iov.iov_base; 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; copy = true; else if (iov_iter_alignment(iter) & align) prv.iov_base = iov.iov_base; copy = true; prv.iov_len = iov.iov_len; else if (queue_virt_boundary(q)) } copy = queue_virt_boundary(q) & iov_iter_gap_alignment(iter); i = *iter; i = *iter; do { do { Loading
fs/namei.c +4 −16 Original line number Original line Diff line number Diff line Loading @@ -2946,22 +2946,10 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, 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; error = create_error; if ((open_flag & O_EXCL)) { if (!dentry->d_inode) goto out; 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; Loading
fs/splice.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
include/linux/uio.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
lib/iov_iter.c +19 −0 Original line number Original line Diff line number Diff line Loading @@ -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