Messages in this thread Patch in this message | | | From | Ming Lin <> | Subject | [PATCH] bio: switch to iov_iter_{npages,alignment} | Date | Fri, 24 Apr 2015 15:45:23 -0700 |
| |
Signed-off-by: Ming Lin <mlin@kernel.org> --- block/bio.c | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-)
diff --git a/block/bio.c b/block/bio.c index 05c2864..c3a6468 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1158,29 +1158,14 @@ struct bio *bio_copy_user_iov(struct request_queue *q, struct bio_map_data *bmd; struct page *page; struct bio *bio; - int i, ret; + int uninitialized_var(i), ret; int nr_pages = 0; unsigned int len = iter->count; unsigned int offset = map_data ? map_data->offset & ~PAGE_MASK : 0; - for (i = 0; i < iter->nr_segs; i++) { - unsigned long uaddr; - unsigned long end; - unsigned long start; - - uaddr = (unsigned long) iter->iov[i].iov_base; - end = (uaddr + iter->iov[i].iov_len + PAGE_SIZE - 1) - >> PAGE_SHIFT; - start = uaddr >> PAGE_SHIFT; - - /* - * Overflow, abort - */ - if (end < start) - return ERR_PTR(-EINVAL); - - nr_pages += end - start; - } + nr_pages = iov_iter_npages(iter, INT_MAX); + if (!nr_pages) + return ERR_PTR(-EINVAL); if (offset) nr_pages++; @@ -1292,26 +1277,10 @@ struct bio *bio_map_user_iov(struct request_queue *q, struct iov_iter i; struct iovec iov; - iov_for_each(iov, i, *iter) { - unsigned long uaddr = (unsigned long) iov.iov_base; - unsigned long len = iov.iov_len; - unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; - unsigned long start = uaddr >> PAGE_SHIFT; - - /* - * Overflow, abort - */ - if (end < start) - return ERR_PTR(-EINVAL); - - nr_pages += end - start; - /* - * buffer must be aligned to at least hardsector size for now - */ - if (uaddr & queue_dma_alignment(q)) - return ERR_PTR(-EINVAL); - } + if (iov_iter_alignment(iter) & queue_dma_alignment(q)) + return ERR_PTR(-EINVAL); + nr_pages = iov_iter_npages(iter, INT_MAX); if (!nr_pages) return ERR_PTR(-EINVAL); -- 1.9.1
| |