[PATCH RFC 3/4] erofs: apply the page cache share feature

Gao Xiang hsiangkao at linux.alibaba.com
Sat Jul 5 06:45:57 AEST 2025


Hi Christian,

On 2025/7/3 20:23, Christian Brauner wrote:
> From: Hongzhen Luo <hongzhen at linux.alibaba.com>
> 
> This modifies relevant functions to apply the page cache
> share feature.
> 
> Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
> Link: https://lore.kernel.org/20240902110620.2202586-4-hongzhen@linux.alibaba.com
> Signed-off-by: Christian Brauner <brauner at kernel.org>
> ---
>   fs/erofs/data.c  | 33 +++++++++++++++++++++++++++++++++
>   fs/erofs/inode.c | 15 ++++++++++++++-
>   fs/erofs/super.c | 29 +++++++++++++++++++++++++++++
>   fs/erofs/zdata.c | 32 ++++++++++++++++++++++++++++++++
>   4 files changed, 108 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/erofs/data.c b/fs/erofs/data.c
> index 6a329c329f43..fb54162f4c54 100644
> --- a/fs/erofs/data.c
> +++ b/fs/erofs/data.c
> @@ -351,12 +351,45 @@ int erofs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
>    */
>   static int erofs_read_folio(struct file *file, struct folio *folio)
>   {
> +#ifdef CONFIG_EROFS_FS_PAGE_CACHE_SHARE
> +	struct erofs_inode *vi = NULL;
> +	int ret;
> +
> +	if (file && file->private_data) {
> +		vi = file->private_data;
> +		if (vi->ano_inode == file_inode(file))
> +			folio->mapping->host = &vi->vfs_inode;

This is one of the parts I asked Hongzhen to refactor
because it simply doesn't work.

The background is that:
  - since the folio is from the anon_inode mapping now,
    so .iomap_begin() will use the anon inode rather
    than a real inode in a sb, which causes iomap
    don't find the real data source to read;

  - Hongzhen just switch `folio->mapping->host` but it's
    just broken.  Also `file` here can be NULL if the
    request is a kernel-internal request, so we'd better
    not rely on `file` argument.

  - My suggestion was that maintain a inode list so that
    erofs_iomap_begin() can find any valid sb inode to
    find data source instead.

> +		else
> +			vi = NULL;
> +	}
> +	ret = iomap_read_folio(folio, &erofs_iomap_ops);
> +	if (vi)
> +		folio->mapping->host = file_inode(file);

here.

> +	return ret;
> +#else
>   	return iomap_read_folio(folio, &erofs_iomap_ops);
> +#endif
>   }
>   
>   static void erofs_readahead(struct readahead_control *rac)
>   {
> +#ifdef CONFIG_EROFS_FS_PAGE_CACHE_SHARE

Also the #ifdef are too ugly from the upstream code cycle.

Thanks,
Gao Xiang


More information about the Linux-erofs mailing list