diff mbox series

[v6,14/22] erofs: add erofs_fscache_read_folios() helper

Message ID 20220325122223.102958-15-jefflexu@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series fscache,erofs: fscache-based on-demand read semantics | expand

Commit Message

Jingbo Xu March 25, 2022, 12:22 p.m. UTC
Add erofs_fscache_read_folios() helper reading from fscache. It supports
on-demand read semantics. That is, it will make the backend prepare for
the data when cache miss. Once data ready, it will reinitiate a read
from the cache.

This helper can then be used to implement .readpage()/.readahead() of
on-demand read semantics.

Besides also add erofs_fscache_read_folio() wrapper helper.

Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
---
 fs/erofs/fscache.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

Gao Xiang March 28, 2022, 2:49 a.m. UTC | #1
On Fri, Mar 25, 2022 at 08:22:15PM +0800, Jeffle Xu wrote:
> Add erofs_fscache_read_folios() helper reading from fscache. It supports
> on-demand read semantics. That is, it will make the backend prepare for
> the data when cache miss. Once data ready, it will reinitiate a read
> from the cache.
> 
> This helper can then be used to implement .readpage()/.readahead() of
> on-demand read semantics.
> 
> Besides also add erofs_fscache_read_folio() wrapper helper.
> 
> Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
> ---
>  fs/erofs/fscache.c | 39 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
> 
> diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
> index 30383d9adb62..6a55f7b5f883 100644
> --- a/fs/erofs/fscache.c
> +++ b/fs/erofs/fscache.c
> @@ -7,6 +7,45 @@
>  
>  static struct fscache_volume *volume;
>  
> +/*
> + * erofs_fscache_read_folios - Read data from fscache.
> + *
> + * Fill the read data into page cache described by @start/len, which shall be
> + * both aligned with PAGE_SIZE. @pstart describes the corresponding physical
> + * start address in the cache file.
> + */
> +static int erofs_fscache_read_folios(struct fscache_cookie *cookie,
> +				     struct address_space *mapping,
> +				     loff_t start, size_t len,
> +				     loff_t pstart)
> +{
> +	struct netfs_cache_resources cres;
> +	struct iov_iter iter;
> +	int ret;
> +
> +	memset(&cres, 0, sizeof(cres));
> +
> +	ret = fscache_begin_read_operation(&cres, cookie);
> +	if (ret)
> +		return ret;
> +
> +	iov_iter_xarray(&iter, READ, &mapping->i_pages, start, len);
> +
> +	ret = fscache_read(&cres, pstart, &iter,
> +			   NETFS_READ_HOLE_ONDEMAND, NULL, NULL);
> +
> +	fscache_end_operation(&cres);
> +	return ret;
> +}
> +
> +static inline int erofs_fscache_read_folio(struct fscache_cookie *cookie,
> +					   struct folio *folio, loff_t pstart)

I've seen two users of this helper,

 1) erofs_fscache_readpage_noinline
 2) erofs_fscache_readpage_blob

Actually, we could fold such logic in these users since this additional
helper doesn't enhance the readability but increase the overhead when
reading the code.

It'd be better to get rid of it instead.

Thanks,
Gao Xiang

> +{
> +	return erofs_fscache_read_folios(cookie, folio_file_mapping(folio),
> +					 folio_pos(folio), folio_size(folio),
> +					 pstart);
> +}
> +
>  static const struct address_space_operations erofs_fscache_blob_aops = {
>  };
>  
> -- 
> 2.27.0
> 
> --
> Linux-cachefs mailing list
> Linux-cachefs@redhat.com
> https://listman.redhat.com/mailman/listinfo/linux-cachefs
diff mbox series

Patch

diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
index 30383d9adb62..6a55f7b5f883 100644
--- a/fs/erofs/fscache.c
+++ b/fs/erofs/fscache.c
@@ -7,6 +7,45 @@ 
 
 static struct fscache_volume *volume;
 
+/*
+ * erofs_fscache_read_folios - Read data from fscache.
+ *
+ * Fill the read data into page cache described by @start/len, which shall be
+ * both aligned with PAGE_SIZE. @pstart describes the corresponding physical
+ * start address in the cache file.
+ */
+static int erofs_fscache_read_folios(struct fscache_cookie *cookie,
+				     struct address_space *mapping,
+				     loff_t start, size_t len,
+				     loff_t pstart)
+{
+	struct netfs_cache_resources cres;
+	struct iov_iter iter;
+	int ret;
+
+	memset(&cres, 0, sizeof(cres));
+
+	ret = fscache_begin_read_operation(&cres, cookie);
+	if (ret)
+		return ret;
+
+	iov_iter_xarray(&iter, READ, &mapping->i_pages, start, len);
+
+	ret = fscache_read(&cres, pstart, &iter,
+			   NETFS_READ_HOLE_ONDEMAND, NULL, NULL);
+
+	fscache_end_operation(&cres);
+	return ret;
+}
+
+static inline int erofs_fscache_read_folio(struct fscache_cookie *cookie,
+					   struct folio *folio, loff_t pstart)
+{
+	return erofs_fscache_read_folios(cookie, folio_file_mapping(folio),
+					 folio_pos(folio), folio_size(folio),
+					 pstart);
+}
+
 static const struct address_space_operations erofs_fscache_blob_aops = {
 };