]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: convert io_ctl_prepare_pages() to work on folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 21 Jan 2025 05:40:52 +0000 (05:40 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 17 Mar 2025 13:44:43 +0000 (14:44 +0100)
Retrieve folios instead of pages and work on them throughout.  Removes
a few calls to compound_head() and a reference to page->mapping.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/free-space-cache.c

index d42b6f882f57419c7ecaddd51ed096f2cb1599f4..7054b4c88f99425595079942973abcada003f535 100644 (file)
@@ -447,7 +447,7 @@ static void io_ctl_drop_pages(struct btrfs_io_ctl *io_ctl)
 
 static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate)
 {
-       struct page *page;
+       struct folio *folio;
        struct inode *inode = io_ctl->inode;
        gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
        int i;
@@ -455,31 +455,33 @@ static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate)
        for (i = 0; i < io_ctl->num_pages; i++) {
                int ret;
 
-               page = find_or_create_page(inode->i_mapping, i, mask);
-               if (!page) {
+               folio = __filemap_get_folio(inode->i_mapping, i,
+                                           FGP_LOCK | FGP_ACCESSED | FGP_CREAT,
+                                           mask);
+               if (IS_ERR(folio)) {
                        io_ctl_drop_pages(io_ctl);
                        return -ENOMEM;
                }
 
-               ret = set_folio_extent_mapped(page_folio(page));
+               ret = set_folio_extent_mapped(folio);
                if (ret < 0) {
-                       unlock_page(page);
-                       put_page(page);
+                       folio_unlock(folio);
+                       folio_put(folio);
                        io_ctl_drop_pages(io_ctl);
                        return ret;
                }
 
-               io_ctl->pages[i] = page;
-               if (uptodate && !PageUptodate(page)) {
-                       btrfs_read_folio(NULL, page_folio(page));
-                       lock_page(page);
-                       if (page->mapping != inode->i_mapping) {
+               io_ctl->pages[i] = &folio->page;
+               if (uptodate && !folio_test_uptodate(folio)) {
+                       btrfs_read_folio(NULL, folio);
+                       folio_lock(folio);
+                       if (folio->mapping != inode->i_mapping) {
                                btrfs_err(BTRFS_I(inode)->root->fs_info,
                                          "free space cache page truncated");
                                io_ctl_drop_pages(io_ctl);
                                return -EIO;
                        }
-                       if (!PageUptodate(page)) {
+                       if (!folio_test_uptodate(folio)) {
                                btrfs_err(BTRFS_I(inode)->root->fs_info,
                                           "error reading free space cache");
                                io_ctl_drop_pages(io_ctl);