bio_map_user_iov(): get rid of the iov_for_each()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 23 Sep 2017 20:24:59 +0000 (16:24 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 11 Oct 2017 21:23:39 +0000 (17:23 -0400)
Use iov_iter_npages()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
block/bio.c

index d851f68..d1ca7ee 100644 (file)
@@ -1324,32 +1324,15 @@ struct bio *bio_map_user_iov(struct request_queue *q,
                             gfp_t gfp_mask)
 {
        int j;
-       int nr_pages = 0;
        struct bio *bio;
        int ret;
        struct iov_iter i;
-       struct iovec iov;
        struct bio_vec *bvec;
 
-       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;
-       }
-
-       if (!nr_pages)
+       if (!iov_iter_count(iter))
                return ERR_PTR(-EINVAL);
 
-       bio = bio_kmalloc(gfp_mask, nr_pages);
+       bio = bio_kmalloc(gfp_mask, iov_iter_npages(iter, BIO_MAX_PAGES));
        if (!bio)
                return ERR_PTR(-ENOMEM);