From: Gao Xiang hsiangkao@linux.alibaba.com
anolis inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IB5UKT
Reference: https://gitee.com/anolis/cloud-kernel/commit/63ed7d0d74e9
--------------------------------
ANBZ: #1666
commit b02c602f065f7a09d7678dd1d8bf3d3fd10ed228 upstream.
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@linux.alibaba.com Reviewed-by: Gao Xiang hsiangkao@linux.alibaba.com Link: https://lore.kernel.org/r/20220425122143.56815-13-jefflexu@linux.alibaba.com Acked-by: Chao Yu chao@kernel.org Signed-off-by: Gao Xiang hsiangkao@linux.alibaba.com Signed-off-by: Huang Jianan jnhuang@linux.alibaba.com Reviewed-by: Jeffle Xu jefflexu@linux.alibaba.com Signed-off-by: Baokun Li libaokun1@huawei.com --- fs/erofs/fscache.c | 47 +++++++++++++++++++++++++++++++++++++++++++++ fs/erofs/internal.h | 19 ++++++++++++++++++ 2 files changed, 66 insertions(+)
diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c index dbf3f1bb7588..fbda7da6ced9 100644 --- a/fs/erofs/fscache.c +++ b/fs/erofs/fscache.c @@ -25,6 +25,53 @@ const struct fscache_cookie_def erofs_fscache_super_index_def = { .check_aux = NULL, };
+const struct fscache_cookie_def erofs_fscache_inode_object_def = { + .name = "CIFS.uniqueid", + .type = FSCACHE_COOKIE_TYPE_DATAFILE, +}; + +int erofs_fscache_register_cookie(struct super_block *sb, + struct erofs_fscache **fscache, char *name) +{ + struct erofs_fscache *ctx; + struct fscache_cookie *cookie; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + cookie = fscache_acquire_cookie(EROFS_SB(sb)->volume, + &erofs_fscache_inode_object_def, + name, strlen(name), + NULL, 0, NULL, 0, true); + if (!cookie) { + erofs_err(sb, "failed to get cookie for %s", name); + kfree(ctx); + 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, NULL, 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 a70f80f3b79c..cd89fb654a11 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -79,6 +79,10 @@ struct erofs_fs_context { struct erofs_dev_context *devs; };
+struct erofs_fscache { + struct fscache_cookie *cookie; +}; + struct erofs_sb_info { struct erofs_mount_opts opt; /* options */ #ifdef CONFIG_EROFS_FS_ZIP @@ -478,6 +482,10 @@ int erofs_fscache_register(void); void erofs_fscache_unregister(void); 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(void) { @@ -489,6 +497,17 @@ 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 */