Revert "btrfs: fix the file offset calculation inside btrfs_decompress_buf2page()"

It seems that af566bdaff was tested against a tree which did not
contain commit 12851bd921 ("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 af566bdaff.

Fixes: af566bdaff (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>
This commit is contained in:
Matthew Wilcox (Oracle) 2026-05-22 19:14:07 +01:00 committed by Johannes Thumshirn
parent 814c3b4ea3
commit 0279bed34c

View File

@ -1170,22 +1170,6 @@ void __cold btrfs_exit_compress(void)
bioset_exit(&btrfs_compressed_bioset);
}
/*
* 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.
*
@ -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)