]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fuse: use iomap for folio laundering
authorJoanne Koong <joannelkoong@gmail.com>
Tue, 15 Jul 2025 20:21:20 +0000 (13:21 -0700)
committerChristian Brauner <brauner@kernel.org>
Thu, 17 Jul 2025 07:55:18 +0000 (09:55 +0200)
Use iomap for folio laundering, which will do granular dirty
writeback when laundering a large folio.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Link: https://lore.kernel.org/20250715202122.2282532-4-joannelkoong@gmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fuse/file.c

index 3955eb7175a2c52fe34ccd4318151000f1448693..a4ef19ad71995ab186d713b5222fe6a713de4fd9 100644 (file)
@@ -2058,45 +2058,6 @@ static struct fuse_writepage_args *fuse_writepage_args_setup(struct folio *folio
        return wpa;
 }
 
-static int fuse_writepage_locked(struct folio *folio)
-{
-       struct address_space *mapping = folio->mapping;
-       struct inode *inode = mapping->host;
-       struct fuse_inode *fi = get_fuse_inode(inode);
-       struct fuse_writepage_args *wpa;
-       struct fuse_args_pages *ap;
-       struct fuse_file *ff;
-       int error = -EIO;
-
-       ff = fuse_write_file_get(fi);
-       if (!ff)
-               goto err;
-
-       wpa = fuse_writepage_args_setup(folio, 0, ff);
-       error = -ENOMEM;
-       if (!wpa)
-               goto err_writepage_args;
-
-       ap = &wpa->ia.ap;
-       ap->num_folios = 1;
-
-       folio_start_writeback(folio);
-       fuse_writepage_args_page_fill(wpa, folio, 0, 0, folio_size(folio));
-
-       spin_lock(&fi->lock);
-       list_add_tail(&wpa->queue_entry, &fi->queued_writes);
-       fuse_flush_writepages(inode);
-       spin_unlock(&fi->lock);
-
-       return 0;
-
-err_writepage_args:
-       fuse_file_put(ff, false);
-err:
-       mapping_set_error(folio->mapping, error);
-       return error;
-}
-
 struct fuse_fill_wb_data {
        struct fuse_writepage_args *wpa;
        struct fuse_file *ff;
@@ -2282,8 +2243,19 @@ static int fuse_writepages(struct address_space *mapping,
 static int fuse_launder_folio(struct folio *folio)
 {
        int err = 0;
+       struct fuse_fill_wb_data data = {
+               .inode = folio->mapping->host,
+       };
+       struct iomap_writepage_ctx wpc = {
+               .inode = folio->mapping->host,
+               .iomap.type = IOMAP_MAPPED,
+               .ops = &fuse_writeback_ops,
+               .wb_ctx = &data,
+       };
+
        if (folio_clear_dirty_for_io(folio)) {
-               err = fuse_writepage_locked(folio);
+               err = iomap_writeback_folio(&wpc, folio);
+               err = fuse_iomap_writeback_submit(&wpc, err);
                if (!err)
                        folio_wait_writeback(folio);
        }