]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fuse: refactor fuse_fill_write_pages()
authorJoanne Koong <joannelkoong@gmail.com>
Mon, 12 May 2025 22:58:32 +0000 (15:58 -0700)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 29 May 2025 10:31:23 +0000 (12:31 +0200)
Refactor the logic in fuse_fill_write_pages() for copying out write
data. This will make the future change for supporting large folios for
writes easier. No functional changes.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Bernd Schubert <bschubert@ddn.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/file.c

index e203dd4fcc0f36549cb5a56ee9d6ffce5a4ca291..6b77daa2fbceb2b4186d17d5c4ae809d191c8977 100644 (file)
@@ -1132,21 +1132,21 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
        struct fuse_args_pages *ap = &ia->ap;
        struct fuse_conn *fc = get_fuse_conn(mapping->host);
        unsigned offset = pos & (PAGE_SIZE - 1);
-       unsigned int nr_pages = 0;
        size_t count = 0;
-       int err;
+       unsigned int num;
+       int err = 0;
+
+       num = min(iov_iter_count(ii), fc->max_write);
+       num = min(num, max_pages << PAGE_SHIFT);
 
        ap->args.in_pages = true;
        ap->descs[0].offset = offset;
 
-       do {
+       while (num) {
                size_t tmp;
                struct folio *folio;
                pgoff_t index = pos >> PAGE_SHIFT;
-               size_t bytes = min_t(size_t, PAGE_SIZE - offset,
-                                    iov_iter_count(ii));
-
-               bytes = min_t(size_t, bytes, fc->max_write - count);
+               unsigned bytes = min(PAGE_SIZE - offset, num);
 
  again:
                folio = __filemap_get_folio(mapping, index, FGP_WRITEBEGIN,
@@ -1178,14 +1178,13 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
                        goto again;
                }
 
-               err = 0;
                ap->folios[ap->num_folios] = folio;
                ap->descs[ap->num_folios].length = tmp;
                ap->num_folios++;
-               nr_pages++;
 
                count += tmp;
                pos += tmp;
+               num -= tmp;
                offset += tmp;
                if (offset == PAGE_SIZE)
                        offset = 0;
@@ -1200,10 +1199,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
                        ia->write.folio_locked = true;
                        break;
                }
-               if (!fc->big_writes)
+               if (!fc->big_writes || offset != 0)
                        break;
-       } while (iov_iter_count(ii) && count < fc->max_write &&
-                nr_pages < max_pages && offset == 0);
+       }
 
        return count > 0 ? count : err;
 }