erofs: code clean up for fscache
authorJia Zhu <zhujia.zj@bytedance.com>
Sun, 18 Sep 2022 04:34:52 +0000 (12:34 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 20 Sep 2022 00:01:53 +0000 (08:01 +0800)
Some cleanups. No logic changes.

Suggested-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Signed-off-by: Jia Zhu <zhujia.zj@bytedance.com>
Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Link: https://lore.kernel.org/r/20220918043456.147-3-zhujia.zj@bytedance.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/fscache.c
fs/erofs/internal.h
fs/erofs/super.c

index b5fd9d71e67f1a215ec8e9690d802f4388df09ba..1eb63987e815cfc5de3cfacb92665ea4d48b104c 100644 (file)
@@ -421,9 +421,8 @@ const struct address_space_operations erofs_fscache_access_aops = {
        .readahead = erofs_fscache_readahead,
 };
 
-int erofs_fscache_register_cookie(struct super_block *sb,
-                                 struct erofs_fscache **fscache,
-                                 char *name, bool need_inode)
+struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
+                                                    char *name, bool need_inode)
 {
        struct fscache_volume *volume = EROFS_SB(sb)->volume;
        struct erofs_fscache *ctx;
@@ -432,7 +431,7 @@ int erofs_fscache_register_cookie(struct super_block *sb,
 
        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        cookie = fscache_acquire_cookie(volume, FSCACHE_ADV_WANT_CACHE_SIZE,
                                        name, strlen(name), NULL, 0, 0);
@@ -462,42 +461,33 @@ int erofs_fscache_register_cookie(struct super_block *sb,
                ctx->inode = inode;
        }
 
-       *fscache = ctx;
-       return 0;
+       return ctx;
 
 err_cookie:
        fscache_unuse_cookie(ctx->cookie, NULL, NULL);
        fscache_relinquish_cookie(ctx->cookie, false);
-       ctx->cookie = NULL;
 err:
        kfree(ctx);
-       return ret;
+       return ERR_PTR(ret);
 }
 
-void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache)
+void erofs_fscache_unregister_cookie(struct erofs_fscache *ctx)
 {
-       struct erofs_fscache *ctx = *fscache;
-
        if (!ctx)
                return;
 
        fscache_unuse_cookie(ctx->cookie, NULL, NULL);
        fscache_relinquish_cookie(ctx->cookie, false);
-       ctx->cookie = NULL;
-
        iput(ctx->inode);
-       ctx->inode = NULL;
-
        kfree(ctx);
-       *fscache = NULL;
 }
 
 int erofs_fscache_register_fs(struct super_block *sb)
 {
        struct erofs_sb_info *sbi = EROFS_SB(sb);
        struct fscache_volume *volume;
+       struct erofs_fscache *fscache;
        char *name;
-       int ret = 0;
 
        name = kasprintf(GFP_KERNEL, "erofs,%s", sbi->opt.fsid);
        if (!name)
@@ -506,19 +496,28 @@ int erofs_fscache_register_fs(struct super_block *sb)
        volume = fscache_acquire_volume(name, NULL, NULL, 0);
        if (IS_ERR_OR_NULL(volume)) {
                erofs_err(sb, "failed to register volume for %s", name);
-               ret = volume ? PTR_ERR(volume) : -EOPNOTSUPP;
-               volume = NULL;
+               kfree(name);
+               return volume ? PTR_ERR(volume) : -EOPNOTSUPP;
        }
 
        sbi->volume = volume;
        kfree(name);
-       return ret;
+
+       fscache = erofs_fscache_register_cookie(sb, sbi->opt.fsid, true);
+       /* acquired volume will be relinquished in kill_sb() */
+       if (IS_ERR(fscache))
+               return PTR_ERR(fscache);
+
+       sbi->s_fscache = fscache;
+       return 0;
 }
 
 void erofs_fscache_unregister_fs(struct super_block *sb)
 {
        struct erofs_sb_info *sbi = EROFS_SB(sb);
 
+       erofs_fscache_unregister_cookie(sbi->s_fscache);
        fscache_relinquish_volume(sbi->volume, NULL, false);
+       sbi->s_fscache = NULL;
        sbi->volume = NULL;
 }
