Introduce a generic importer mechanism to import data into the EROFS
filesystem tree using specific configuration parameters.

This allows mkfs parameters to be moved out of `struct erofs_configure`
and configured per instance.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/importer.h | 31 ++++++++++++++++
 lib/Makefile.am          |  3 +-
 lib/importer.c           | 79 ++++++++++++++++++++++++++++++++++++++++
 mkfs/main.c              | 44 ++++++----------------
 4 files changed, 123 insertions(+), 34 deletions(-)
 create mode 100644 include/erofs/importer.h
 create mode 100644 lib/importer.c

diff --git a/include/erofs/importer.h b/include/erofs/importer.h
new file mode 100644
index 0000000..7c29e03
--- /dev/null
+++ b/include/erofs/importer.h
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */
+/*
+ * Copyright (C) 2025 Alibaba Cloud
+ */
+#ifndef __EROFS_IMPORTER_H
+#define __EROFS_IMPORTER_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "internal.h"
+
+struct erofs_importer_params {
+};
+
+struct erofs_importer {
+       struct erofs_importer_params *params;
+       struct erofs_sb_info *sbi;
+};
+
+void erofs_importer_preset(struct erofs_importer_params *params);
+int erofs_importer_init(struct erofs_importer *im);
+void erofs_importer_exit(struct erofs_importer *im);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/Makefile.am b/lib/Makefile.am
index a3972b1..f485440 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -27,6 +27,7 @@ noinst_HEADERS = $(top_srcdir)/include/erofs_fs.h \
       $(top_srcdir)/include/erofs/compress_hints.h \
       $(top_srcdir)/include/erofs/fragments.h \
       $(top_srcdir)/include/erofs/rebuild.h \
+      $(top_srcdir)/include/erofs/importer.h \
       $(top_srcdir)/lib/liberofs_private.h \
       $(top_srcdir)/lib/liberofs_xxhash.h \
       $(top_srcdir)/lib/liberofs_metabox.h \
@@ -38,7 +39,7 @@ liberofs_la_SOURCES = config.c io.c cache.c super.c inode.c 
xattr.c exclude.c \
                      compress_hints.c hashmap.c sha256.c blobchunk.c dir.c \
                      fragments.c dedupe.c uuid_unparse.c uuid.c tar.c \
                      block_list.c rebuild.c diskbuf.c bitops.c dedupe_ext.c \
-                     vmdk.c metabox.c global.c
+                     vmdk.c metabox.c global.c importer.c
 
 liberofs_la_CFLAGS = -Wall ${libuuid_CFLAGS} -I$(top_srcdir)/include
 if ENABLE_LZ4
diff --git a/lib/importer.c b/lib/importer.c
new file mode 100644
index 0000000..74bd24a
--- /dev/null
+++ b/lib/importer.c
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0
+/*
+ * Copyright (C) 2025 Alibaba Cloud
+ */
+#include "erofs/fragments.h"
+#include "erofs/importer.h"
+#include "erofs/config.h"
+#include "erofs/dedupe.h"
+#include "erofs/inode.h"
+#include "erofs/print.h"
+#include "erofs/lock.h"
+#include "liberofs_metabox.h"
+
+static EROFS_DEFINE_MUTEX(erofs_importer_global_mutex);
+static bool erofs_importer_global_initialized;
+
+void erofs_importer_preset(struct erofs_importer_params *params)
+{
+       *params = (struct erofs_importer_params) {};
+}
+
+void erofs_importer_global_init(void)
+{
+       if (erofs_importer_global_initialized)
+               return;
+       erofs_mutex_lock(&erofs_importer_global_mutex);
+       if (!erofs_importer_global_initialized) {
+               erofs_inode_manager_init();
+               erofs_importer_global_initialized = true;
+       }
+       erofs_mutex_unlock(&erofs_importer_global_mutex);
+}
+
+int erofs_importer_init(struct erofs_importer *im)
+{
+       struct erofs_sb_info *sbi = im->sbi;
+       const char *subsys = NULL;
+       int err;
+
+       erofs_importer_global_init();
+
+       if (cfg.c_fragments || cfg.c_extra_ea_name_prefixes) {
+               subsys = "packedfile";
+               if (!cfg.c_mkfs_pclustersize_packed)
+                       cfg.c_mkfs_pclustersize_packed = 
cfg.c_mkfs_pclustersize_def;
+
+               err = erofs_packedfile_init(sbi, cfg.c_fragments);
+               if (err)
+                       goto out_err;
+       }
+
+       if (cfg.c_mkfs_pclustersize_metabox >= 0) {
+               subsys = "metabox";
+               err = erofs_metabox_init(sbi);
+               if (err)
+                       goto out_err;
+       }
+
+       if (cfg.c_fragments) {
+               subsys = "dedupe_ext";
+               err = z_erofs_dedupe_ext_init();
+               if (err)
+                       goto out_err;
+       }
+       return 0;
+
+out_err:
+       erofs_err("failed to initialize %s: %s", subsys, erofs_strerror(-err));
+       return err;
+}
+
+void erofs_importer_exit(struct erofs_importer *im)
+{
+       struct erofs_sb_info *sbi = im->sbi;
+
+       z_erofs_dedupe_ext_exit();
+       erofs_metabox_exit(sbi);
+       erofs_packedfile_exit(sbi);
+}
diff --git a/mkfs/main.c b/mkfs/main.c
index b8773fd..8b18b35 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -16,6 +16,7 @@
 #include "erofs/config.h"
 #include "erofs/print.h"
 #include "erofs/cache.h"
