On Mon, Apr 25, 2022 at 08:21:39PM +0800, Jeffle Xu wrote:
> Implement the data plane of reading metadata from primary data blob
> over fscache.
> 
> Signed-off-by: Jeffle Xu <jeffl...@linux.alibaba.com>

Reviewed-by: Gao Xiang <hsiang...@linux.alibaba.com>

Thanks,
Gao Xiang

> ---
>  fs/erofs/data.c    | 19 +++++++++++++++----
>  fs/erofs/fscache.c | 25 +++++++++++++++++++++++++
>  2 files changed, 40 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/erofs/data.c b/fs/erofs/data.c
> index 14b64d960541..bb9c1fd48c19 100644
> --- a/fs/erofs/data.c
> +++ b/fs/erofs/data.c
> @@ -6,6 +6,7 @@
>   */
>  #include "internal.h"
>  #include <linux/prefetch.h>
> +#include <linux/sched/mm.h>
>  #include <linux/dax.h>
>  #include <trace/events/erofs.h>
>  
> @@ -35,14 +36,20 @@ void *erofs_bread(struct erofs_buf *buf, struct inode 
> *inode,
>       erofs_off_t offset = blknr_to_addr(blkaddr);
>       pgoff_t index = offset >> PAGE_SHIFT;
>       struct page *page = buf->page;
> +     struct folio *folio;
> +     unsigned int nofs_flag;
>  
>       if (!page || page->index != index) {
>               erofs_put_metabuf(buf);
> -             page = read_cache_page_gfp(mapping, index,
> -                             mapping_gfp_constraint(mapping, ~__GFP_FS));
> -             if (IS_ERR(page))
> -                     return page;
> +
> +             nofs_flag = memalloc_nofs_save();
> +             folio = read_cache_folio(mapping, index, NULL, NULL);
> +             memalloc_nofs_restore(nofs_flag);
> +             if (IS_ERR(folio))
> +                     return folio;
> +
>               /* should already be PageUptodate, no need to lock page */
> +             page = folio_file_page(folio, index);
>               buf->page = page;
>       }
>       if (buf->kmap_type == EROFS_NO_KMAP) {
> @@ -63,6 +70,10 @@ void *erofs_bread(struct erofs_buf *buf, struct inode 
> *inode,
>  void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb,
>                        erofs_blk_t blkaddr, enum erofs_kmap_type type)
>  {
> +     if (erofs_is_fscache_mode(sb))
> +             return erofs_bread(buf, EROFS_SB(sb)->s_fscache->inode,
> +                                blkaddr, type);
> +
>       return erofs_bread(buf, sb->s_bdev->bd_inode, blkaddr, type);
>  }
>  
> diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
> index ac02af8cce3e..23d7e862eed8 100644
> --- a/fs/erofs/fscache.c
> +++ b/fs/erofs/fscache.c
> @@ -59,7 +59,32 @@ static int erofs_fscache_read_folios(struct fscache_cookie 
> *cookie,
>       return ret;
>  }
>  
> +static int erofs_fscache_meta_readpage(struct file *data, struct page *page)
> +{
> +     int ret;
> +     struct folio *folio = page_folio(page);
> +     struct super_block *sb = folio_mapping(folio)->host->i_sb;
> +     struct erofs_map_dev mdev = {
> +             .m_deviceid = 0,
> +             .m_pa = folio_pos(folio),
> +     };
> +
> +     ret = erofs_map_dev(sb, &mdev);
> +     if (ret)
> +             goto out;
> +
> +     ret = erofs_fscache_read_folios(mdev.m_fscache->cookie,
> +                     folio_mapping(folio), folio_pos(folio),
> +                     folio_size(folio), mdev.m_pa);
> +     if (!ret)
> +             folio_mark_uptodate(folio);
> +out:
> +     folio_unlock(folio);
> +     return ret;
> +}
> +
>  static const struct address_space_operations erofs_fscache_meta_aops = {
> +     .readpage = erofs_fscache_meta_readpage,
>  };
>  
>  int erofs_fscache_register_cookie(struct super_block *sb,
> -- 
> 2.27.0

--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://listman.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to