Add a per-FS context for the compression process to maintain
multi-bucket fragment queues.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/compress.h |  2 +-
 include/erofs/internal.h |  2 ++
 lib/compress.c           | 49 +++++++++++++++++++++++++++-------------
 mkfs/main.c              |  2 +-
 4 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/include/erofs/compress.h b/include/erofs/compress.h
index c9831a7..4731a8b 100644
--- a/include/erofs/compress.h
+++ b/include/erofs/compress.h
@@ -25,7 +25,7 @@ int erofs_write_compressed_file(struct z_erofs_compress_ictx 
*ictx);
 
 int z_erofs_compress_init(struct erofs_sb_info *sbi,
                          struct erofs_buffer_head *bh);
-int z_erofs_compress_exit(void);
+int z_erofs_compress_exit(struct erofs_sb_info *sbi);
 
 const char *z_erofs_list_supported_algorithms(int i, unsigned int *mask);
 const struct erofs_algorithm *z_erofs_list_available_compressors(int *i);
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 73845f1..e89a1e4 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -82,6 +82,7 @@ struct erofs_xattr_prefix_item {
 
 struct erofs_mkfs_dfops;
 struct erofs_packed_inode;
+struct z_erofs_mgr;
 
 struct erofs_sb_info {
        struct erofs_sb_lz4_info lz4;
@@ -141,6 +142,7 @@ struct erofs_sb_info {
        struct erofs_mkfs_dfops *mkfs_dfops;
 #endif
        struct erofs_bufmgr *bmgr;
+       struct z_erofs_mgr *zmgr;
        struct erofs_packed_inode *packedinode;
        bool useqpl;
 };
diff --git a/lib/compress.c b/lib/compress.c
index 706a756..cbc51ca 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -28,13 +28,6 @@
 
 #define Z_EROFS_DESTBUF_SZ     (Z_EROFS_PCLUSTER_MAX_SIZE + 
EROFS_MAX_BLOCK_SIZE * 2)
 
-/* compressing configuration specified by users */
-struct erofs_compress_cfg {
-       struct erofs_compress handle;
-       unsigned int algorithmtype;
-       bool enable;
-} erofs_ccfg[EROFS_MAX_COMPR_CFGS];
-
 struct z_erofs_extent_item {
        struct list_head list;
        struct z_erofs_inmem_extent e;
@@ -118,6 +111,17 @@ static struct {
 } z_erofs_mt_ctrl;
 #endif
 
+/* compressing configuration specified by users */
+struct erofs_compress_cfg {
+       struct erofs_compress handle;
+       unsigned int algorithmtype;
+       bool enable;
+};
+
+struct z_erofs_mgr {
+       struct erofs_compress_cfg ccfg[EROFS_MAX_COMPR_CFGS];
+};
+
 static bool z_erofs_mt_enabled;
 
 #define Z_EROFS_LEGACY_MAP_HEADER_SIZE Z_EROFS_FULL_INDEX_ALIGN(0)
@@ -1463,6 +1467,7 @@ int z_erofs_mt_compress(struct z_erofs_compress_ictx 
*ictx)
                if (i >= nsegs - 1) {
                        cur->ctx.remaining = inode->i_size -
                                        inode->fragment_size - (u64)i * segsz;
+
                        if (z_erofs_mt_ctrl.hasfwq) {
                                erofs_queue_work(&z_erofs_mt_ctrl.fwq,
                                                 &cur->work);
@@ -1591,7 +1596,7 @@ void *erofs_begin_compressed_file(struct erofs_inode 
*inode, int fd, u64 fpos)
                while (1) {
                        inode->z_algorithmtype[0] =
                                rand() % EROFS_MAX_COMPR_CFGS;
-                       if (erofs_ccfg[inode->z_algorithmtype[0]].enable)
+                       if (sbi->zmgr->ccfg[inode->z_algorithmtype[0]].enable)
                                break;
                }
        }
@@ -1616,7 +1621,7 @@ void *erofs_begin_compressed_file(struct erofs_inode 
*inode, int fd, u64 fpos)
                ictx->fd = dup(fd);
        }
 
-       ictx->ccfg = &erofs_ccfg[inode->z_algorithmtype[0]];
+       ictx->ccfg = &sbi->zmgr->ccfg[inode->z_algorithmtype[0]];
        inode->z_algorithmtype[0] = ictx->ccfg->algorithmtype;
        inode->z_algorithmtype[1] = 0;
 
@@ -1844,8 +1849,15 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, 
struct erofs_buffer_head *s
        u32 max_dict_size[Z_EROFS_COMPRESSION_MAX] = {};
        u32 available_compr_algs = 0;
 
+       if (!sbi->zmgr) {
+               sbi->zmgr = calloc(1, sizeof(*sbi->zmgr));
+               if (!sbi->zmgr)
+                       return -ENOMEM;
+       }
+
        for (i = 0; cfg.c_compr_opts[i].alg; ++i) {
-               struct erofs_compress *c = &erofs_ccfg[i].handle;
+               struct erofs_compress_cfg *ccfg = &sbi->zmgr->ccfg[i];
+               struct erofs_compress *c = &ccfg->handle;
 
                ret = erofs_compressor_init(sbi, c, cfg.c_compr_opts[i].alg,
                                            cfg.c_compr_opts[i].level,
@@ -1854,10 +1866,10 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, 
struct erofs_buffer_head *s
                        return ret;
 
                id = z_erofs_get_compress_algorithm_id(c);
-               erofs_ccfg[i].algorithmtype = id;
-               erofs_ccfg[i].enable = true;
-               available_compr_algs |= 1 << erofs_ccfg[i].algorithmtype;
-               if (erofs_ccfg[i].algorithmtype != Z_EROFS_COMPRESSION_LZ4)
+               ccfg->algorithmtype = id;
+               ccfg->enable = true;
+               available_compr_algs |= 1 << ccfg->algorithmtype;
+               if (ccfg->algorithmtype != Z_EROFS_COMPRESSION_LZ4)
                        erofs_sb_set_compr_cfgs(sbi);
                if (c->dict_size > max_dict_size[id])
                        max_dict_size[id] = c->dict_size;
@@ -1921,12 +1933,17 @@ int z_erofs_compress_init(struct erofs_sb_info *sbi, 
struct erofs_buffer_head *s
        return z_erofs_mt_init();
 }
 
-int z_erofs_compress_exit(void)
+int z_erofs_compress_exit(struct erofs_sb_info *sbi)
 {
        int i, ret;
 
+       if (!sbi->zmgr) {
+               DBG_BUGON(1);
+               return -EINVAL;
+       }
+
        for (i = 0; cfg.c_compr_opts[i].alg; ++i) {
-               ret = erofs_compressor_exit(&erofs_ccfg[i].handle);
+               ret = erofs_compressor_exit(&sbi->zmgr->ccfg[i].handle);
                if (ret)
                        return ret;
        }
diff --git a/mkfs/main.c b/mkfs/main.c
index 2907789..b2eff9d 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -1491,7 +1491,7 @@ int main(int argc, char **argv)
 exit:
        if (root)
                erofs_iput(root);
-       z_erofs_compress_exit();
+       z_erofs_compress_exit(&g_sbi);
        z_erofs_dedupe_exit();
        z_erofs_dedupe_ext_exit();
        blklst = erofs_blocklist_close();
-- 
2.43.5


Reply via email to