diff mbox series

block: fix pin count management when merging same-page segments

Message ID 20230905124731.328255-1-hch@lst.de (mailing list archive)
State New, archived
Headers show
Series block: fix pin count management when merging same-page segments | expand

Commit Message

Christoph Hellwig Sept. 5, 2023, 12:47 p.m. UTC
There is no need to unpin the added page when adding it to the bio fails
as that is done by the loop below.  Instead we want to unpin it when adding
a single page to the bio more than once as bio_release_pages will only
unpin it once.

Fixes: d1916c86ccdc ("block: move same page handling from __bio_add_pc_page to the callers")
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/blk-map.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Comments

Damien Le Moal Sept. 6, 2023, 1:18 a.m. UTC | #1
On 9/5/23 21:47, Christoph Hellwig wrote:
> There is no need to unpin the added page when adding it to the bio fails
> as that is done by the loop below.  Instead we want to unpin it when adding
> a single page to the bio more than once as bio_release_pages will only
> unpin it once.
> 
> Fixes: d1916c86ccdc ("block: move same page handling from __bio_add_pc_page to the callers")
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Jens Axboe Sept. 6, 2023, 1:33 p.m. UTC | #2
On Tue, 05 Sep 2023 14:47:31 +0200, Christoph Hellwig wrote:
> There is no need to unpin the added page when adding it to the bio fails
> as that is done by the loop below.  Instead we want to unpin it when adding
> a single page to the bio more than once as bio_release_pages will only
> unpin it once.
> 
> 

Applied, thanks!

[1/1] block: fix pin count management when merging same-page segments
      commit: 5905afc2c7bb713d52c7c7585565feecbb686b44

Best regards,
diff mbox series

Patch

diff --git a/block/blk-map.c b/block/blk-map.c
index 44d74a30ddac04..8584babf3ea0ca 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -315,12 +315,11 @@  static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
 					n = bytes;
 
 				if (!bio_add_hw_page(rq->q, bio, page, n, offs,
-						     max_sectors, &same_page)) {
-					if (same_page)
-						bio_release_page(bio, page);
+						     max_sectors, &same_page))
 					break;
-				}
 
+				if (same_page)
+					bio_release_page(bio, page);
 				bytes -= n;
 				offs = 0;
 			}