]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fuse: support large folios for stores
authorJoanne Koong <joannelkoong@gmail.com>
Mon, 12 May 2025 22:58:36 +0000 (15:58 -0700)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 29 May 2025 10:31:23 +0000 (12:31 +0200)
Add support for folios larger than one page size for stores.
Also change variable naming from "this_num" to "nr_bytes".

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

index b7d0a81c5df15c38f7960dd60ba7a9c03c4b905a..e80cd8f2c049f9abd584f35922e6c0aeffad2913 100644 (file)
@@ -1788,18 +1788,23 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
        num = outarg.size;
        while (num) {
                struct folio *folio;
-               unsigned int this_num;
+               unsigned int folio_offset;
+               unsigned int nr_bytes;
+               unsigned int nr_pages;
 
                folio = filemap_grab_folio(mapping, index);
                err = PTR_ERR(folio);
                if (IS_ERR(folio))
                        goto out_iput;
 
-               this_num = min_t(unsigned, num, folio_size(folio) - offset);
-               err = fuse_copy_folio(cs, &folio, offset, this_num, 0);
+               folio_offset = ((index - folio->index) << PAGE_SHIFT) + offset;
+               nr_bytes = min_t(unsigned, num, folio_size(folio) - folio_offset);
+               nr_pages = (offset + nr_bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+               err = fuse_copy_folio(cs, &folio, folio_offset, nr_bytes, 0);
                if (!folio_test_uptodate(folio) && !err && offset == 0 &&
-                   (this_num == folio_size(folio) || file_size == end)) {
-                       folio_zero_segment(folio, this_num, folio_size(folio));
+                   (nr_bytes == folio_size(folio) || file_size == end)) {
+                       folio_zero_segment(folio, nr_bytes, folio_size(folio));
                        folio_mark_uptodate(folio);
                }
                folio_unlock(folio);
@@ -1808,9 +1813,9 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
                if (err)
                        goto out_iput;
 
-               num -= this_num;
+               num -= nr_bytes;
                offset = 0;
-               index++;
+               index += nr_pages;
        }
 
        err = 0;