]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
erofs: refine z_erofs_{init,exit}_subsystem()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 9 Jul 2024 09:41:05 +0000 (17:41 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 9 Jul 2024 11:04:40 +0000 (19:04 +0800)
Introduce z_erofs_{init,exit}_decompressor() to unexport
z_erofs_{deflate,lzma,zstd}_{init,exit}().

Besides, call them in z_erofs_{init,exit}_subsystem()
for simplicity.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240709094106.3018109-2-hsiangkao@linux.alibaba.com
fs/erofs/compress.h
fs/erofs/decompressor.c
fs/erofs/decompressor_deflate.c
fs/erofs/decompressor_lzma.c
fs/erofs/decompressor_zstd.c
fs/erofs/internal.h
fs/erofs/super.c
fs/erofs/zdata.c

index c68d5739932fc71424db51d21b9a210ec6adbff5..601f533c964999a03884a57fdd319ca91e098ac0 100644 (file)
@@ -24,6 +24,8 @@ struct z_erofs_decompressor {
                      void *data, int size);
        int (*decompress)(struct z_erofs_decompress_req *rq,
                          struct page **pagepool);
+       int (*init)(void);
+       void (*exit)(void);
        char *name;
 };
 
@@ -88,4 +90,6 @@ extern const struct z_erofs_decompressor *z_erofs_decomp[];
 
 int z_erofs_fixup_insize(struct z_erofs_decompress_req *rq, const char *padbuf,
                         unsigned int padbufsize);
+int __init z_erofs_init_decompressor(void);
+void z_erofs_exit_decompressor(void);
 #endif
index de50a9de4e8ad57ee8320497e675499501d8e48d..b22fce1140611fdc9950ef0c4e95765f96be5945 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2019 HUAWEI, Inc.
  *             https://www.huawei.com/
+ * Copyright (C) 2024 Alibaba Cloud
  */
 #include "compress.h"
 #include <linux/lz4.h>
@@ -383,6 +384,8 @@ const struct z_erofs_decompressor *z_erofs_decomp[] = {
        [Z_EROFS_COMPRESSION_LZ4] = &(const struct z_erofs_decompressor) {
                .config = z_erofs_load_lz4_config,
                .decompress = z_erofs_lz4_decompress,
+               .init = z_erofs_gbuf_init,
+               .exit = z_erofs_gbuf_exit,
                .name = "lz4"
        },
 #ifdef CONFIG_EROFS_FS_ZIP_LZMA
@@ -446,3 +449,28 @@ int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
        erofs_put_metabuf(&buf);
        return ret;
 }
+
+int __init z_erofs_init_decompressor(void)
+{
+       int i, err;
+
+       for (i = 0; i < Z_EROFS_COMPRESSION_MAX; ++i) {
+               err = z_erofs_decomp[i] ? z_erofs_decomp[i]->init() : 0;
+               if (err) {
+                       while (--i)
+                               if (z_erofs_decomp[i])
+                                       z_erofs_decomp[i]->exit();
+                       return err;
+               }
+       }
+       return 0;
+}
+
+void z_erofs_exit_decompressor(void)
+{
+       int i;
+
+       for (i = 0; i < Z_EROFS_COMPRESSION_MAX; ++i)
+               if (z_erofs_decomp[i])
+                       z_erofs_decomp[i]->exit();
+}
index 1c0ed77dcdb2a62abc3f2618d17adba9e90525d1..79232ef156549d5395e14b0f71d1d6c32bffa426 100644 (file)
@@ -15,7 +15,7 @@ static DECLARE_WAIT_QUEUE_HEAD(z_erofs_deflate_wq);
 
 module_param_named(deflate_streams, z_erofs_deflate_nstrms, uint, 0444);
 
-void z_erofs_deflate_exit(void)
+static void z_erofs_deflate_exit(void)
 {
        /* there should be no running fs instance */
        while (z_erofs_deflate_avail_strms) {
@@ -41,7 +41,7 @@ void z_erofs_deflate_exit(void)
        }
 }
 