index a01cc82795a25398f79a5b99e3c2ef796c77c4df..39fb124ce6705938be7bd0323fdaf80a8621df3e 100644 (file)
@@ -581,27 +581,26 @@ static inline int z_erofs_load_lzma_config(struct super_block *sb,
 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, bool need_inode);
-void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache);
+struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
+                                                    char *name, bool need_inode);
+void erofs_fscache_unregister_cookie(struct erofs_fscache *fscache);
 
 extern const struct address_space_operations erofs_fscache_access_aops;
 #else
 static inline int erofs_fscache_register_fs(struct super_block *sb)
 {
-       return 0;
+       return -EOPNOTSUPP;
 }
 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, bool need_inode)
+static inline
+struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
+                                                    char *name, bool need_inode)
 {
-       return -EOPNOTSUPP;
+       return ERR_PTR(-EOPNOTSUPP);
 }
 
-static inline void erofs_fscache_unregister_cookie(struct erofs_fscache **fscache)
+static inline void erofs_fscache_unregister_cookie(struct erofs_fscache *fscache)
 {
 }
 #endif
index 9716d355a63ef6d0c57c68f93808d42ee306683c..884e7ed3d760686e5dc6dc1bb976ce574dfa44da 100644 (file)
@@ -224,10 +224,10 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
                             struct erofs_device_info *dif, erofs_off_t *pos)
 {
        struct erofs_sb_info *sbi = EROFS_SB(sb);
+       struct erofs_fscache *fscache;
        struct erofs_deviceslot *dis;
        struct block_device *bdev;
        void *ptr;
-       int ret;
 
        ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*pos), EROFS_KMAP);
        if (IS_ERR(ptr))
@@ -245,10 +245,10 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
        }
 
        if (erofs_is_fscache_mode(sb)) {
-               ret = erofs_fscache_register_cookie(sb, &dif->fscache,
-                               dif->path, false);
-               if (ret)
-                       return ret;
+               fscache = erofs_fscache_register_cookie(sb, dif->path, false);
+               if (IS_ERR(fscache))
+                       return PTR_ERR(fscache);
+               dif->fscache = fscache;
        } else {
                bdev = blkdev_get_by_path(dif->path, FMODE_READ | FMODE_EXCL,
                                          sb->s_type);
@@ -706,11 +706,6 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
                if (err)
                        return err;
 
-               err = erofs_fscache_register_cookie(sb, &sbi->s_fscache,
-                                                   sbi->opt.fsid, true);
-               if (err)
-                       return err;
-
                err = super_setup_bdi(sb);
                if (err)
                        return err;
@@ -817,7 +812,8 @@ static int erofs_release_device_info(int id, void *ptr, void *data)
        fs_put_dax(dif->dax_dev, NULL);
        if (dif->bdev)
                blkdev_put(dif->bdev, FMODE_READ | FMODE_EXCL);
-       erofs_fscache_unregister_cookie(&dif->fscache);
+       erofs_fscache_unregister_cookie(dif->fscache);
+       dif->fscache = NULL;
        kfree(dif->path);
        kfree(dif);
        return 0;
@@ -889,7 +885,6 @@ static void erofs_kill_sb(struct super_block *sb)
 
        erofs_free_dev_context(sbi->devs);
        fs_put_dax(sbi->dax_dev, NULL);
-       erofs_fscache_unregister_cookie(&sbi->s_fscache);
        erofs_fscache_unregister_fs(sb);
        kfree(sbi->opt.fsid);
        kfree(sbi);
@@ -909,7 +904,7 @@ static void erofs_put_super(struct super_block *sb)
        iput(sbi->managed_cache);
        sbi->managed_cache = NULL;
 #endif
-       erofs_fscache_unregister_cookie(&sbi->s_fscache);
+       erofs_fscache_unregister_fs(sb);
 }
 
 static struct file_system_type erofs_fs_type = {