aboutsummaryrefslogtreecommitdiffstats
diff options
authorMatthew Wilcox (Oracle) <willy@infradead.org>2026-05-22 19:14:07 +0100
committerDavid Sterba <dsterba@suse.com>2026-05-26 16:35:03 +0200
commitd092d1ee5c3d253daeaa3211769cb0d32187d487 (patch)
treea3199a45c85b462d0674f73e7560cdad74d362ba
parentcc8e2453c5f0ce218566ed095de5b7fec8870752 (diff)
downloadlinux-next-history-d092d1ee5c3d253daeaa3211769cb0d32187d487.tar.gz
Revert "btrfs: fix the file offset calculation inside btrfs_decompress_buf2page()"
It seems that af566bdaff54 was tested against a tree which did not contain commit 12851bd921d4 ("fs: Turn page_offset() into a wrapper around folio_pos()). Unfortunately it has a bug of its own; on 32-bit systems, shifting by PAGE_SHIFT will overflow on files larger than 4GiB. Since page_offset() is now fixed, just revert af566bdaff54. Fixes: af566bdaff54 (btrfs: fix the file offset calculation inside btrfs_decompress_buf2page()) Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Boris Burkov <boris@bur.io> Tested-by: Boris Burkov <boris@bur.io> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/compression.c18
1 files changed, 1 insertions, 17 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index cce85eebf2bee..ffb6b52863a78 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -1171,22 +1171,6 @@ void __cold btrfs_exit_compress(void)
}
/*
- * The bvec is a single page bvec from a bio that contains folios from a filemap.
- *
- * Since the folio may be a large one, and if the bv_page is not a head page of
- * a large folio, then page->index is unreliable.
- *
- * Thus we need this helper to grab the proper file offset.
- */
-static u64 file_offset_from_bvec(const struct bio_vec *bvec)
-{
- const struct page *page = bvec->bv_page;
- const struct folio *folio = page_folio(page);
-
- return (page_pgoff(folio, page) << PAGE_SHIFT) + bvec->bv_offset;
-}
-
-/*
* Copy decompressed data from working buffer to pages.
*
* @buf: The decompressed data buffer
@@ -1238,7 +1222,7 @@ int btrfs_decompress_buf2page(const char *buf, u32 buf_len,
* cb->start may underflow, but subtracting that value can still
* give us correct offset inside the full decompressed extent.
*/
- bvec_offset = file_offset_from_bvec(&bvec) - cb->start;
+ bvec_offset = page_offset(bvec.bv_page) + bvec.bv_offset - cb->start;
/* Haven't reached the bvec range, exit */
if (decompressed + buf_len <= bvec_offset)