+#include "erofs/importer.h"
 #include "erofs/diskbuf.h"
 #include "erofs/inode.h"
 #include "erofs/tar.h"
@@ -1475,6 +1476,11 @@ static void erofs_mkfs_showsummaries(void)
 
 int main(int argc, char **argv)
 {
+       struct erofs_importer_params importer_params;
+       struct erofs_importer importer = {
+               .params = &importer_params,
+               .sbi = &g_sbi,
+       };
        struct erofs_buffer_head *sb_bh;
        struct erofs_inode *root = NULL;
        bool tar_index_512b = false;
@@ -1488,6 +1494,7 @@ int main(int argc, char **argv)
        if (err)
                return 1;
        erofs_mkfs_default_options();
+       erofs_importer_preset(&importer_params);
 
        err = mkfs_parse_options_cfg(argc, argv);
        erofs_show_progs(argc, argv);
@@ -1534,26 +1541,10 @@ int main(int argc, char **argv)
        }
 #endif
        erofs_show_config();
-       if (cfg.c_fragments || cfg.c_extra_ea_name_prefixes) {
-               if (!cfg.c_mkfs_pclustersize_packed)
-                       cfg.c_mkfs_pclustersize_packed = 
cfg.c_mkfs_pclustersize_def;
 
-               err = erofs_packedfile_init(&g_sbi, cfg.c_fragments);
-               if (err) {
-                       erofs_err("failed to initialize packedfile: %s",
-                                 strerror(-err));
-                       goto exit;
-               }
-       }
-
-       if (cfg.c_mkfs_pclustersize_metabox >= 0) {
-               err = erofs_metabox_init(&g_sbi);
-               if (err) {
-                       erofs_err("failed to initialize metabox: %s",
-                                 erofs_strerror(err));
-                       goto exit;
-               }
-       }
+       err = erofs_importer_init(&importer);
+       if (err)
+               goto exit;
 
 #ifndef NDEBUG
        if (cfg.c_random_pclusterblks)
@@ -1677,15 +1668,6 @@ int main(int argc, char **argv)
                }
        }
 
-       if (cfg.c_fragments) {
-               err = z_erofs_dedupe_ext_init();
-               if (err) {
-                       erofs_err("failed to initialize extent deduplication: 
%s",
-                                 erofs_strerror(err));
-                       goto exit;
-               }
-       }
-
        if (cfg.c_chunkbits) {
                err = erofs_blob_init(cfg.c_blobdev_path, 1 << cfg.c_chunkbits);
                if (err)
@@ -1701,8 +1683,6 @@ int main(int argc, char **argv)
                }
        }
 
-       erofs_inode_manager_init();
-
        if (source_mode == EROFS_MKFS_SOURCE_LOCALDIR) {
                err = erofs_build_shared_xattrs_from_path(&g_sbi, 
cfg.c_src_path);
                if (err) {
@@ -1837,10 +1817,8 @@ int main(int argc, char **argv)
 exit:
        if (root)
                erofs_iput(root);
-       erofs_metabox_exit(&g_sbi);
        z_erofs_compress_exit(&g_sbi);
        z_erofs_dedupe_exit();
-       z_erofs_dedupe_ext_exit();
        blklst = erofs_blocklist_close();
        if (blklst)
                fclose(blklst);
@@ -1849,7 +1827,6 @@ exit:
        erofs_cleanup_exclude_rules();
        if (cfg.c_chunkbits)
                erofs_blob_exit();
-       erofs_packedfile_exit(&g_sbi);
        erofs_xattr_cleanup_name_prefixes();
        erofs_rebuild_cleanup();
        erofs_diskbuf_exit();
@@ -1858,6 +1835,7 @@ exit:
                if (erofstar.ios.dumpfd >= 0)
                        close(erofstar.ios.dumpfd);
        }
+       erofs_importer_exit(&importer);
 
        if (err) {
                erofs_err("\tCould not format the device : %s\n",
-- 
2.43.5


Reply via email to