All of lore.kernel.org
 help / color / mirror / Atom feed
* cleanup bio page releasing and fix a page leak
@ 2019-05-02 23:33 Christoph Hellwig
  2019-05-02 23:33 ` [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages Christoph Hellwig
                   ` (8 more replies)
  0 siblings, 9 replies; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Hi Jens,

this series cleans up the various direct I/O and pass through
routines by switching them over to common bio helpers.  For
the block device simple case this also fixes a page leak
if we were using bvec iters.

The last page just unconditionally applies the no page ref
behavior for bvec iters.  I looked at all the callers, and
there is none that drops the pre-required references before
completing the request.  Probably not suitable for so late
in the merge, but I wanted to get it out.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 12:28   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 2/8] block: use bio_release_pages in bio_unmap_user Christoph Hellwig
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Move the BIO_NO_PAGE_REF check into bio_release_pages instead of
duplicating it in both callers.

Also make the function available outside of bio.c so that we can
reuse it in other direct I/O implementations.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c         | 11 ++++++-----
 include/linux/bio.h |  1 +
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 683cbb40f051..96ddffa49881 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -855,11 +855,14 @@ static void bio_get_pages(struct bio *bio)
 		get_page(bvec->bv_page);
 }
 
-static void bio_release_pages(struct bio *bio)
+void bio_release_pages(struct bio *bio)
 {
 	struct bvec_iter_all iter_all;
 	struct bio_vec *bvec;
 
+	if (bio_flagged(bio, BIO_NO_PAGE_REF))
+		return;
+
 	bio_for_each_segment_all(bvec, bio, iter_all)
 		put_page(bvec->bv_page);
 }
@@ -1692,8 +1695,7 @@ static void bio_dirty_fn(struct work_struct *work)
 		next = bio->bi_private;
 
 		bio_set_pages_dirty(bio);
-		if (!bio_flagged(bio, BIO_NO_PAGE_REF))
-			bio_release_pages(bio);
+		bio_release_pages(bio);
 		bio_put(bio);
 	}
 }
@@ -1709,8 +1711,7 @@ void bio_check_pages_dirty(struct bio *bio)
 			goto defer;
 	}
 
-	if (!bio_flagged(bio, BIO_NO_PAGE_REF))
-		bio_release_pages(bio);
+	bio_release_pages(bio);
 	bio_put(bio);
 	return;
 defer:
diff --git a/include/linux/bio.h b/include/linux/bio.h
index ea73df36529a..d5699a54328e 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -427,6 +427,7 @@ bool __bio_try_merge_page(struct bio *bio, struct page *page,
 void __bio_add_page(struct bio *bio, struct page *page,
 		unsigned int len, unsigned int off);
 int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter);
