Message ID | 17ca5aafb5c9591d28553c8af42551c8bc23a9ef.1727703714.git.josef@toxicpanda.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | fuse: folio conversions | expand |
On Mon, Sep 30, 2024 at 6:46 AM Josef Bacik <josef@toxicpanda.com> wrote: > > Now that the buffered write path is using folios, convert > fuse_do_readpage() to take a folio instead of a page, update it to use > the appropriate folio helpers, and update the callers to pass in the > folio directly instead of a page. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Joanne Koong <joannelkoong@gmail.com> > --- > fs/fuse/file.c | 26 +++++++++++++------------- > 1 file changed, 13 insertions(+), 13 deletions(-) > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > index 2af9ec67a8e7..45667c40de7a 100644 > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -858,12 +858,13 @@ static void fuse_short_read(struct inode *inode, u64 attr_ver, size_t num_read, > } > } > > -static int fuse_do_readpage(struct file *file, struct page *page) > +static int fuse_do_readfolio(struct file *file, struct folio *folio) > { > - struct inode *inode = page->mapping->host; > + struct inode *inode = folio->mapping->host; > struct fuse_mount *fm = get_fuse_mount(inode); > - loff_t pos = page_offset(page); > + loff_t pos = folio_pos(folio); > struct fuse_page_desc desc = { .length = PAGE_SIZE }; > + struct page *page = &folio->page; > struct fuse_io_args ia = { > .ap.args.page_zeroing = true, > .ap.args.out_pages = true, > @@ -875,11 +876,11 @@ static int fuse_do_readpage(struct file *file, struct page *page) > u64 attr_ver; > > /* > - * Page writeback can extend beyond the lifetime of the > - * page-cache page, so make sure we read a properly synced > - * page. > + * With the temporary pages that are used to complete writeback, we can > + * have writeback that extends beyond the lifetime of the folio. So > + * make sure we read a properly synced folio. > */ > - fuse_wait_on_page_writeback(inode, page->index); > + fuse_wait_on_folio_writeback(inode, folio); > > attr_ver = fuse_get_attr_version(fm->fc); > > @@ -897,25 +898,24 @@ static int fuse_do_readpage(struct file *file, struct page *page) > if (res < desc.length) > fuse_short_read(inode, attr_ver, res, &ia.ap); > > - SetPageUptodate(page); > + folio_mark_uptodate(folio); > > return 0; > } > > static int fuse_read_folio(struct file *file, struct folio *folio) > { > - struct page *page = &folio->page; > - struct inode *inode = page->mapping->host; > + struct inode *inode = folio->mapping->host; > int err; > > err = -EIO; > if (fuse_is_bad(inode)) > goto out; > > - err = fuse_do_readpage(file, page); > + err = fuse_do_readfolio(file, folio); > fuse_invalidate_atime(inode); > out: > - unlock_page(page); > + folio_unlock(folio); > return err; > } > > @@ -2444,7 +2444,7 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping, > folio_zero_segment(folio, 0, off); > goto success; > } > - err = fuse_do_readpage(file, &folio->page); > + err = fuse_do_readfolio(file, folio); I'm on top of Miklos' for-next tree but I'm seeing this patch unable to apply cleanly. On the top of the tree, I see the original line as: err = fuse_do_readpage(file, page); Is there another patch/patchset this stack is based on top of? Thanks, Joanne > if (err) > goto cleanup; > success: > -- > 2.43.0 > >
On Tue, Oct 01, 2024 at 09:54:51AM -0700, Joanne Koong wrote: > On Mon, Sep 30, 2024 at 6:46 AM Josef Bacik <josef@toxicpanda.com> wrote: > > > > Now that the buffered write path is using folios, convert > > fuse_do_readpage() to take a folio instead of a page, update it to use > > the appropriate folio helpers, and update the callers to pass in the > > folio directly instead of a page. > > > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> > > Reviewed-by: Joanne Koong <joannelkoong@gmail.com> > > > --- > > fs/fuse/file.c | 26 +++++++++++++------------- > > 1 file changed, 13 insertions(+), 13 deletions(-) > > > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > > index 2af9ec67a8e7..45667c40de7a 100644 > > --- a/fs/fuse/file.c > > +++ b/fs/fuse/file.c > > @@ -858,12 +858,13 @@ static void fuse_short_read(struct inode *inode, u64 attr_ver, size_t num_read, > > } > > } > > > > -static int fuse_do_readpage(struct file *file, struct page *page) > > +static int fuse_do_readfolio(struct file *file, struct folio *folio) > > { > > - struct inode *inode = page->mapping->host; > > + struct inode *inode = folio->mapping->host; > > struct fuse_mount *fm = get_fuse_mount(inode); > > - loff_t pos = page_offset(page); > > + loff_t pos = folio_pos(folio); > > struct fuse_page_desc desc = { .length = PAGE_SIZE }; > > + struct page *page = &folio->page; > > struct fuse_io_args ia = { > > .ap.args.page_zeroing = true, > > .ap.args.out_pages = true, > > @@ -875,11 +876,11 @@ static int fuse_do_readpage(struct file *file, struct page *page) > > u64 attr_ver; > > > > /* > > - * Page writeback can extend beyond the lifetime of the > > - * page-cache page, so make sure we read a properly synced > > - * page. > > + * With the temporary pages that are used to complete writeback, we can > > + * have writeback that extends beyond the lifetime of the folio. So > > + * make sure we read a properly synced folio. > > */ > > - fuse_wait_on_page_writeback(inode, page->index); > > + fuse_wait_on_folio_writeback(inode, folio); > > > > attr_ver = fuse_get_attr_version(fm->fc); > > > > @@ -897,25 +898,24 @@ static int fuse_do_readpage(struct file *file, struct page *page) > > if (res < desc.length) > > fuse_short_read(inode, attr_ver, res, &ia.ap); > > > > - SetPageUptodate(page); > > + folio_mark_uptodate(folio); > > > > return 0; > > } > > > > static int fuse_read_folio(struct file *file, struct folio *folio) > > { > > - struct page *page = &folio->page; > > - struct inode *inode = page->mapping->host; > > + struct inode *inode = folio->mapping->host; > > int err; > > > > err = -EIO; > > if (fuse_is_bad(inode)) > > goto out; > > > > - err = fuse_do_readpage(file, page); > > + err = fuse_do_readfolio(file, folio); > > fuse_invalidate_atime(inode); > > out: > > - unlock_page(page); > > + folio_unlock(folio); > > return err; > > } > > > > @@ -2444,7 +2444,7 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping, > > folio_zero_segment(folio, 0, off); > > goto success; > > } > > - err = fuse_do_readpage(file, &folio->page); > > + err = fuse_do_readfolio(file, folio); > > I'm on top of Miklos' for-next tree but I'm seeing this patch unable > to apply cleanly. On the top of the tree, I see the original line as: > > err = fuse_do_readpage(file, page); > > Is there another patch/patchset this stack is based on top of? Yeah Willy had a folio conversion that's in Linus's tree but is newer than Miklos's base for his tree. Thanks, Josef
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2af9ec67a8e7..45667c40de7a 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -858,12 +858,13 @@ static void fuse_short_read(struct inode *inode, u64 attr_ver, size_t num_read, } } -static int fuse_do_readpage(struct file *file, struct page *page) +static int fuse_do_readfolio(struct file *file, struct folio *folio) { - struct inode *inode = page->mapping->host; + struct inode *inode = folio->mapping->host; struct fuse_mount *fm = get_fuse_mount(inode); - loff_t pos = page_offset(page); + loff_t pos = folio_pos(folio); struct fuse_page_desc desc = { .length = PAGE_SIZE }; + struct page *page = &folio->page; struct fuse_io_args ia = { .ap.args.page_zeroing = true, .ap.args.out_pages = true, @@ -875,11 +876,11 @@ static int fuse_do_readpage(struct file *file, struct page *page) u64 attr_ver; /* - * Page writeback can extend beyond the lifetime of the - * page-cache page, so make sure we read a properly synced - * page. + * With the temporary pages that are used to complete writeback, we can + * have writeback that extends beyond the lifetime of the folio. So + * make sure we read a properly synced folio. */ - fuse_wait_on_page_writeback(inode, page->index); + fuse_wait_on_folio_writeback(inode, folio); attr_ver = fuse_get_attr_version(fm->fc); @@ -897,25 +898,24 @@ static int fuse_do_readpage(struct file *file, struct page *page) if (res < desc.length) fuse_short_read(inode, attr_ver, res, &ia.ap); - SetPageUptodate(page); + folio_mark_uptodate(folio); return 0; } static int fuse_read_folio(struct file *file, struct folio *folio) { - struct page *page = &folio->page; - struct inode *inode = page->mapping->host; + struct inode *inode = folio->mapping->host; int err; err = -EIO; if (fuse_is_bad(inode)) goto out; - err = fuse_do_readpage(file, page); + err = fuse_do_readfolio(file, folio); fuse_invalidate_atime(inode); out: - unlock_page(page); + folio_unlock(folio); return err; } @@ -2444,7 +2444,7 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping, folio_zero_segment(folio, 0, off); goto success; } - err = fuse_do_readpage(file, &folio->page); + err = fuse_do_readfolio(file, folio); if (err) goto cleanup; success:
Now that the buffered write path is using folios, convert fuse_do_readpage() to take a folio instead of a page, update it to use the appropriate folio helpers, and update the callers to pass in the folio directly instead of a page. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/fuse/file.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)