On 04/27, Chao Yu wrote:
> On 4/1/25 04:10, Matthew Wilcox (Oracle) wrote:
> > Support arbitrary size folios and remove a few hidden calls to
> > compound_head().  Also remove an unnecessary test of the uptodaate flag;
> > if mapping_read_folio_gfp() cannot bring the folio uptodate, it will
> > return an error.
> > 
> > Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
> > ---
> >  fs/f2fs/super.c | 36 ++++++++++++++++--------------------
> >  1 file changed, 16 insertions(+), 20 deletions(-)
> > 
> > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > index f087b2b71c89..fd93581bee89 100644
> > --- a/fs/f2fs/super.c
> > +++ b/fs/f2fs/super.c
> > @@ -2689,12 +2689,9 @@ static ssize_t f2fs_quota_read(struct super_block 
> > *sb, int type, char *data,
> >  {
> >     struct inode *inode = sb_dqopt(sb)->files[type];
> >     struct address_space *mapping = inode->i_mapping;
> > -   block_t blkidx = F2FS_BYTES_TO_BLK(off);
> > -   int offset = off & (sb->s_blocksize - 1);
> >     int tocopy;
> >     size_t toread;
> >     loff_t i_size = i_size_read(inode);
> > -   struct page *page;
> >  
> >     if (off > i_size)
> >             return 0;
> > @@ -2703,37 +2700,36 @@ static ssize_t f2fs_quota_read(struct super_block 
> > *sb, int type, char *data,
> >             len = i_size - off;
> >     toread = len;
> >     while (toread > 0) {
> > -           tocopy = min_t(unsigned long, sb->s_blocksize - offset, toread);
> > +           struct folio *folio;
> > +           size_t offset;
> > +
> >  repeat:
> > -           page = read_cache_page_gfp(mapping, blkidx, GFP_NOFS);
> > -           if (IS_ERR(page)) {
> > -                   if (PTR_ERR(page) == -ENOMEM) {
> > +           folio = mapping_read_folio_gfp(mapping, off >> PAGE_SHIFT,
> > +                           GFP_NOFS);
> > +           if (IS_ERR(folio)) {
> > +                   if (PTR_ERR(folio) == -ENOMEM) {
> >                             memalloc_retry_wait(GFP_NOFS);
> >                             goto repeat;
> >                     }
> >                     set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
> > -                   return PTR_ERR(page);
> > +                   return PTR_ERR(folio);
> >             }
> > +           offset = offset_in_folio(folio, off);
> > +           tocopy = min(folio_size(folio) - offset, toread);
> >  
> > -           lock_page(page);
> > +           folio_lock(folio);
> >  
> > -           if (unlikely(page->mapping != mapping)) {
> > -                   f2fs_put_page(page, 1);
> > +           if (unlikely(folio->mapping != mapping)) {
> > +                   f2fs_folio_put(folio, true);
> >                     goto repeat;
> >             }
> > -           if (unlikely(!PageUptodate(page))) {
> 
> How about adding f2fs_bug_on(, !folio_test_uptodate(folio)) here to detect
> any potential bug?

It seems we can add f2fs_bug_on() separately.

> 
> Thanks,
> 
> > -                   f2fs_put_page(page, 1);
> > -                   set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
> > -                   return -EIO;
> > -           }
> >  
> > -           memcpy_from_page(data, page, offset, tocopy);
> > -           f2fs_put_page(page, 1);
> > +           memcpy_from_folio(data, folio, offset, tocopy);
> > +           f2fs_folio_put(folio, true);
> >  
> > -           offset = 0;
> >             toread -= tocopy;
> >             data += tocopy;
> > -           blkidx++;
> > +           off += tocopy;
> >     }
> >     return len;
> >  }


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to