+void bio_release_pages(struct bio *bio);
 struct rq_map_data;
 extern struct bio *bio_map_user_iov(struct request_queue *,
 				    struct iov_iter *, gfp_t);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 2/8] block: use bio_release_pages in bio_unmap_user
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
  2019-05-02 23:33 ` [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-03  6:50   ` Nikolay Borisov
  2019-05-02 23:33 ` [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov Christoph Hellwig
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages and bio_set_pages_dirty instead of open coding
them.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c | 22 +++-------------------
 1 file changed, 3 insertions(+), 19 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 96ddffa49881..a6862b954350 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1445,24 +1445,6 @@ struct bio *bio_map_user_iov(struct request_queue *q,
 	return ERR_PTR(ret);
 }
 
-static void __bio_unmap_user(struct bio *bio)
-{
-	struct bio_vec *bvec;
-	struct bvec_iter_all iter_all;
-
-	/*
-	 * make sure we dirty pages we wrote to
-	 */
-	bio_for_each_segment_all(bvec, bio, iter_all) {
-		if (bio_data_dir(bio) == READ)
-			set_page_dirty_lock(bvec->bv_page);
-
-		put_page(bvec->bv_page);
-	}
-
-	bio_put(bio);
-}
-
 /**
  *	bio_unmap_user	-	unmap a bio
  *	@bio:		the bio being unmapped
@@ -1474,7 +1456,9 @@ static void __bio_unmap_user(struct bio *bio)
  */
 void bio_unmap_user(struct bio *bio)
 {
-	__bio_unmap_user(bio);
+	bio_set_pages_dirty(bio);
+	bio_release_pages(bio);
+	bio_put(bio);
 	bio_put(bio);
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
  2019-05-02 23:33 ` [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages Christoph Hellwig
  2019-05-02 23:33 ` [PATCH 2/8] block: use bio_release_pages in bio_unmap_user Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 12:31   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io Christoph Hellwig
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages instead of open coding it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index a6862b954350..3938e179a530 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1370,8 +1370,6 @@ struct bio *bio_map_user_iov(struct request_queue *q,
 	int j;
 	struct bio *bio;
 	int ret;
-	struct bio_vec *bvec;
-	struct bvec_iter_all iter_all;
 
 	if (!iov_iter_count(iter))
 		return ERR_PTR(-EINVAL);
@@ -1438,9 +1436,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
 	return bio;
 
  out_unmap:
-	bio_for_each_segment_all(bvec, bio, iter_all) {
-		put_page(bvec->bv_page);
-	}
+	bio_release_pages(bio);
 	bio_put(bio);
 	return ERR_PTR(ret);
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (2 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 12:33   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io Christoph Hellwig
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages instead of duplicating it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/iomap.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/fs/iomap.c b/fs/iomap.c
index 12a656271076..a7bff5b2e1e8 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -1588,13 +1588,7 @@ static void iomap_dio_bio_end_io(struct bio *bio)
 	if (should_dirty) {
 		bio_check_pages_dirty(bio);
 	} else {
-		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
-			struct bvec_iter_all iter_all;
-			struct bio_vec *bvec;
-
-			bio_for_each_segment_all(bvec, bio, iter_all)
-				put_page(bvec->bv_page);
-		}
+		bio_release_pages(bio);
 		bio_put(bio);
 	}
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (3 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 12:35   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple Christoph Hellwig
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages instead of duplicating it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/block_dev.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 8abc6570d29f..a59ebea9d125 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -335,13 +335,7 @@ static void blkdev_bio_end_io(struct bio *bio)
 	if (should_dirty) {
 		bio_check_pages_dirty(bio);
 	} else {
-		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
-			struct bvec_iter_all iter_all;
-			struct bio_vec *bvec;
-
-			bio_for_each_segment_all(bvec, bio, iter_all)
-				put_page(bvec->bv_page);
-		}
+		bio_release_pages(bio);
 		bio_put(bio);
 	}
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (4 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 17:38   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete Christoph Hellwig
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages instead of a manual put_pages loop that fails to
take BIO_NO_PAGE_REF into account.  Also use bio_set_pages_dirty for
the rest of the former loop to reduce code duplication.

Fixes: 399254aaf489 ("block: add BIO_NO_PAGE_REF flag")
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/block_dev.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index a59ebea9d125..4fc2377884a3 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -204,13 +204,12 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
 {
 	struct file *file = iocb->ki_filp;
 	struct block_device *bdev = I_BDEV(bdev_file_inode(file));
-	struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs, *bvec;
+	struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs;
 	loff_t pos = iocb->ki_pos;
 	bool should_dirty = false;
 	struct bio bio;
 	ssize_t ret;
 	blk_qc_t qc;
-	struct bvec_iter_all iter_all;
 
 	if ((pos | iov_iter_alignment(iter)) &
 	    (bdev_logical_block_size(bdev) - 1))
@@ -260,11 +259,9 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
 	}
 	__set_current_state(TASK_RUNNING);
 
-	bio_for_each_segment_all(bvec, &bio, iter_all) {
-		if (should_dirty && !PageCompound(bvec->bv_page))
-			set_page_dirty_lock(bvec->bv_page);
-		put_page(bvec->bv_page);
-	}
+	if (should_dirty)
+		bio_set_pages_dirty(&bio);
+	bio_release_pages(&bio);
 
 	if (unlikely(bio.bi_status))
 		ret = blk_status_to_errno(bio.bi_status);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (5 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 17:39   ` Johannes Thumshirn
  2019-05-02 23:33 ` [PATCH 8/8] block: never take page references for ITER_BVEC Christoph Hellwig
  2019-05-03 17:52 ` cleanup bio page releasing and fix a page leak Jens Axboe
  8 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

Use bio_release_pages and bio_set_pages_dirty instead of open coding
them.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/direct-io.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/fs/direct-io.c b/fs/direct-io.c
index fbe885d68035..62d0594a4622 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -537,7 +537,6 @@ static struct bio *dio_await_one(struct dio *dio)
  */
 static blk_status_t dio_bio_complete(struct dio *dio, struct bio *bio)
 {
-	struct bio_vec *bvec;
 	blk_status_t err = bio->bi_status;
 
 	if (err) {
@@ -550,17 +549,9 @@ static blk_status_t dio_bio_complete(struct dio *dio, struct bio *bio)
 	if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) {
 		bio_check_pages_dirty(bio);	/* transfers ownership */
 	} else {
-		struct bvec_iter_all iter_all;
-
-		bio_for_each_segment_all(bvec, bio, iter_all) {
-			struct page *page = bvec->bv_page;
-
-			if (dio->op == REQ_OP_READ && !PageCompound(page) &&
-					dio->should_dirty)
-				set_page_dirty_lock(page);
-			put_page(page);
-		}
-		bio_put(bio);
+		if (dio->op == REQ_OP_READ && dio->should_dirty)
+			bio_set_pages_dirty(bio);
+		bio_release_pages(bio);
 	}
 	return err;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH 8/8] block: never take page references for ITER_BVEC
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (6 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete Christoph Hellwig
@ 2019-05-02 23:33 ` Christoph Hellwig
  2019-05-04 17:41   ` Johannes Thumshirn
  2019-05-06  8:19   ` Ming Lei
  2019-05-03 17:52 ` cleanup bio page releasing and fix a page leak Jens Axboe
  8 siblings, 2 replies; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-02 23:33 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block

If we pass pages through an iov_iter we always already have a reference
in the caller.  Thus remove the ITER_BVEC_FLAG_NO_REF and don't take
reference to pages by default for bvec backed iov_iters.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c          | 14 +-------------
 drivers/block/loop.c | 16 ++++------------
 fs/io_uring.c        |  3 ---
 include/linux/uio.h  |  8 --------
 4 files changed, 5 insertions(+), 36 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 3938e179a530..e999d530d863 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -846,15 +846,6 @@ int bio_add_page(struct bio *bio, struct page *page,
 }
 EXPORT_SYMBOL(bio_add_page);
 
-static void bio_get_pages(struct bio *bio)
-{
-	struct bvec_iter_all iter_all;
-	struct bio_vec *bvec;
-
-	bio_for_each_segment_all(bvec, bio, iter_all)
-		get_page(bvec->bv_page);
-}
-
 void bio_release_pages(struct bio *bio)
 {
 	struct bvec_iter_all iter_all;
@@ -967,11 +958,8 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
 			ret = __bio_iov_iter_get_pages(bio, iter);
 	} while (!ret && iov_iter_count(iter) && !bio_full(bio));
 
-	if (iov_iter_bvec_no_ref(iter))
+	if (is_bvec)
 		bio_set_flag(bio, BIO_NO_PAGE_REF);
-	else if (is_bvec)
-		bio_get_pages(bio);
-
 	return bio->bi_vcnt ? 0 : ret;
 }
 
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 102d79575895..c20710e617c2 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -264,20 +264,12 @@ lo_do_transfer(struct loop_device *lo, int cmd,
 	return ret;
 }
 
-static inline void loop_iov_iter_bvec(struct iov_iter *i,
-		unsigned int direction, const struct bio_vec *bvec,
-		unsigned long nr_segs, size_t count)
-{
-	iov_iter_bvec(i, direction, bvec, nr_segs, count);
-	i->type |= ITER_BVEC_FLAG_NO_REF;
-}
-
 static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
 {
 	struct iov_iter i;
 	ssize_t bw;
 
-	loop_iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
+	iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
 
 	file_start_write(file);
 	bw = vfs_iter_write(file, &i, ppos, 0);
@@ -355,7 +347,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
 	ssize_t len;
 
 	rq_for_each_segment(bvec, rq, iter) {
-		loop_iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
+		iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
 		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
 		if (len < 0)
 			return len;
@@ -396,7 +388,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
 		b.bv_offset = 0;
 		b.bv_len = bvec.bv_len;
 
-		loop_iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
+		iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
 		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
 		if (len < 0) {
 			ret = len;
@@ -563,7 +555,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
 	}
 	atomic_set(&cmd->ref, 2);
 
-	loop_iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
+	iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
 	iter.iov_offset = offset;
 
 	cmd->iocb.ki_pos = pos;
diff --git a/fs/io_uring.c b/fs/io_uring.c
index f65f85d89217..f7eb63a5b3db 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -853,9 +853,6 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw,
 	iov_iter_bvec(iter, rw, imu->bvec, imu->nr_bvecs, offset + len);
 	if (offset)
 		iov_iter_advance(iter, offset);
-
-	/* don't drop a reference to these pages */
-	iter->type |= ITER_BVEC_FLAG_NO_REF;
 	return 0;
 }
 
diff --git a/include/linux/uio.h b/include/linux/uio.h
index f184af1999a8..bace8fd40d0c 100644
--- a/include/linux/uio.h
+++ b/include/linux/uio.h
@@ -23,9 +23,6 @@ struct kvec {
 };
 
 enum iter_type {
-	/* set if ITER_BVEC doesn't hold a bv_page ref */
-	ITER_BVEC_FLAG_NO_REF = 2,
-
 	/* iter types */
 	ITER_IOVEC = 4,
 	ITER_KVEC = 8,
@@ -93,11 +90,6 @@ static inline unsigned char iov_iter_rw(const struct iov_iter *i)
 	return i->type & (READ | WRITE);
 }
 
-static inline bool iov_iter_bvec_no_ref(const struct iov_iter *i)
-{
-	return (i->type & ITER_BVEC_FLAG_NO_REF) != 0;
-}
-
 /*
  * Total number of bytes covered by an iovec.
  *
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH 2/8] block: use bio_release_pages in bio_unmap_user
  2019-05-02 23:33 ` [PATCH 2/8] block: use bio_release_pages in bio_unmap_user Christoph Hellwig
@ 2019-05-03  6:50   ` Nikolay Borisov
  2019-05-03  7:20     ` Christoph Hellwig
  0 siblings, 1 reply; 23+ messages in thread
From: Nikolay Borisov @ 2019-05-03  6:50 UTC (permalink / raw)
  To: Christoph Hellwig, Jens Axboe; +Cc: linux-block



On 3.05.19 г. 2:33 ч., Christoph Hellwig wrote:
> Use bio_release_pages and bio_set_pages_dirty instead of open coding
> them.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  block/bio.c | 22 +++-------------------
>  1 file changed, 3 insertions(+), 19 deletions(-)
> 
> diff --git a/block/bio.c b/block/bio.c
> index 96ddffa49881..a6862b954350 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -1445,24 +1445,6 @@ struct bio *bio_map_user_iov(struct request_queue *q,
>  	return ERR_PTR(ret);
>  }
>  
> -static void __bio_unmap_user(struct bio *bio)
> -{
> -	struct bio_vec *bvec;
> -	struct bvec_iter_all iter_all;
> -
> -	/*
> -	 * make sure we dirty pages we wrote to
> -	 */
> -	bio_for_each_segment_all(bvec, bio, iter_all) {
> -		if (bio_data_dir(bio) == READ)
> -			set_page_dirty_lock(bvec->bv_page);
> -
> -		put_page(bvec->bv_page);
> -	}
> -
> -	bio_put(bio);
> -}
> -
>  /**
>   *	bio_unmap_user	-	unmap a bio
>   *	@bio:		the bio being unmapped
> @@ -1474,7 +1456,9 @@ static void __bio_unmap_user(struct bio *bio)
>   */
>  void bio_unmap_user(struct bio *bio)
>  {
> -	__bio_unmap_user(bio);
> +	bio_set_pages_dirty(bio);

Doesn't this need to be :

if (bio_data_dir(bio) == READ)
  bio_set_pages_dirty()

> +	bio_release_pages(bio);
> +	bio_put(bio);
>  	bio_put(bio);
>  }
>  
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 2/8] block: use bio_release_pages in bio_unmap_user
  2019-05-03  6:50   ` Nikolay Borisov
@ 2019-05-03  7:20     ` Christoph Hellwig
  0 siblings, 0 replies; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-03  7:20 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: Christoph Hellwig, Jens Axboe, linux-block