-int __init z_erofs_deflate_init(void)
+static int __init z_erofs_deflate_init(void)
 {
        /* by default, use # of possible CPUs instead */
        if (!z_erofs_deflate_nstrms)
@@ -256,5 +256,7 @@ failed_zinit:
 const struct z_erofs_decompressor z_erofs_deflate_decomp = {
        .config = z_erofs_load_deflate_config,
        .decompress = z_erofs_deflate_decompress,
+       .init = z_erofs_deflate_init,
+       .exit = z_erofs_deflate_exit,
        .name = "deflate",
 };
index 9cab3a2f755804d01dffbffeb3b9df70ad14d3b2..80e735dc8406ddf07a16708e30b841cb39e0f3ae 100644 (file)
@@ -18,7 +18,7 @@ static DECLARE_WAIT_QUEUE_HEAD(z_erofs_lzma_wq);
 
 module_param_named(lzma_streams, z_erofs_lzma_nstrms, uint, 0444);
 
-void z_erofs_lzma_exit(void)
+static void z_erofs_lzma_exit(void)
 {
        /* there should be no running fs instance */
        while (z_erofs_lzma_avail_strms) {
@@ -46,7 +46,7 @@ void z_erofs_lzma_exit(void)
        }
 }
 
-int __init z_erofs_lzma_init(void)
+static int __init z_erofs_lzma_init(void)
 {
        unsigned int i;
 
@@ -297,5 +297,7 @@ failed:
 const struct z_erofs_decompressor z_erofs_lzma_decomp = {
        .config = z_erofs_load_lzma_config,
        .decompress = z_erofs_lzma_decompress,
+       .init = z_erofs_lzma_init,
+       .exit = z_erofs_lzma_exit,
        .name = "lzma"
 };
index e8f931d41e60ebb4c08325dc96004bf461a82aa5..49415bc40d7ce78daf3df67ddbb12ac453206e22 100644 (file)
@@ -34,7 +34,7 @@ again:
        return strm;
 }
 
-void z_erofs_zstd_exit(void)
+static void z_erofs_zstd_exit(void)
 {
        while (z_erofs_zstd_avail_strms) {
                struct z_erofs_zstd *strm, *n;
@@ -49,7 +49,7 @@ void z_erofs_zstd_exit(void)
        }
 }
 
-int __init z_erofs_zstd_init(void)
+static int __init z_erofs_zstd_init(void)
 {
        /* by default, use # of possible CPUs instead */
        if (!z_erofs_zstd_nstrms)
@@ -281,5 +281,7 @@ failed_zinit:
 const struct z_erofs_decompressor z_erofs_zstd_decomp = {
        .config = z_erofs_load_zstd_config,
        .decompress = z_erofs_zstd_decompress,
+       .init = z_erofs_zstd_init,
+       .exit = z_erofs_zstd_exit,
        .name = "zstd",
 };
index 9a72fcbc0b30bb8f3e3f643008ba9ea6bf23ef82..736607675396e8c340bfcde2ae4432167870a3b3 100644 (file)
@@ -454,8 +454,8 @@ void erofs_shrinker_register(struct super_block *sb);
 void erofs_shrinker_unregister(struct super_block *sb);
 int __init erofs_init_shrinker(void);
 void erofs_exit_shrinker(void);
-int __init z_erofs_init_zip_subsystem(void);
-void z_erofs_exit_zip_subsystem(void);
+int __init z_erofs_init_subsystem(void);
+void z_erofs_exit_subsystem(void);
 int erofs_try_to_free_all_cached_folios(struct erofs_sb_info *sbi,
                                        struct erofs_workgroup *egrp);
 int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
@@ -472,37 +472,11 @@ static inline void erofs_shrinker_register(struct super_block *sb) {}
 static inline void erofs_shrinker_unregister(struct super_block *sb) {}
 static inline int erofs_init_shrinker(void) { return 0; }
 static inline void erofs_exit_shrinker(void) {}
-static inline int z_erofs_init_zip_subsystem(void) { return 0; }
-static inline void z_erofs_exit_zip_subsystem(void) {}
-static inline int z_erofs_gbuf_init(void) { return 0; }
-static inline void z_erofs_gbuf_exit(void) {}
+static inline int z_erofs_init_subsystem(void) { return 0; }
+static inline void z_erofs_exit_subsystem(void) {}
 static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; }
 #endif /* !CONFIG_EROFS_FS_ZIP */
 
-#ifdef CONFIG_EROFS_FS_ZIP_LZMA
-int __init z_erofs_lzma_init(void);
-void z_erofs_lzma_exit(void);
-#else
-static inline int z_erofs_lzma_init(void) { return 0; }
-static inline int z_erofs_lzma_exit(void) { return 0; }
-#endif /* !CONFIG_EROFS_FS_ZIP_LZMA */
-
-#ifdef CONFIG_EROFS_FS_ZIP_DEFLATE
-int __init z_erofs_deflate_init(void);
-void z_erofs_deflate_exit(void);
-#else
-static inline int z_erofs_deflate_init(void) { return 0; }
-static inline int z_erofs_deflate_exit(void) { return 0; }
-#endif /* !CONFIG_EROFS_FS_ZIP_DEFLATE */
-
-#ifdef CONFIG_EROFS_FS_ZIP_ZSTD
-int __init z_erofs_zstd_init(void);
-void z_erofs_zstd_exit(void);
-#else
-static inline int z_erofs_zstd_init(void) { return 0; }
-static inline int z_erofs_zstd_exit(void) { return 0; }
-#endif /* !CONFIG_EROFS_FS_ZIP_ZSTD */
-
 #ifdef CONFIG_EROFS_FS_ONDEMAND
 int erofs_fscache_register_fs(struct super_block *sb);
 void erofs_fscache_unregister_fs(struct super_block *sb);
index 1b91d951301382ed928e3ad76472cfa855e89105..35268263aaed9f336336138fee80069da828a504 100644 (file)
@@ -849,23 +849,7 @@ static int __init erofs_module_init(void)
        if (err)
                goto shrinker_err;
 
-       err = z_erofs_lzma_init();
-       if (err)
-               goto lzma_err;
-
-       err = z_erofs_deflate_init();
-       if (err)
-               goto deflate_err;
-
-       err = z_erofs_zstd_init();
-       if (err)
-               goto zstd_err;
-
-       err = z_erofs_gbuf_init();
-       if (err)
-               goto gbuf_err;
-
-       err = z_erofs_init_zip_subsystem();
+       err = z_erofs_init_subsystem();
        if (err)
                goto zip_err;
 
@@ -882,16 +866,8 @@ static int __init erofs_module_init(void)
 fs_err:
        erofs_exit_sysfs();
 sysfs_err:
-       z_erofs_exit_zip_subsystem();
+       z_erofs_exit_subsystem();
 zip_err:
-       z_erofs_gbuf_exit();
-gbuf_err:
-       z_erofs_zstd_exit();
-zstd_err:
-       z_erofs_deflate_exit();
-deflate_err:
-       z_erofs_lzma_exit();
-lzma_err:
        erofs_exit_shrinker();
 shrinker_err:
        kmem_cache_destroy(erofs_inode_cachep);
@@ -906,13 +882,9 @@ static void __exit erofs_module_exit(void)
        rcu_barrier();
 
        erofs_exit_sysfs();
-       z_erofs_exit_zip_subsystem();
-       z_erofs_zstd_exit();
-       z_erofs_deflate_exit();
-       z_erofs_lzma_exit();
+       z_erofs_exit_subsystem();
        erofs_exit_shrinker();
        kmem_cache_destroy(erofs_inode_cachep);
-       z_erofs_gbuf_exit();
 }
 
 static int erofs_statfs(struct dentry *dentry, struct kstatfs *buf)
