block: fix pin count management when merging same-page segments
authorChristoph Hellwig <hch@lst.de>
Tue, 5 Sep 2023 12:47:31 +0000 (14:47 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 6 Sep 2023 13:32:27 +0000 (07:32 -0600)
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>
Link: https://lore.kernel.org/r/20230905124731.328255-1-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-map.c

index 44d74a30ddac042ec29c2b6880724c3156fd49d8..8584babf3ea0ca2590f30383b9594231266e9437 100644 (file)
@@ -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;
                        }