fuse: convert fuse_notify_store to use folios
authorJosef Bacik <josef@toxicpanda.com>
Mon, 30 Sep 2024 13:45:18 +0000 (09:45 -0400)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 25 Oct 2024 15:05:50 +0000 (17:05 +0200)
This function creates pages in an inode and copies data into them,
update the function to use a folio instead of a page, and use the
appropriate folio helpers.

[SzM: use filemap_grab_folio()]

[Hau Tao: The third argument of folio_zero_range() should be the length to
be zeroed, not the total length. Fix it by using folio_zero_segment()
instead in fuse_notify_store()]

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

index a332cb7..e258040 100644 (file)
@@ -1654,24 +1654,25 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
 
        num = outarg.size;
        while (num) {
+               struct folio *folio;
                struct page *page;
                unsigned int this_num;
 
-               err = -ENOMEM;
-               page = find_or_create_page(mapping, index,
-                                          mapping_gfp_mask(mapping));
-               if (!page)
+               folio = filemap_grab_folio(mapping, index);
+               err = PTR_ERR(folio);
+               if (IS_ERR(folio))
                        goto out_iput;
 
-               this_num = min_t(unsigned, num, PAGE_SIZE - offset);
+               page = &folio->page;
+               this_num = min_t(unsigned, num, folio_size(folio) - offset);
                err = fuse_copy_page(cs, &page, offset, this_num, 0);
-               if (!PageUptodate(page) && !err && offset == 0 &&
-                   (this_num == PAGE_SIZE || file_size == end)) {
-                       zero_user_segment(page, this_num, PAGE_SIZE);
-                       SetPageUptodate(page);
+               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));
+                       folio_mark_uptodate(folio);
                }
-               unlock_page(page);
-               put_page(page);
+               folio_unlock(folio);
+               folio_put(folio);
 
                if (err)
                        goto out_iput;