]> git.ipfire.org Git - thirdparty/linux.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)
committerDavid Sterba <dsterba@suse.com>
Fri, 7 Feb 2025 19:51:18 +0000 (20:51 +0100)
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>
fs/btrfs/extent_io.c

index d9f856358704f4f8476aa897f69b768b29e993a6..6f64ee16744d674fc2b7c69acb668e7f5cbc34ca 100644 (file)
@@ -523,8 +523,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,
@@ -552,7 +550,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
@@ -561,9 +558,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 -
@@ -956,7 +955,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) {