Re: [PATCH v8 11/20] erofs: add fscache context helper functions
From: Gao Xiang
Date: Wed Apr 06 2022 - 23:26:25 EST
On Wed, Apr 06, 2022 at 03:56:03PM +0800, Jeffle Xu wrote:
> Introduce a context structure for managing data blobs, and helper
> functions for initializing and cleaning up this context structure.
>
> Signed-off-by: Jeffle Xu <jefflexu@xxxxxxxxxxxxxxxxx>
Reviewed-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
Thanks,
Gao Xiang
> ---
> fs/erofs/fscache.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
> fs/erofs/internal.h | 19 +++++++++++++++++++
> 2 files changed, 65 insertions(+)
>
> diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
> index 7a6d0239ebb1..67a3c4935245 100644
> --- a/fs/erofs/fscache.c
> +++ b/fs/erofs/fscache.c
> @@ -5,6 +5,52 @@
> #include <linux/fscache.h>
> #include "internal.h"
>
> +/*
> + * Create an fscache context for data blob.
> + * Return: 0 on success and allocated fscache context is assigned to @fscache,
> + * negative error number on failure.
> + */
> +int erofs_fscache_register_cookie(struct super_block *sb,
> + struct erofs_fscache **fscache, char *name)
> +{
> + struct fscache_volume *volume = EROFS_SB(sb)->volume;
> + struct erofs_fscache *ctx;
> + struct fscache_cookie *cookie;
> +
> + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
> + if (!ctx)
> + return -ENOMEM;
> +
> + cookie = fscache_acquire_cookie(volume, FSCACHE_ADV_WANT_CACHE_SIZE,
> + name, strlen(name), NULL, 0, 0);
> + if (!cookie) {
> + erofs_err(sb, "failed to get cookie for %s", name);
> + kfree(name);
> + return -EINVAL;
> + }
> +
> + fscache_use_cookie(cookie, false);
> + ctx->cookie = cookie;
> +
> + *fscache = ctx;
> + return 0;
> +}
> +
> +void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache)
> +{
> + struct erofs_fscache *ctx = *fscache;
> +
> + if (!ctx)
> + return;
> +
> + fscache_unuse_cookie(ctx->cookie, NULL, NULL);
> + fscache_relinquish_cookie(ctx->cookie, false);
> + ctx->cookie = NULL;
> +
> + kfree(ctx);
> + *fscache = NULL;
> +}
> +
> int erofs_fscache_register_fs(struct super_block *sb)
> {
> struct erofs_sb_info *sbi = EROFS_SB(sb);
> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
> index 952a2f483f94..c6a3351a4d7d 100644
> --- a/fs/erofs/internal.h
> +++ b/fs/erofs/internal.h
> @@ -97,6 +97,10 @@ struct erofs_sb_lz4_info {
> u16 max_pclusterblks;
> };
>
> +struct erofs_fscache {
> + struct fscache_cookie *cookie;
> +};
> +
> struct erofs_sb_info {
> struct erofs_mount_opts opt; /* options */
> #ifdef CONFIG_EROFS_FS_ZIP
> @@ -626,9 +630,24 @@ static inline int z_erofs_load_lzma_config(struct super_block *sb,
> #ifdef CONFIG_EROFS_FS_ONDEMAND
> int erofs_fscache_register_fs(struct super_block *sb);
> void erofs_fscache_unregister_fs(struct super_block *sb);
> +
> +int erofs_fscache_register_cookie(struct super_block *sb,
> + struct erofs_fscache **fscache, char *name);
> +void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache);
> #else
> static inline int erofs_fscache_register_fs(struct super_block *sb) { return 0; }
> static inline void erofs_fscache_unregister_fs(struct super_block *sb) {}
> +
> +static inline int erofs_fscache_register_cookie(struct super_block *sb,
> + struct erofs_fscache **fscache,
> + char *name)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +static inline void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache)
> +{
> +}
> #endif
>
> #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */
> --
> 2.27.0