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?

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