summary refs log tree commit diff
path: root/fs/iomap.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-02-27 13:13:23 -0700
committerJens Axboe <axboe@kernel.dk>2019-03-18 10:44:48 -0600
commit399254aaf4892113c806816f7e64cf40c804d46d (patch)
tree319206f280d9b57c45dfa2a42e869b25270611f4 /fs/iomap.c
parent875f1d0769cdcfe1596ff0ca609b453359e42ec9 (diff)
downloadlinux-399254aaf4892113c806816f7e64cf40c804d46d.tar.gz
block: add BIO_NO_PAGE_REF flag
If bio_iov_iter_get_pages() is called on an iov_iter that is flagged
with NO_REF, then we don't need to add a page reference for the pages
that we add.

Add BIO_NO_PAGE_REF to track this in the bio, so IO completion knows
not to drop a reference to these pages.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/iomap.c')
-rw-r--r--fs/iomap.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/iomap.c b/fs/iomap.c
index 97cb9d486a7d..abdd18e404f8 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -1589,12 +1589,14 @@ static void iomap_dio_bio_end_io(struct bio *bio)
 	if (should_dirty) {
 		bio_check_pages_dirty(bio);
 	} else {
-		struct bio_vec *bvec;
-		int i;
-		struct bvec_iter_all iter_all;
+		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
+			struct bvec_iter_all iter_all;
+			struct bio_vec *bvec;
+			int i;
 
-		bio_for_each_segment_all(bvec, bio, i, iter_all)
-			put_page(bvec->bv_page);
+			bio_for_each_segment_all(bvec, bio, i, iter_all)
+				put_page(bvec->bv_page);
+		}
 		bio_put(bio);
 	}
 }