]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix two misuses of folio_shift()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 21 Jan 2025 05:40:51 +0000 (05:40 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Mar 2025 19:54:16 +0000 (12:54 -0700)
[ Upstream commit 01af106a076352182b2916b143fc50272600bd81 ]

It is meaningless to shift a byte count by folio_shift().  The folio index
is in units of PAGE_SIZE, not folio_size().  We can use folio_contains()
to make this work for arbitrary-order folios, so remove the assertion
that the folios are of order 0.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/extent_io.c

index 660a5b9c08e9e41796bc7073535ec26066f83f40..6551fb003eed250902edb9e998dec3215ee22606 100644 (file)
@@ -526,8 +526,6 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
                u64 end;
                u32 len;
 
-               /* For now only order 0 folios are supported for data. */
-               ASSERT(folio_order(folio) == 0);
                btrfs_debug(fs_info,
                        "%s: bi_sector=%llu, err=%d, mirror=%u",
                        __func__, bio->bi_iter.bi_sector, bio->bi_status,
@@ -555,7 +553,6 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
 
                if (likely(uptodate)) {
                        loff_t i_size = i_size_read(inode);
-                       pgoff_t end_index = i_size >> folio_shift(folio);
 
                        /*
                         * Zero out the remaining part if this range straddles
@@ -564,9 +561,11 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
                         * Here we should only zero the range inside the folio,
                         * not touch anything else.
                         *
-                        * NOTE: i_size is exclusive while end is inclusive.
+                        * NOTE: i_size is exclusive while end is inclusive and
+                        * folio_contains() takes PAGE_SIZE units.
                         */
-                       if (folio_index(folio) == end_index && i_size <= end) {
+                       if (folio_contains(folio, i_size >> PAGE_SHIFT) &&
+                           i_size <= end) {
                                u32 zero_start = max(offset_in_folio(folio, i_size),
                                                     offset_in_folio(folio, start));
                                u32 zero_len = offset_in_folio(folio, end) + 1 -
@@ -960,7 +959,7 @@ static int btrfs_do_readpage(struct folio *folio, struct extent_map **em_cached,
                return ret;
        }
 
-       if (folio->index == last_byte >> folio_shift(folio)) {
+       if (folio_contains(folio, last_byte >> PAGE_SHIFT)) {
                size_t zero_offset = offset_in_folio(folio, last_byte);
 
                if (zero_offset) {