On Fri, May 03, 2019 at 09:50:08AM +0300, Nikolay Borisov wrote:
> > @@ -1474,7 +1456,9 @@ static void __bio_unmap_user(struct bio *bio)
> >   */
> >  void bio_unmap_user(struct bio *bio)
> >  {
> > -	__bio_unmap_user(bio);
> > +	bio_set_pages_dirty(bio);
> 
> Doesn't this need to be :
> 
> if (bio_data_dir(bio) == READ)
>   bio_set_pages_dirty()

Yes, indeed.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: cleanup bio page releasing and fix a page leak
  2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
                   ` (7 preceding siblings ...)
  2019-05-02 23:33 ` [PATCH 8/8] block: never take page references for ITER_BVEC Christoph Hellwig
@ 2019-05-03 17:52 ` Jens Axboe
  8 siblings, 0 replies; 23+ messages in thread
From: Jens Axboe @ 2019-05-03 17:52 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-block

On 5/2/19 5:33 PM, Christoph Hellwig wrote:
> Hi Jens,
> 
> this series cleans up the various direct I/O and pass through
> routines by switching them over to common bio helpers.  For
> the block device simple case this also fixes a page leak
> if we were using bvec iters.
> 
> The last page just unconditionally applies the no page ref
> behavior for bvec iters.  I looked at all the callers, and
> there is none that drops the pre-required references before
> completing the request.  Probably not suitable for so late
> in the merge, but I wanted to get it out.

I'm guessing you'll spin a v2 of this due to the issue that Nikolay
pointed out. I'd suggest we then just queue it up for later in the merge
window inclusion.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages
  2019-05-02 23:33 ` [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages Christoph Hellwig
@ 2019-05-04 12:28   ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 12:28 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov
  2019-05-02 23:33 ` [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov Christoph Hellwig
@ 2019-05-04 12:31   ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 12:31 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io
  2019-05-02 23:33 ` [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io Christoph Hellwig
@ 2019-05-04 12:33   ` Johannes Thumshirn
  2019-05-04 12:35     ` Johannes Thumshirn
  0 siblings, 1 reply; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 12:33 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

On Thu, May 02, 2019 at 07:33:28PM -0400, Christoph Hellwig wrote:
> @@ -1588,13 +1588,7 @@ static void iomap_dio_bio_end_io(struct bio *bio)
>  	if (should_dirty) {
>  		bio_check_pages_dirty(bio);
>  	} else {
> -		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
> -			struct bvec_iter_all iter_all;
> -			struct bio_vec *bvec;
> -
> -			bio_for_each_segment_all(bvec, bio, iter_all)
> -				put_page(bvec->bv_page);
> -		}
> +		bio_release_pages(bio);

Shouldn't this rather be:

		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) 
			bio_release_pages(bio);
		
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io
  2019-05-04 12:33   ` Johannes Thumshirn
@ 2019-05-04 12:35     ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 12:35 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

On Sat, May 04, 2019 at 02:33:09PM +0200, Johannes Thumshirn wrote:
> 
> Shouldn't this rather be:
> 
> 		if (!bio_flagged(bio, BIO_NO_PAGE_REF)) 
> 			bio_release_pages(bio);

OK I apparently can't remember between 3 emails, sorry


Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io
  2019-05-02 23:33 ` [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io Christoph Hellwig
@ 2019-05-04 12:35   ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 12:35 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple
  2019-05-02 23:33 ` [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple Christoph Hellwig
@ 2019-05-04 17:38   ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 17:38 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete
  2019-05-02 23:33 ` [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete Christoph Hellwig
@ 2019-05-04 17:39   ` Johannes Thumshirn
  0 siblings, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 17:39 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 8/8] block: never take page references for ITER_BVEC
  2019-05-02 23:33 ` [PATCH 8/8] block: never take page references for ITER_BVEC Christoph Hellwig
@ 2019-05-04 17:41   ` Johannes Thumshirn
  2019-05-06  8:19   ` Ming Lei
  1 sibling, 0 replies; 23+ messages in thread
From: Johannes Thumshirn @ 2019-05-04 17:41 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
-- 
Johannes Thumshirn                            SUSE Labs Filesystems
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 8/8] block: never take page references for ITER_BVEC
  2019-05-02 23:33 ` [PATCH 8/8] block: never take page references for ITER_BVEC Christoph Hellwig
  2019-05-04 17:41   ` Johannes Thumshirn
@ 2019-05-06  8:19   ` Ming Lei
  2019-05-06 13:30     ` Christoph Hellwig
  1 sibling, 1 reply; 23+ messages in thread
From: Ming Lei @ 2019-05-06  8:19 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block

On Thu, May 02, 2019 at 07:33:32PM -0400, Christoph Hellwig wrote:
> If we pass pages through an iov_iter we always already have a reference
> in the caller.  Thus remove the ITER_BVEC_FLAG_NO_REF and don't take
> reference to pages by default for bvec backed iov_iters.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  block/bio.c          | 14 +-------------
>  drivers/block/loop.c | 16 ++++------------
>  fs/io_uring.c        |  3 ---
>  include/linux/uio.h  |  8 --------
>  4 files changed, 5 insertions(+), 36 deletions(-)
> 
> diff --git a/block/bio.c b/block/bio.c
> index 3938e179a530..e999d530d863 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -846,15 +846,6 @@ int bio_add_page(struct bio *bio, struct page *page,
>  }
>  EXPORT_SYMBOL(bio_add_page);
>  
> -static void bio_get_pages(struct bio *bio)
> -{
> -	struct bvec_iter_all iter_all;
> -	struct bio_vec *bvec;
> -
> -	bio_for_each_segment_all(bvec, bio, iter_all)
> -		get_page(bvec->bv_page);
> -}
> -
>  void bio_release_pages(struct bio *bio)
>  {
>  	struct bvec_iter_all iter_all;
> @@ -967,11 +958,8 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
>  			ret = __bio_iov_iter_get_pages(bio, iter);
>  	} while (!ret && iov_iter_count(iter) && !bio_full(bio));
>  
> -	if (iov_iter_bvec_no_ref(iter))
> +	if (is_bvec)
>  		bio_set_flag(bio, BIO_NO_PAGE_REF);
> -	else if (is_bvec)
> -		bio_get_pages(bio);
> -
>  	return bio->bi_vcnt ? 0 : ret;
>  }
>  
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index 102d79575895..c20710e617c2 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -264,20 +264,12 @@ lo_do_transfer(struct loop_device *lo, int cmd,
>  	return ret;
>  }
>  
> -static inline void loop_iov_iter_bvec(struct iov_iter *i,
> -		unsigned int direction, const struct bio_vec *bvec,
> -		unsigned long nr_segs, size_t count)
> -{
> -	iov_iter_bvec(i, direction, bvec, nr_segs, count);
> -	i->type |= ITER_BVEC_FLAG_NO_REF;
> -}
> -
>  static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
>  {
>  	struct iov_iter i;
>  	ssize_t bw;
>  
> -	loop_iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
> +	iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
>  
>  	file_start_write(file);
>  	bw = vfs_iter_write(file, &i, ppos, 0);
> @@ -355,7 +347,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
>  	ssize_t len;
>  
>  	rq_for_each_segment(bvec, rq, iter) {
> -		loop_iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
> +		iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
>  		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
>  		if (len < 0)
>  			return len;
> @@ -396,7 +388,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
>  		b.bv_offset = 0;
>  		b.bv_len = bvec.bv_len;
>  
> -		loop_iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
> +		iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
>  		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
>  		if (len < 0) {
>  			ret = len;
> @@ -563,7 +555,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
>  	}
>  	atomic_set(&cmd->ref, 2);
>  
> -	loop_iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
> +	iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
>  	iter.iov_offset = offset;
>  
>  	cmd->iocb.ki_pos = pos;
> diff --git a/fs/io_uring.c b/fs/io_uring.c
> index f65f85d89217..f7eb63a5b3db 100644
> --- a/fs/io_uring.c
> +++ b/fs/io_uring.c
> @@ -853,9 +853,6 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw,
>  	iov_iter_bvec(iter, rw, imu->bvec, imu->nr_bvecs, offset + len);
>  	if (offset)
>  		iov_iter_advance(iter, offset);
> -
> -	/* don't drop a reference to these pages */
> -	iter->type |= ITER_BVEC_FLAG_NO_REF;
>  	return 0;
>  }
>  
> diff --git a/include/linux/uio.h b/include/linux/uio.h
> index f184af1999a8..bace8fd40d0c 100644
> --- a/include/linux/uio.h
> +++ b/include/linux/uio.h
> @@ -23,9 +23,6 @@ struct kvec {
>  };
>  
>  enum iter_type {
> -	/* set if ITER_BVEC doesn't hold a bv_page ref */
> -	ITER_BVEC_FLAG_NO_REF = 2,
> -
>  	/* iter types */
>  	ITER_IOVEC = 4,
>  	ITER_KVEC = 8,
> @@ -93,11 +90,6 @@ static inline unsigned char iov_iter_rw(const struct iov_iter *i)
>  	return i->type & (READ | WRITE);
>  }
>  
> -static inline bool iov_iter_bvec_no_ref(const struct iov_iter *i)
> -{
> -	return (i->type & ITER_BVEC_FLAG_NO_REF) != 0;
> -}
> -
>  /*
>   * Total number of bytes covered by an iovec.
>   *

I remember that this way is the initial version of Jens' patch, however
kernel bug is triggered:

https://lore.kernel.org/linux-block/20190226034613.GA676@sol.localdomain/

Or maybe I miss some recent changes, could you explain it a bit?

Thanks,
Ming

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 8/8] block: never take page references for ITER_BVEC
  2019-05-06  8:19   ` Ming Lei
@ 2019-05-06 13:30     ` Christoph Hellwig
  2019-05-07  6:09       ` Christoph Hellwig
  0 siblings, 1 reply; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-06 13:30 UTC (permalink / raw)
  To: Ming Lei; +Cc: Christoph Hellwig, Jens Axboe, linux-block

On Mon, May 06, 2019 at 04:19:54PM +0800, Ming Lei wrote:
> I remember that this way is the initial version of Jens' patch, however
> kernel bug is triggered:
> 
> https://lore.kernel.org/linux-block/20190226034613.GA676@sol.localdomain/
> 
> Or maybe I miss some recent changes, could you explain it a bit?

I'm not even sure how the original would crash..  When I run the
rest locally it gets and EBUSY from ioctl LOOP_SET_FD, so I'm
not sure what it tends up testing in the end.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH 8/8] block: never take page references for ITER_BVEC
  2019-05-06 13:30     ` Christoph Hellwig
@ 2019-05-07  6:09       ` Christoph Hellwig
  0 siblings, 0 replies; 23+ messages in thread
From: Christoph Hellwig @ 2019-05-07  6:09 UTC (permalink / raw)
  To: Ming Lei; +Cc: Christoph Hellwig, Jens Axboe, linux-block

On Mon, May 06, 2019 at 03:30:27PM +0200, Christoph Hellwig wrote:
> On Mon, May 06, 2019 at 04:19:54PM +0800, Ming Lei wrote:
> > I remember that this way is the initial version of Jens' patch, however
> > kernel bug is triggered:
> > 
> > https://lore.kernel.org/linux-block/20190226034613.GA676@sol.localdomain/
> > 
> > Or maybe I miss some recent changes, could you explain it a bit?
> 
> I'm not even sure how the original would crash..  When I run the
> rest locally it gets and EBUSY from ioctl LOOP_SET_FD, so I'm
> not sure what it tends up testing in the end.

I also did another run with KASAN enabled and a clean environment,
this gives no EBUSY and still works fine.  I still don't understand
what the original problem might have been here, though.

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2019-05-07  6:09 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-02 23:33 cleanup bio page releasing and fix a page leak Christoph Hellwig
2019-05-02 23:33 ` [PATCH 1/8] block: move the BIO_NO_PAGE_REF check into bio_release_pages Christoph Hellwig
2019-05-04 12:28   ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 2/8] block: use bio_release_pages in bio_unmap_user Christoph Hellwig
2019-05-03  6:50   ` Nikolay Borisov
2019-05-03  7:20     ` Christoph Hellwig
2019-05-02 23:33 ` [PATCH 3/8] block: use bio_release_pages in bio_map_user_iov Christoph Hellwig
2019-05-04 12:31   ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 4/8] iomap: use bio_release_pages in iomap_dio_bio_end_io Christoph Hellwig
2019-05-04 12:33   ` Johannes Thumshirn
2019-05-04 12:35     ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 5/8] block_dev: use bio_release_pages in blkdev_bio_end_io Christoph Hellwig
2019-05-04 12:35   ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 6/8] block_dev: use bio_release_pages in __blkdev_direct_IO_simple Christoph Hellwig
2019-05-04 17:38   ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 7/8] direct-io: use bio_release_pages in dio_bio_complete Christoph Hellwig
2019-05-04 17:39   ` Johannes Thumshirn
2019-05-02 23:33 ` [PATCH 8/8] block: never take page references for ITER_BVEC Christoph Hellwig
2019-05-04 17:41   ` Johannes Thumshirn
2019-05-06  8:19   ` Ming Lei
2019-05-06 13:30     ` Christoph Hellwig
2019-05-07  6:09       ` Christoph Hellwig
2019-05-03 17:52 ` cleanup bio page releasing and fix a page leak Jens Axboe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.