]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bio: Fix bio_first_folio() for SPARSEMEM without VMEMMAP
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 12 Jun 2025 14:41:25 +0000 (15:41 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jun 2025 13:32:33 +0000 (15:32 +0200)
[ Upstream commit f826ec7966a63d48e16e0868af4e038bf9a1a3ae ]

It is possible for physically contiguous folios to have discontiguous
struct pages if SPARSEMEM is enabled and SPARSEMEM_VMEMMAP is not.
This is correctly handled by folio_page_idx(), so remove this open-coded
implementation.

Fixes: 640d1930bef4 (block: Add bio_for_each_folio_all())
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://lore.kernel.org/r/20250612144126.2849931-1-willy@infradead.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/bio.h

index 9e98fb87e7ef71315c7b5a2f08c8390d945b89d3..1289b8e487801105dd0d301a5e19edd0b5d456a2 100644 (file)
@@ -294,7 +294,7 @@ static inline void bio_first_folio(struct folio_iter *fi, struct bio *bio,
 
        fi->folio = page_folio(bvec->bv_page);
        fi->offset = bvec->bv_offset +
-                       PAGE_SIZE * (bvec->bv_page - &fi->folio->page);
+                       PAGE_SIZE * folio_page_idx(fi->folio, bvec->bv_page);
        fi->_seg_count = bvec->bv_len;
        fi->length = min(folio_size(fi->folio) - fi->offset, fi->_seg_count);
        fi->_next = folio_next(fi->folio);