bio_copy_from_iter(): get rid of copying iov_iter
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 24 Sep 2017 16:14:36 +0000 (12:14 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 11 Oct 2017 21:23:41 +0000 (17:23 -0400)
we want the one passed to it advanced, anyway

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

index 02457c2d4379a27395e76e1c0c607d9b5b3e2697..f5002b44c963226b3a26503cbf5b98070487ec0b 100644 (file)
@@ -1088,7 +1088,7 @@ static struct bio_map_data *bio_alloc_map_data(unsigned int iov_count,
  * Copy all pages from iov_iter to bio.
  * Returns 0 on success, or error on failure.
  */
-static int bio_copy_from_iter(struct bio *bio, struct iov_iter iter)
+static int bio_copy_from_iter(struct bio *bio, struct iov_iter *iter)
 {
        int i;
        struct bio_vec *bvec;
@@ -1099,9 +1099,9 @@ static int bio_copy_from_iter(struct bio *bio, struct iov_iter iter)
                ret = copy_page_from_iter(bvec->bv_page,
                                          bvec->bv_offset,
                                          bvec->bv_len,
-                                         &iter);
+                                         iter);
 
-               if (!iov_iter_count(&iter))
+               if (!iov_iter_count(iter))
                        break;
 
                if (ret < bvec->bv_len)
@@ -1297,11 +1297,12 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
         */
        if (((iter->type & WRITE) && (!map_data || !map_data->null_mapped)) ||
            (map_data && map_data->from_user)) {
-               ret = bio_copy_from_iter(bio, *iter);
+               ret = bio_copy_from_iter(bio, iter);
                if (ret)
                        goto cleanup;
+       } else {
+               iov_iter_advance(iter, bio->bi_iter.bi_size);
        }
-       iov_iter_advance(iter, bio->bi_iter.bi_size);
 
        bio->bi_private = bmd;
        if (map_data && map_data->null_mapped)