On Wed, 2022-06-22 at 05:15 +0100, Al Viro wrote: > ... doing revert if we end up not using some pages > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > --- > block/bio.c | 15 ++++++--------- > block/blk-map.c | 7 ++++--- > 2 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/block/bio.c b/block/bio.c > index 51c99f2c5c90..01ab683e67be 100644 > --- a/block/bio.c > +++ b/block/bio.c > @@ -1190,7 +1190,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) > BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2); > pages += entries_left * (PAGE_PTRS_PER_BVEC - 1); > > - size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset); > + size = iov_iter_get_pages2(iter, pages, LONG_MAX, nr_pages, &offset); > if (unlikely(size <= 0)) > return size ? size : -EFAULT; > > @@ -1205,6 +1205,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) > } else { > if (WARN_ON_ONCE(bio_full(bio, len))) { > bio_put_pages(pages + i, left, offset); > + iov_iter_revert(iter, left); > return -EINVAL; > } > __bio_add_page(bio, page, len, offset); > @@ -1212,7 +1213,6 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) > offset = 0; > } > > - iov_iter_advance(iter, size); > return 0; > } > > @@ -1227,7 +1227,6 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter) > ssize_t size, left; > unsigned len, i; > size_t offset; > - int ret = 0; > > if (WARN_ON_ONCE(!max_append_sectors)) > return 0; > @@ -1240,7 +1239,7 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter) > BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2); > pages += entries_left * (PAGE_PTRS_PER_BVEC - 1); > > - size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset); > + size = iov_iter_get_pages2(iter, pages, LONG_MAX, nr_pages, &offset); > if (unlikely(size <= 0)) > return size ? size : -EFAULT; > > @@ -1252,16 +1251,14 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter) > if (bio_add_hw_page(q, bio, page, len, offset, > max_append_sectors, &same_page) != len) { > bio_put_pages(pages + i, left, offset); > - ret = -EINVAL; > - break; > + iov_iter_revert(iter, left); > + return -EINVAL; > } > if (same_page) > put_page(page); > offset = 0; > } > - > - iov_iter_advance(iter, size - left); > - return ret; > + return 0; > } > > /** > diff --git a/block/blk-map.c b/block/blk-map.c > index df8b066cd548..7196a6b64c80 100644 > --- a/block/blk-map.c > +++ b/block/blk-map.c > @@ -254,7 +254,7 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, > size_t offs, added = 0; > int npages; > > - bytes = iov_iter_get_pages_alloc(iter, &pages, LONG_MAX, &offs); > + bytes = iov_iter_get_pages_alloc2(iter, &pages, LONG_MAX, &offs); > if (unlikely(bytes <= 0)) { > ret = bytes ? bytes : -EFAULT; > goto out_unmap; > @@ -284,7 +284,6 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, > bytes -= n; > offs = 0; > } > - iov_iter_advance(iter, added); > } > /* > * release the pages we didn't map into the bio, if any > @@ -293,8 +292,10 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, > put_page(pages[j++]); > kvfree(pages); > /* couldn't stuff something into bio? */ > - if (bytes) > + if (bytes) { > + iov_iter_revert(iter, bytes); > break; > + } > } > > ret = blk_rq_append_bio(rq, bio); Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>