As a new formal API for external users, it flushes all dirty metadata
except the superblock.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/cache.h    |  1 +
 include/erofs/importer.h |  2 ++
 lib/importer.c           | 39 +++++++++++++++++++++++++++++++++++++++
 mkfs/main.c              | 29 ++---------------------------
 4 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/include/erofs/cache.h b/include/erofs/cache.h
index d5618c0..c248b73 100644
--- a/include/erofs/cache.h
+++ b/include/erofs/cache.h
@@ -13,6 +13,7 @@ extern "C"
 {
 #endif
 
+#include <stdlib.h>
 #include "internal.h"
 
 struct erofs_buffer_head;
diff --git a/include/erofs/importer.h b/include/erofs/importer.h
index e83c3e3..28d29bd 100644
--- a/include/erofs/importer.h
+++ b/include/erofs/importer.h
@@ -19,6 +19,7 @@ struct erofs_importer_params {
        u32 fixed_gid;
        u32 uid_offset;
        u32 gid_offset;
+       u32 fsalignblks;
        bool no_datainline;
        bool hard_dereference;
        bool ovlfs_strip;
@@ -33,6 +34,7 @@ struct erofs_importer {
 
 void erofs_importer_preset(struct erofs_importer_params *params);
 int erofs_importer_init(struct erofs_importer *im);
+int erofs_importer_flush_all(struct erofs_importer *im);
 void erofs_importer_exit(struct erofs_importer *im);
 
 #ifdef __cplusplus
diff --git a/lib/importer.c b/lib/importer.c
index 8e86993..a65fa39 100644
--- a/lib/importer.c
+++ b/lib/importer.c
@@ -4,6 +4,7 @@
  */
 #include "erofs/fragments.h"
 #include "erofs/importer.h"
+#include "erofs/cache.h"
 #include "erofs/config.h"
 #include "erofs/dedupe.h"
 #include "erofs/inode.h"
@@ -19,6 +20,7 @@ void erofs_importer_preset(struct erofs_importer_params 
*params)
        *params = (struct erofs_importer_params) {
                .fixed_uid = -1,
                .fixed_gid = -1,
+               .fsalignblks = 1,
        };
 }
 
@@ -72,6 +74,43 @@ out_err:
        return err;
 }
 
+int erofs_importer_flush_all(struct erofs_importer *im)
+{
+       struct erofs_sb_info *sbi = im->sbi;
+       unsigned int fsalignblks;
+       int err;
+
+       if (erofs_sb_has_metabox(sbi)) {
+               erofs_update_progressinfo("Handling metabox ...");
+               err = erofs_metabox_iflush(im);
+               if (err)
+                       return err;
+       }
+
+       if ((cfg.c_fragments || cfg.c_extra_ea_name_prefixes) &&
+           erofs_sb_has_fragments(sbi)) {
+               erofs_update_progressinfo("Handling packed data ...");
+               err = erofs_flush_packed_inode(im);
+               if (err)
+                       return err;
+       }
+
+       fsalignblks = im->params->fsalignblks ?
+               roundup_pow_of_two(im->params->fsalignblks) : 1;
+       sbi->primarydevice_blocks = roundup(erofs_mapbh(sbi->bmgr, NULL),
+                                           fsalignblks);
+       err = erofs_write_device_table(sbi);
+       if (err)
+               return err;
+
+       /* flush all buffers except for the superblock */
+       err = erofs_bflush(sbi->bmgr, NULL);
+       if (err)
+               return err;
+
+       return erofs_fixup_root_inode(im->root);
+}
+
 void erofs_importer_exit(struct erofs_importer *im)
 {
        struct erofs_sb_info *sbi = im->sbi;
diff --git a/mkfs/main.c b/mkfs/main.c
index a11134e..0a8f477 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -281,7 +281,6 @@ static LIST_HEAD(rebuild_src_list);
 static u8 fixeduuid[16];
 static bool valid_fixeduuid;
 static unsigned int dsunit;
-static unsigned int fsalignblks = 1;
 static int tarerofs_decoder;
 static FILE *vmdk_dcf;
 
@@ -1203,7 +1202,7 @@ static int mkfs_parse_options_cfg(struct 
erofs_importer_params *params,
                        break;
 #endif
                case 531:
-                       fsalignblks = strtoul(optarg, &endptr, 0);
+                       params->fsalignblks = strtoul(optarg, &endptr, 0);
                        if (*endptr != '\0') {
                                erofs_err("invalid fsalignblks %s", optarg);
                                return -EINVAL;
@@ -1760,39 +1759,15 @@ int main(int argc, char **argv)
                }
        }
 
-       if (erofs_sb_has_metabox(&g_sbi)) {
-               erofs_update_progressinfo("Handling metabox ...");
-               erofs_metabox_iflush(&importer);
-               if (err)
-                       goto exit;
-       }
-
-       if ((cfg.c_fragments || cfg.c_extra_ea_name_prefixes) &&
-           erofs_sb_has_fragments(&g_sbi)) {
-               erofs_update_progressinfo("Handling packed data ...");
-               err = erofs_flush_packed_inode(&importer);
-               if (err)
-                       goto exit;
-       }
-
        if (erofstar.index_mode || cfg.c_chunkbits || g_sbi.extra_devices) {
                err = erofs_mkfs_dump_blobs(&g_sbi);
                if (err)
                        goto exit;
        }
 
-       g_sbi.primarydevice_blocks =
-               roundup(erofs_mapbh(g_sbi.bmgr, NULL), fsalignblks);
-       err = erofs_write_device_table(&g_sbi);
-       if (err)
-               goto exit;
-
-       /* flush all buffers except for the superblock */
-       err = erofs_bflush(g_sbi.bmgr, NULL);
+       err = erofs_importer_flush_all(&importer);
        if (err)
                goto exit;
-
-       erofs_fixup_root_inode(root);
        erofs_iput(root);
        root = NULL;
 
-- 
2.43.5


Reply via email to