fuse: move initialization of fuse_file to fuse_writepages() instead of in callback
authorJoanne Koong <joannelkoong@gmail.com>
Mon, 26 Aug 2024 21:19:05 +0000 (14:19 -0700)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 29 Aug 2024 09:43:12 +0000 (11:43 +0200)
Prior to this change, data->ff is checked and if not initialized then
initialized in the fuse_writepages_fill() callback, which gets called
for every dirty page in the address space mapping.

This logic is better placed in the main fuse_writepages() caller where
data.ff is initialized before walking the dirty pages.

No functional changes added.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/file.c

index e0bc552..9d4f8bd 100644 (file)
@@ -2263,13 +2263,6 @@ static int fuse_writepages_fill(struct folio *folio,
        struct page *tmp_page;
        int err;
 
-       if (!data->ff) {
-               err = -EIO;
-               data->ff = fuse_write_file_get(fi);
-               if (!data->ff)
-                       goto out_unlock;
-       }
-
        if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) {
                fuse_writepages_send(data);
                data->wpa = NULL;
@@ -2348,13 +2341,13 @@ static int fuse_writepages(struct address_space *mapping,
                           struct writeback_control *wbc)
 {
        struct inode *inode = mapping->host;
+       struct fuse_inode *fi = get_fuse_inode(inode);
        struct fuse_conn *fc = get_fuse_conn(inode);
        struct fuse_fill_wb_data data;
        int err;
 
-       err = -EIO;
        if (fuse_is_bad(inode))
-               goto out;
+               return -EIO;
 
        if (wbc->sync_mode == WB_SYNC_NONE &&
            fc->num_background >= fc->congestion_threshold)
@@ -2362,7 +2355,9 @@ static int fuse_writepages(struct address_space *mapping,
 
        data.inode = inode;
        data.wpa = NULL;
-       data.ff = NULL;
+       data.ff = fuse_write_file_get(fi);
+       if (!data.ff)
+               return -EIO;
 
        err = -ENOMEM;
        data.orig_pages = kcalloc(fc->max_pages,
@@ -2376,11 +2371,10 @@ static int fuse_writepages(struct address_space *mapping,
                WARN_ON(!data.wpa->ia.ap.num_pages);
                fuse_writepages_send(&data);
        }
-       if (data.ff)
-               fuse_file_put(data.ff, false);
 
        kfree(data.orig_pages);
 out:
+       fuse_file_put(data.ff, false);
        return err;
 }