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