]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: refresh add_ra_bio_pages() to indicate it's using folios
authorQu Wenruo <wqu@suse.com>
Sun, 26 Apr 2026 07:51:04 +0000 (17:21 +0930)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Jun 2026 13:53:31 +0000 (15:53 +0200)
The function add_ra_bio_folios() has been utilizing folio interfaces
since c808c1dcb1b2 ("btrfs: convert add_ra_bio_pages() to use only
folios"), but we are still referring to "pages" inside the function name
and all comments.

Furthermore, such folio/page mixing can even be confusing, e.g. the
variable @page_end is very confusing as we're not really referring to
the end of the page, but the end of the folio, especially when we
already have large folio support.

Enhance that function by:

- Rename "page" to "folio" to avoid confusion

- Skip to the folio end if there is already a folio in the page cache
  The existing skip is:

   cur += folio_size(folio);

  This is incorrect if @cur is not folio size aligned, and can be
  common with large folio support.

  Thankfully this is not going to cause any real bugs, but at most will
  skip some blocks that can be added to readahead.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c

index ea3207273834eab7a2d2180678eee6dd310e158d..cce85eebf2beecd8fafdc58233c9cbbd8f0a3fc8 100644 (file)
@@ -355,18 +355,16 @@ struct compressed_bio *btrfs_alloc_compressed_write(struct btrfs_inode *inode,
 }
 
 /*
- * Add extra pages in the same compressed file extent so that we don't need to
+ * Add extra folios in the same compressed file extent so that we don't need to
  * re-read the same extent again and again.
  *
- * If in the same page, we have several non-contiguous blocks which are pointing
+ * If in the same folio, we have several non-contiguous blocks which are pointing
  * to the same on-disk compressed data, we will re-read the same extent many
- * times, as this function can only help cross page situations.
+ * times, as this function can only help cross folio situations.
  */
-static noinline int add_ra_bio_pages(struct inode *inode,
-                                    u64 compressed_end,
-                                    struct compressed_bio *cb,
-                                    int *memstall, unsigned long *pflags,
-                                    bool direct_reclaim)
+static noinline int add_ra_bio_folios(struct inode *inode, u64 compressed_end,
+                                     struct compressed_bio *cb, int *memstall,
+                                     unsigned long *pflags, bool direct_reclaim)
 {
        struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
        pgoff_t end_index;
@@ -403,7 +401,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,
        }
 
        while (cur < compressed_end) {
-               pgoff_t page_end;
+               u64 folio_end;
                pgoff_t pg_index = cur >> PAGE_SHIFT;
                gfp_t masked_constraint_gfp;
                u32 add_size;
@@ -444,8 +442,8 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                        break;
 
                if (filemap_add_folio(mapping, folio, pg_index, cache_gfp)) {
-                       /* There is already a folio, skip to folio end. */
-                       cur += folio_size(folio);
+                       /* There is already a folio, skip to the folio end. */
+                       cur += folio_size(folio) - offset_in_folio(folio, cur);
                        folio_put(folio);
                        continue;
                }
@@ -462,10 +460,10 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                        break;
                }
 
-               page_end = (pg_index << PAGE_SHIFT) + folio_size(folio) - 1;
-               btrfs_lock_extent(tree, cur, page_end, NULL);
+               folio_end = folio_next_pos(folio) - 1;
+               btrfs_lock_extent(tree, cur, folio_end, NULL);
                read_lock(&em_tree->lock);
-               em = btrfs_lookup_extent_mapping(em_tree, cur, page_end + 1 - cur);
+               em = btrfs_lookup_extent_mapping(em_tree, cur, folio_end + 1 - cur);
                read_unlock(&em_tree->lock);
 
                /*
@@ -478,14 +476,14 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                    (btrfs_extent_map_block_start(em) >> SECTOR_SHIFT) !=
                    orig_bio->bi_iter.bi_sector) {
                        btrfs_free_extent_map(em);
-                       btrfs_unlock_extent(tree, cur, page_end, NULL);
+                       btrfs_unlock_extent(tree, cur, folio_end, NULL);
                        folio_unlock(folio);
                        folio_put(folio);
                        break;
                }
-               add_size = min(btrfs_extent_map_end(em), page_end + 1) - cur;
+               add_size = min(btrfs_extent_map_end(em), folio_end + 1) - cur;
                btrfs_free_extent_map(em);
-               btrfs_unlock_extent(tree, cur, page_end, NULL);
+               btrfs_unlock_extent(tree, cur, folio_end, NULL);
 
                if (folio_contains(folio, end_index)) {
                        size_t zero_offset = offset_in_folio(folio, isize);
@@ -594,8 +592,8 @@ void btrfs_submit_compressed_read(struct btrfs_bio *bbio)
        }
        ASSERT(cb->bbio.bio.bi_iter.bi_size == compressed_len);
 
-       add_ra_bio_pages(&inode->vfs_inode, em_start + em_len, cb, &memstall,
-                        &pflags, !(bbio->bio.bi_opf & REQ_RAHEAD));
+       add_ra_bio_folios(&inode->vfs_inode, em_start + em_len, cb, &memstall,
+                         &pflags, !(bbio->bio.bi_opf & REQ_RAHEAD));
 
        cb->len = bbio->bio.bi_iter.bi_size;
        cb->bbio.bio.bi_iter.bi_sector = bbio->bio.bi_iter.bi_sector;