[PATCH v6 1/4] erofs-utils: mkfs: introduce source_mode enumeration

Hongbo Li lihongbo22 at huawei.com
Thu Aug 7 13:36:45 AEST 2025



On 2025/8/7 11:08, Gao Xiang wrote:
> From: Yifan Zhao <zhaoyifan28 at huawei.com>
> 
> Currently, mkfs controls different image build execution flows through
> the global variables `tar_mode` and `rebuild_mode`, while these two
> modes together with localdir mode are mutually exclusive.
> 
> Let's replace them with a new variable `source_mode` to simplify the
> logic.
> 
> Signed-off-by: Yifan Zhao <zhaoyifan28 at huawei.com>
> Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>

Reviewed-by: Hongbo Li <lihongbo22 at huawei.com>

> ---
>   mkfs/main.c | 78 ++++++++++++++++++++++++++++++-----------------------
>   1 file changed, 44 insertions(+), 34 deletions(-)
> 
> diff --git a/mkfs/main.c b/mkfs/main.c
> index dc2df06..ab27b77 100644
> --- a/mkfs/main.c
> +++ b/mkfs/main.c
> @@ -244,7 +244,7 @@ static int pclustersize_metabox = -1;
>   static struct erofs_tarfile erofstar = {
>   	.global.xattrs = LIST_HEAD_INIT(erofstar.global.xattrs)
>   };
> -static bool tar_mode, rebuild_mode, incremental_mode;
> +static bool incremental_mode;
>   static u8 metabox_algorithmid;
>   
>   enum {
> @@ -254,6 +254,12 @@ enum {
>   	EROFS_MKFS_DATA_IMPORT_SPARSE,
>   } dataimport_mode;
>   
> +static enum {
> +	EROFS_MKFS_SOURCE_LOCALDIR,
> +	EROFS_MKFS_SOURCE_TAR,
> +	EROFS_MKFS_SOURCE_REBUILD,
> +} source_mode;
> +
>   static unsigned int rebuild_src_count, total_ccfgs;
>   static LIST_HEAD(rebuild_src_list);
>   static u8 fixeduuid[16];
> @@ -499,7 +505,7 @@ static void mkfs_parse_tar_cfg(char *cfg)
>   {
>   	char *p;
>   
> -	tar_mode = true;
> +	source_mode = EROFS_MKFS_SOURCE_TAR;
>   	if (!cfg)
>   		return;
>   	p = strchr(cfg, ',');
> @@ -616,7 +622,30 @@ static int mkfs_parse_sources(int argc, char *argv[], int optind)
>   	int err, fd;
>   	char *s;
>   
> -	if (tar_mode) {
> +	switch (source_mode) {
> +	case EROFS_MKFS_SOURCE_LOCALDIR:
> +		err = lstat((s = argv[optind++]), &st);
> +		if (err) {
> +			erofs_err("failed to stat %s: %s", s,
> +				  erofs_strerror(-errno));
> +			return -ENOENT;
> +		}
> +		if (S_ISDIR(st.st_mode)) {
> +			cfg.c_src_path = realpath(s, NULL);
> +			if (!cfg.c_src_path) {
> +				erofs_err("failed to parse source directory: %s",
> +					  erofs_strerror(-errno));
> +				return -ENOENT;
> +			}
> +			erofs_set_fs_root(cfg.c_src_path);
> +		} else {
> +			cfg.c_src_path = strdup(s);
> +			if (!cfg.c_src_path)
> +				return -ENOMEM;
> +			source_mode = EROFS_MKFS_SOURCE_REBUILD;
> +		}
> +		break;
> +	case EROFS_MKFS_SOURCE_TAR:
>   		cfg.c_src_path = strdup(argv[optind++]);
>   		if (!cfg.c_src_path)
>   			return -ENOMEM;
> @@ -640,30 +669,13 @@ static int mkfs_parse_sources(int argc, char *argv[], int optind)
>   			}
>   			erofstar.ios.dumpfd = fd;
>   		}
> -	} else {
> -		err = lstat((s = argv[optind++]), &st);
> -		if (err) {
> -			erofs_err("failed to stat %s: %s", s,
> -				  erofs_strerror(-errno));
> -			return -ENOENT;
> -		}
> -		if (S_ISDIR(st.st_mode)) {
> -			cfg.c_src_path = realpath(s, NULL);
> -			if (!cfg.c_src_path) {
> -				erofs_err("failed to parse source directory: %s",
> -					  erofs_strerror(-errno));
> -				return -ENOENT;
> -			}
> -			erofs_set_fs_root(cfg.c_src_path);
> -		} else {
> -			cfg.c_src_path = strdup(s);
> -			if (!cfg.c_src_path)
> -				return -ENOMEM;
> -			rebuild_mode = true;
> -		}
> +		break;
> +	default:
> +		erofs_err("unexpected source_mode: %d", source_mode);
> +		return -EINVAL;
>   	}
>   
> -	if (rebuild_mode) {
> +	if (source_mode == EROFS_MKFS_SOURCE_REBUILD) {
>   		char *srcpath = cfg.c_src_path;
>   		struct erofs_sb_info *src;
>   
> @@ -1083,7 +1095,7 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
>   		err = mkfs_parse_sources(argc, argv, optind);
>   		if (err)
>   			return err;
> -	} else if (!tar_mode) {
> +	} else if (source_mode != EROFS_MKFS_SOURCE_TAR) {
>   		erofs_err("missing argument: SOURCE(s)");
>   		return -EINVAL;
>   	} else {
> @@ -1383,7 +1395,7 @@ int main(int argc, char **argv)
>   	if (cfg.c_random_pclusterblks)
>   		srand(time(NULL));
>   #endif
> -	if (tar_mode) {
> +	if (source_mode == EROFS_MKFS_SOURCE_TAR) {
>   		if (dataimport_mode == EROFS_MKFS_DATA_IMPORT_RVSP)
>   			erofstar.rvsp_mode = true;
>   		erofstar.dev = rebuild_src_count + 1;
> @@ -1403,9 +1415,7 @@ int main(int argc, char **argv)
>   			g_sbi.blkszbits = 9;
>   			tar_index_512b = true;
>   		}
> -	}
> -
> -	if (rebuild_mode) {
> +	} else if (source_mode == EROFS_MKFS_SOURCE_REBUILD) {
>   		struct erofs_sb_info *src;
>   
>   		erofs_warn("EXPERIMENTAL rebuild mode in use. Use at your own risk!");
> @@ -1465,7 +1475,7 @@ int main(int argc, char **argv)
>   	else if (!incremental_mode)
>   		erofs_uuid_generate(g_sbi.uuid);
>   
> -	if (tar_mode && !erofstar.index_mode) {
> +	if (source_mode == EROFS_MKFS_SOURCE_TAR && !erofstar.index_mode) {
>   		err = erofs_diskbuf_init(1);
>   		if (err) {
>   			erofs_err("failed to initialize diskbuf: %s",
> @@ -1528,7 +1538,7 @@ int main(int argc, char **argv)
>   
>   	erofs_inode_manager_init();
>   
> -	if (tar_mode) {
> +	if (source_mode == EROFS_MKFS_SOURCE_TAR) {
>   		root = erofs_rebuild_make_root(&g_sbi);
>   		if (IS_ERR(root)) {
>   			err = PTR_ERR(root);
> @@ -1543,7 +1553,7 @@ int main(int argc, char **argv)
>   		err = erofs_rebuild_dump_tree(root, incremental_mode);
>   		if (err < 0)
>   			goto exit;
> -	} else if (rebuild_mode) {
> +	} else if (source_mode == EROFS_MKFS_SOURCE_REBUILD) {
>   		root = erofs_rebuild_make_root(&g_sbi);
>   		if (IS_ERR(root)) {
>   			err = PTR_ERR(root);
> @@ -1663,7 +1673,7 @@ exit:
>   	erofs_rebuild_cleanup();
>   	erofs_diskbuf_exit();
>   	erofs_exit_configure();
> -	if (tar_mode) {
> +	if (source_mode == EROFS_MKFS_SOURCE_TAR) {
>   		erofs_iostream_close(&erofstar.ios);
>   		if (erofstar.ios.dumpfd >= 0)
>   			close(erofstar.ios.dumpfd);


More information about the Linux-erofs mailing list