erofs: add fscache context helper functions
authorJeffle Xu <jefflexu@linux.alibaba.com>
Mon, 25 Apr 2022 12:21:34 +0000 (20:21 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 17 May 2022 16:11:19 +0000 (00:11 +0800)
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>
fs/erofs/fscache.c
fs/erofs/internal.h

index 7a6d0239ebb143ef9bbac7bddc28c719cd6bbb3e..dfff245b006b9a6d2d7f69694f2b2dc0d176b4ba 100644 (file)
@@ -5,6 +5,47 @@
 #include <linux/fscache.h>
 #include "internal.h"
 
+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);
index 71c28aa3f9ce206d3b1f03f0741ae2b886930605..0997c297863f97b062e604e7aa1cc3e8f76ccdcd 100644 (file)
@@ -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
@@ -601,12 +605,27 @@ 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 */