index 3dbd94980de7a8d9f948266c3207d9c1f1ecc145..aff3cdf114ad4a5e274b0d80a8fbbe841b809c62 100644 (file)
@@ -446,44 +446,51 @@ static inline int erofs_cpu_hotplug_init(void) { return 0; }
 static inline void erofs_cpu_hotplug_destroy(void) {}
 #endif
 
-void z_erofs_exit_zip_subsystem(void)
+void z_erofs_exit_subsystem(void)
 {
        erofs_cpu_hotplug_destroy();
        erofs_destroy_percpu_workers();
        destroy_workqueue(z_erofs_workqueue);
        z_erofs_destroy_pcluster_pool();
+       z_erofs_exit_decompressor();
 }
 
-int __init z_erofs_init_zip_subsystem(void)
+int __init z_erofs_init_subsystem(void)
 {
-       int err = z_erofs_create_pcluster_pool();
+       int err = z_erofs_init_decompressor();
 
        if (err)
-               goto out_error_pcluster_pool;
+               goto err_decompressor;
+
+       err = z_erofs_create_pcluster_pool();
+       if (err)
+               goto err_pcluster_pool;
 
        z_erofs_workqueue = alloc_workqueue("erofs_worker",
                        WQ_UNBOUND | WQ_HIGHPRI, num_possible_cpus());
        if (!z_erofs_workqueue) {
                err = -ENOMEM;
-               goto out_error_workqueue_init;
+               goto err_workqueue_init;
        }
 
        err = erofs_init_percpu_workers();
        if (err)
-               goto out_error_pcpu_worker;
+               goto err_pcpu_worker;
 
        err = erofs_cpu_hotplug_init();
        if (err < 0)
-               goto out_error_cpuhp_init;
+               goto err_cpuhp_init;
        return err;
 
-out_error_cpuhp_init:
+err_cpuhp_init:
        erofs_destroy_percpu_workers();
-out_error_pcpu_worker:
+err_pcpu_worker:
        destroy_workqueue(z_erofs_workqueue);
-out_error_workqueue_init:
+err_workqueue_init:
        z_erofs_destroy_pcluster_pool();
-out_error_pcluster_pool:
+err_pcluster_pool:
+       z_erofs_exit_decompressor();
+err_decompressor:
        return err;
 }