On Fri, Aug 23, 2024 at 12:03 PM Josef Bacik <josef@xxxxxxxxxxxxxx> wrote: > > On Fri, Aug 23, 2024 at 09:27:27AM -0700, Joanne Koong wrote: > > To pave the way for refactoring out the shared logic in > > fuse_writepages_fill() and fuse_writepage_locked(), this change converts > > the temporary page in fuse_writepages_fill() to use the folio API. > > > > This is similar to the change in e0887e095a80 ("fuse: Convert > > fuse_writepage_locked to take a folio"), which converted the tmp page in > > fuse_writepage_locked() to use the folio API. > > > > inc_node_page_state() is intentionally preserved here instead of > > converting to node_stat_add_folio() since it is updating the stat of the > > underlying page and to better maintain API symmetry with > > dec_node_page_stat() in fuse_writepage_finish_stat(). > > > > No functional changes added. > > > > Signed-off-by: Joanne Koong <joannelkoong@xxxxxxxxx> > > --- > > fs/fuse/file.c | 14 +++++++------- > > 1 file changed, 7 insertions(+), 7 deletions(-) > > > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > > index a51b0b085616..905b202a7acd 100644 > > --- a/fs/fuse/file.c > > +++ b/fs/fuse/file.c > > @@ -2260,7 +2260,7 @@ static int fuse_writepages_fill(struct folio *folio, > > struct inode *inode = data->inode; > > struct fuse_inode *fi = get_fuse_inode(inode); > > struct fuse_conn *fc = get_fuse_conn(inode); > > - struct page *tmp_page; > > + struct folio *tmp_folio; > > int err; > > > > if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) { > > @@ -2269,8 +2269,8 @@ static int fuse_writepages_fill(struct folio *folio, > > } > > > > err = -ENOMEM; > > - tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM); > > - if (!tmp_page) > > + tmp_folio = folio_alloc(GFP_NOFS | __GFP_HIGHMEM, 0); > > + if (!tmp_folio) > > goto out_unlock; > > > > /* > > @@ -2290,7 +2290,7 @@ static int fuse_writepages_fill(struct folio *folio, > > err = -ENOMEM; > > wpa = fuse_writepage_args_alloc(); > > if (!wpa) { > > - __free_page(tmp_page); > > + folio_put(tmp_folio); > > goto out_unlock; > > } > > fuse_writepage_add_to_bucket(fc, wpa); > > @@ -2308,14 +2308,14 @@ static int fuse_writepages_fill(struct folio *folio, > > } > > folio_start_writeback(folio); > > > > - copy_highpage(tmp_page, &folio->page); > > - ap->pages[ap->num_pages] = tmp_page; > > + folio_copy(tmp_folio, folio); > > + ap->pages[ap->num_pages] = &tmp_folio->page; > > ap->descs[ap->num_pages].offset = 0; > > ap->descs[ap->num_pages].length = PAGE_SIZE; > > data->orig_pages[ap->num_pages] = &folio->page; > > > > inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); > > - inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP); > > + inc_node_page_state(&tmp_folio->page, NR_WRITEBACK_TEMP); > > I *think* you can use > > node_stat_add_folio(tmp_folio, NR_WRITEBACK_TEMP); > > here instead of inc_node_page_state(). Thanks, I was thinking inc_node_page_state() here would be better for preserving the API symmetry with the dec_node_page_state() function that gets called when the writeback gets finished (in fuse_writepage_finish_stat) - I don't think it's immediately obvious that node_stat_add_folio() and dec_node_page_state() are inverses of each other. I don't feel strongly about this though, so i'm happy to change this to node_stat_add_folio as well. Thanks, Joanne > > Josef