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 <jeffl...@linux.alibaba.com>

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

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

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

Reply via email to