Move `c_inline_data` from the global configuration structure to an importer-specific parameter.
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- v3: - fix the tarerofs functionality. include/erofs/config.h | 1 - include/erofs/fragments.h | 4 +- include/erofs/importer.h | 1 + include/erofs/inode.h | 2 +- include/erofs/tar.h | 4 +- lib/fragments.c | 6 ++- lib/inode.c | 88 +++++++++++++++++++++------------------ lib/liberofs_metabox.h | 4 +- lib/liberofs_s3.h | 2 +- lib/metabox.c | 6 ++- lib/remotes/s3.c | 13 +++--- lib/tar.c | 11 +++-- mkfs/main.c | 71 ++++++++++++++++--------------- 13 files changed, 117 insertions(+), 96 deletions(-) diff --git a/include/erofs/config.h b/include/erofs/config.h index 8c40fd1..418e9b6 100644 --- a/include/erofs/config.h +++ b/include/erofs/config.h @@ -54,7 +54,6 @@ struct erofs_configure { bool c_legacy_compress; char c_timeinherit; char c_chunkbits; - bool c_inline_data; bool c_ztailpacking; bool c_fragments; bool c_all_fragments; diff --git a/include/erofs/fragments.h b/include/erofs/fragments.h index 7c7acf4..00e1e46 100644 --- a/include/erofs/fragments.h +++ b/include/erofs/fragments.h @@ -20,6 +20,8 @@ static inline bool erofs_is_packed_inode(struct erofs_inode *inode) return inode->i_srcpath == EROFS_PACKED_INODE; } +struct erofs_importer; + u32 z_erofs_fragments_tofh(struct erofs_inode *inode, int fd, erofs_off_t fpos); int erofs_fragment_findmatch(struct erofs_inode *inode, int fd, u32 tofh); @@ -27,7 +29,7 @@ int erofs_pack_file_from_fd(struct erofs_inode *inode, int fd, u32 tofcrc); int erofs_fragment_pack(struct erofs_inode *inode, void *data, erofs_off_t pos, erofs_off_t len, u32 tofh, bool tail); int erofs_fragment_commit(struct erofs_inode *inode, u32 tofh); -int erofs_flush_packed_inode(struct erofs_sb_info *sbi); +int erofs_flush_packed_inode(struct erofs_importer *im); int erofs_packedfile(struct erofs_sb_info *sbi); int erofs_packedfile_init(struct erofs_sb_info *sbi, bool fragments_mkfs); diff --git a/include/erofs/importer.h b/include/erofs/importer.h index 541a86d..9aa032b 100644 --- a/include/erofs/importer.h +++ b/include/erofs/importer.h @@ -14,6 +14,7 @@ extern "C" struct erofs_importer_params { char *source; + bool no_datainline; }; struct erofs_importer { diff --git a/include/erofs/inode.h b/include/erofs/inode.h index 9d05aaa..c3155ba 100644 --- a/include/erofs/inode.h +++ b/include/erofs/inode.h @@ -45,7 +45,7 @@ int __erofs_fill_inode(struct erofs_inode *inode, struct stat *st, struct erofs_inode *erofs_new_inode(struct erofs_sb_info *sbi); int erofs_importer_load_tree(struct erofs_importer *im, bool rebuild, bool incremental); -struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_sb_info *sbi, +struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_importer *im, int fd, const char *name); int erofs_fixup_root_inode(struct erofs_inode *root); struct erofs_inode *erofs_rebuild_make_root(struct erofs_sb_info *sbi); diff --git a/include/erofs/tar.h b/include/erofs/tar.h index 6981f9e..3bd4b15 100644 --- a/include/erofs/tar.h +++ b/include/erofs/tar.h @@ -55,9 +55,11 @@ struct erofs_tarfile { bool try_no_reorder; }; +struct erofs_importer; + void erofs_iostream_close(struct erofs_iostream *ios); int erofs_iostream_open(struct erofs_iostream *ios, int fd, int decoder); -int tarerofs_parse_tar(struct erofs_inode *root, struct erofs_tarfile *tar); +int tarerofs_parse_tar(struct erofs_importer *im, struct erofs_tarfile *tar); #ifdef __cplusplus } diff --git a/lib/fragments.c b/lib/fragments.c index 0221a53..5e93f48 100644 --- a/lib/fragments.c +++ b/lib/fragments.c @@ -20,6 +20,7 @@ #include "erofs/fragments.h" #include "erofs/bitops.h" #include "erofs/lock.h" +#include "erofs/importer.h" #include "liberofs_private.h" #ifdef HAVE_SYS_SENDFILE_H #include <sys/sendfile.h> @@ -370,8 +371,9 @@ int erofs_fragment_commit(struct erofs_inode *inode, u32 tofh) return 0; } -int erofs_flush_packed_inode(struct erofs_sb_info *sbi) +int erofs_flush_packed_inode(struct erofs_importer *im) { + struct erofs_sb_info *sbi = im->sbi; struct erofs_packed_inode *epi = sbi->packedinode; struct erofs_inode *inode; @@ -380,7 +382,7 @@ int erofs_flush_packed_inode(struct erofs_sb_info *sbi) if (lseek(epi->fd, 0, SEEK_CUR) <= 0) return 0; - inode = erofs_mkfs_build_special_from_fd(sbi, epi->fd, + inode = erofs_mkfs_build_special_from_fd(im, epi->fd, EROFS_PACKED_INODE); sbi->packed_nid = erofs_lookupnid(inode); erofs_iput(inode); diff --git a/lib/inode.c b/lib/inode.c index 2599772..ae1c39c 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -868,9 +868,11 @@ static bool erofs_inode_need_48bit(struct erofs_inode *inode) return false; } -static int erofs_prepare_inode_buffer(struct erofs_inode *inode) +static int erofs_prepare_inode_buffer(struct erofs_importer *im, + struct erofs_inode *inode) { - struct erofs_sb_info *sbi = inode->sbi; + struct erofs_importer_params *params = im->params; + struct erofs_sb_info *sbi = im->sbi; struct erofs_bufmgr *bmgr = sbi->bmgr; struct erofs_bufmgr *ibmgr = bmgr; unsigned int inodesize; @@ -898,7 +900,7 @@ static int erofs_prepare_inode_buffer(struct erofs_inode *inode) goto noinline; if (!is_inode_layout_compression(inode)) { - if (!cfg.c_inline_data && S_ISREG(inode->i_mode)) { + if (params->no_datainline && S_ISREG(inode->i_mode)) { inode->datalayout = EROFS_INODE_FLAT_PLAIN; goto noinline; } @@ -1402,7 +1404,8 @@ out: return ret; } -static int erofs_mkfs_handle_nondirectory(struct erofs_mkfs_job_ndir_ctx *ctx) +static int erofs_mkfs_handle_nondirectory(struct erofs_importer *im, + struct erofs_mkfs_job_ndir_ctx *ctx) { struct erofs_inode *inode = ctx->inode; int ret = 0; @@ -1431,7 +1434,7 @@ static int erofs_mkfs_handle_nondirectory(struct erofs_mkfs_job_ndir_ctx *ctx) } if (ret) return ret; - erofs_prepare_inode_buffer(inode); + erofs_prepare_inode_buffer(im, inode); erofs_write_tail_end(inode); return 0; } @@ -1451,7 +1454,8 @@ struct erofs_mkfs_jobitem { } u; }; -static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem *item) +static int erofs_mkfs_jobfn(struct erofs_importer *im, + struct erofs_mkfs_jobitem *item) { struct erofs_inode *inode = item->u.inode; int ret; @@ -1460,10 +1464,10 @@ static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem *item) return 1; if (item->type == EROFS_MKFS_JOB_NDIR) - return erofs_mkfs_handle_nondirectory(&item->u.ndir); + return erofs_mkfs_handle_nondirectory(im, &item->u.ndir); if (item->type == EROFS_MKFS_JOB_DIR) { - ret = erofs_prepare_inode_buffer(inode); + ret = erofs_prepare_inode_buffer(im, inode); if (ret) return ret; inode->bh->op = &erofs_skip_write_bhops; @@ -1531,7 +1535,8 @@ static void erofs_mkfs_pop_jobitem(struct erofs_mkfs_dfops *q) static void *z_erofs_mt_dfops_worker(void *arg) { - struct erofs_sb_info *sbi = arg; + struct erofs_importer *im = arg; + struct erofs_sb_info *sbi = im->sbi; struct erofs_mkfs_dfops *dfops = sbi->mkfs_dfops; int ret; @@ -1539,7 +1544,7 @@ static void *z_erofs_mt_dfops_worker(void *arg) struct erofs_mkfs_jobitem *item; item = erofs_mkfs_top_jobitem(dfops); - ret = erofs_mkfs_jobfn(item); + ret = erofs_mkfs_jobfn(im, item); erofs_mkfs_pop_jobitem(dfops); } while (!ret); @@ -1549,11 +1554,11 @@ static void *z_erofs_mt_dfops_worker(void *arg) pthread_exit((void *)(uintptr_t)(ret < 0 ? ret : 0)); } -static int erofs_mkfs_go(struct erofs_sb_info *sbi, +static int erofs_mkfs_go(struct erofs_importer *im, enum erofs_mkfs_jobtype type, void *elem, int size) { + struct erofs_mkfs_dfops *q = im->sbi->mkfs_dfops; struct erofs_mkfs_jobitem *item; - struct erofs_mkfs_dfops *q = sbi->mkfs_dfops; pthread_mutex_lock(&q->lock); @@ -1576,23 +1581,23 @@ static int erofs_mkfs_go(struct erofs_sb_info *sbi, return 0; } #else -static int erofs_mkfs_go(struct erofs_sb_info *sbi, +static int erofs_mkfs_go(struct erofs_importer *im, enum erofs_mkfs_jobtype type, void *elem, int size) { struct erofs_mkfs_jobitem item; item.type = type; memcpy(&item.u, elem, size); - return erofs_mkfs_jobfn(&item); + return erofs_mkfs_jobfn(im, &item); } static void erofs_mkfs_flushjobs(struct erofs_sb_info *sbi) { } #endif -static int erofs_mkfs_handle_directory(struct erofs_inode *dir) +static int erofs_mkfs_handle_directory(struct erofs_importer *im, struct erofs_inode *dir) { - struct erofs_sb_info *sbi = dir->sbi; + struct erofs_sb_info *sbi = im->sbi; DIR *_dir; struct dirent *dp; struct erofs_dentry *d; @@ -1675,7 +1680,7 @@ static int erofs_mkfs_handle_directory(struct erofs_inode *dir) dir->i_nlink = i_nlink; } - return erofs_mkfs_go(sbi, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); + return erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); err_closedir: closedir(_dir); @@ -1711,10 +1716,11 @@ static void erofs_dentry_kill(struct erofs_dentry *d) free(d); } -static int erofs_rebuild_handle_directory(struct erofs_inode *dir, +static int erofs_rebuild_handle_directory(struct erofs_importer *im, + struct erofs_inode *dir, bool incremental) { - struct erofs_sb_info *sbi = dir->sbi; + struct erofs_sb_info *sbi = im->sbi; struct erofs_dentry *d, *n; unsigned int nr_subdirs, i_nlink; bool delwht = cfg.c_ovlfs_strip && dir->whiteouts; @@ -1755,10 +1761,11 @@ static int erofs_rebuild_handle_directory(struct erofs_inode *dir, else dir->i_nlink = i_nlink; - return erofs_mkfs_go(sbi, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); + return erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); } -static int erofs_mkfs_handle_inode(struct erofs_inode *inode) +static int erofs_mkfs_handle_inode(struct erofs_importer *im, + struct erofs_inode *inode) { const char *relpath = erofs_fspath(inode->i_srcpath); char *trimmed; @@ -1793,17 +1800,16 @@ static int erofs_mkfs_handle_inode(struct erofs_inode *inode) return PTR_ERR(ctx.ictx); } } - ret = erofs_mkfs_go(inode->sbi, EROFS_MKFS_JOB_NDIR, - &ctx, sizeof(ctx)); + ret = erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx)); } else { - ret = erofs_mkfs_handle_directory(inode); + ret = erofs_mkfs_handle_directory(im, inode); } erofs_info("file /%s dumped (mode %05o)", relpath, inode->i_mode); return ret; } -static int erofs_rebuild_handle_inode(struct erofs_inode *inode, - bool incremental) +static int erofs_rebuild_handle_inode(struct erofs_importer *im, + struct erofs_inode *inode, bool incremental) { char *trimmed; int ret; @@ -1859,10 +1865,9 @@ static int erofs_rebuild_handle_inode(struct erofs_inode *inode, return PTR_ERR(ctx.ictx); } } - ret = erofs_mkfs_go(inode->sbi, EROFS_MKFS_JOB_NDIR, - &ctx, sizeof(ctx)); + ret = erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx)); } else { - ret = erofs_rebuild_handle_directory(inode, incremental); + ret = erofs_rebuild_handle_directory(im, inode, incremental); } erofs_info("file %s dumped (mode %05o)", erofs_fspath(inode->i_srcpath), inode->i_mode); @@ -1906,8 +1911,8 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild, root->xattr_isize = cfg.c_root_xattr_isize; } - err = !rebuild ? erofs_mkfs_handle_inode(root) : - erofs_rebuild_handle_inode(root, incremental); + err = !rebuild ? erofs_mkfs_handle_inode(im, root) : + erofs_rebuild_handle_inode(im, root, incremental); if (err) return err; @@ -1938,10 +1943,10 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild, erofs_mark_parent_inode(inode, dir); if (!rebuild) - err = erofs_mkfs_handle_inode(inode); + err = erofs_mkfs_handle_inode(im, inode); else - err = erofs_rebuild_handle_inode(inode, - incremental); + err = erofs_rebuild_handle_inode(im, + inode, incremental); if (err) break; if (S_ISDIR(inode->i_mode)) { @@ -1955,8 +1960,8 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild, } *last = dumpdir; /* fixup the last (or the only) one */ dumpdir = head; - err2 = erofs_mkfs_go(sbi, EROFS_MKFS_JOB_DIR_BH, - &dir, sizeof(dir)); + err2 = erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR_BH, + &dir, sizeof(dir)); if (err || err2) return err ? err : err2; } while (dumpdir); @@ -2047,12 +2052,12 @@ static int erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx) sbi->mkfs_dfops = q; err = pthread_create(&sbi->dfops_worker, NULL, - z_erofs_mt_dfops_worker, sbi); + z_erofs_mt_dfops_worker, im); if (err) goto fail; err = __erofs_mkfs_build_tree(ctx); - erofs_mkfs_go(sbi, ~0, NULL, 0); + erofs_mkfs_go(im, ~0, NULL, 0); err2 = pthread_join(sbi->dfops_worker, &retval); DBG_BUGON(!q->exited); if (!err || err == -ECHILD) { @@ -2082,11 +2087,12 @@ int erofs_importer_load_tree(struct erofs_importer *im, bool rebuild, })); } -struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_sb_info *sbi, +struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_importer *im, int fd, const char *name) { - struct stat st; + struct erofs_sb_info *sbi = im->sbi; struct erofs_inode *inode; + struct stat st; void *ictx; int ret; @@ -2134,7 +2140,7 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_sb_info *sbi, if (ret) return ERR_PTR(ret); out: - erofs_prepare_inode_buffer(inode); + erofs_prepare_inode_buffer(im, inode); erofs_write_tail_end(inode); return inode; } diff --git a/lib/liberofs_metabox.h b/lib/liberofs_metabox.h index a783678..d8896c0 100644 --- a/lib/liberofs_metabox.h +++ b/lib/liberofs_metabox.h @@ -12,9 +12,11 @@ static inline bool erofs_is_metabox_inode(struct erofs_inode *inode) return inode->i_srcpath == EROFS_METABOX_INODE; } +struct erofs_importer; + void erofs_metabox_exit(struct erofs_sb_info *sbi); int erofs_metabox_init(struct erofs_sb_info *sbi); struct erofs_bufmgr *erofs_metabox_bmgr(struct erofs_sb_info *sbi); -int erofs_metabox_iflush(struct erofs_sb_info *sbi); +int erofs_metabox_iflush(struct erofs_importer *im); #endif diff --git a/lib/liberofs_s3.h b/lib/liberofs_s3.h index a178c64..f2ec822 100644 --- a/lib/liberofs_s3.h +++ b/lib/liberofs_s3.h @@ -34,7 +34,7 @@ struct erofs_s3 { enum s3erofs_signature_version sig; }; -int s3erofs_build_trees(struct erofs_inode *root, struct erofs_s3 *s3, +int s3erofs_build_trees(struct erofs_importer *im, struct erofs_s3 *s3, const char *path, bool fillzero); #ifdef __cplusplus diff --git a/lib/metabox.c b/lib/metabox.c index a4c0822..c9db9ac 100644 --- a/lib/metabox.c +++ b/lib/metabox.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include "erofs/cache.h" #include "erofs/inode.h" +#include "erofs/importer.h" #include "liberofs_private.h" #include "liberofs_metabox.h" @@ -55,8 +56,9 @@ struct erofs_bufmgr *erofs_metabox_bmgr(struct erofs_sb_info *sbi) return sbi->m2gr ? sbi->m2gr->bmgr : NULL; } -int erofs_metabox_iflush(struct erofs_sb_info *sbi) +int erofs_metabox_iflush(struct erofs_importer *im) { + struct erofs_sb_info *sbi = im->sbi; struct erofs_metaboxmgr *m2gr = sbi->m2gr; struct erofs_inode *inode; int err; @@ -70,7 +72,7 @@ int erofs_metabox_iflush(struct erofs_sb_info *sbi) if (erofs_io_lseek(&m2gr->vf, 0, SEEK_END) <= 0) return 0; - inode = erofs_mkfs_build_special_from_fd(sbi, m2gr->vf.fd, + inode = erofs_mkfs_build_special_from_fd(im, m2gr->vf.fd, EROFS_METABOX_INODE); sbi->metabox_nid = erofs_lookupnid(inode); erofs_iput(inode); diff --git a/lib/remotes/s3.c b/lib/remotes/s3.c index f4a364d..8f4638f 100644 --- a/lib/remotes/s3.c +++ b/lib/remotes/s3.c @@ -17,6 +17,7 @@ #include "erofs/blobchunk.h" #include "erofs/diskbuf.h" #include "erofs/rebuild.h" +#include "erofs/importer.h" #include "liberofs_s3.h" #define S3EROFS_PATH_MAX 1024 @@ -598,7 +599,8 @@ static size_t s3erofs_remote_getobject_cb(void *contents, size_t size, return realsize; } -static int s3erofs_remote_getobject(struct erofs_s3 *s3, +static int s3erofs_remote_getobject(struct erofs_importer *im, + struct erofs_s3 *s3, struct erofs_inode *inode, const char *bucket, const char *key) { @@ -621,7 +623,7 @@ static int s3erofs_remote_getobject(struct erofs_s3 *s3, return -EIO; resp.pos = 0; - if (!cfg.c_compr_opts[0].alg && !cfg.c_inline_data) { + if (!cfg.c_compr_opts[0].alg && im->params->no_datainline) { inode->datalayout = EROFS_INODE_FLAT_PLAIN; inode->idata_size = 0; ret = erofs_allocate_inode_bh_data(inode, @@ -666,10 +668,11 @@ static int s3erofs_remote_getobject(struct erofs_s3 *s3, return resp.pos != resp.end ? -EIO : 0; } -int s3erofs_build_trees(struct erofs_inode *root, struct erofs_s3 *s3, +int s3erofs_build_trees(struct erofs_importer *im, struct erofs_s3 *s3, const char *path, bool fillzero) { - struct erofs_sb_info *sbi = root->sbi; + struct erofs_sb_info *sbi = im->sbi; + struct erofs_inode *root = im->root; struct s3erofs_object_iterator *iter; struct s3erofs_object_info *obj; struct erofs_dentry *d; @@ -747,7 +750,7 @@ int s3erofs_build_trees(struct erofs_inode *root, struct erofs_s3 *s3, if (fillzero) ret = erofs_write_zero_inode(inode); else - ret = s3erofs_remote_getobject(s3, inode, + ret = s3erofs_remote_getobject(im, s3, inode, iter->bucket, obj->key); } if (ret) diff --git a/lib/tar.c b/lib/tar.c index 3146fc9..4b1c101 100644 --- a/lib/tar.c +++ b/lib/tar.c @@ -12,6 +12,7 @@ #include "erofs/xattr.h" #include "erofs/blobchunk.h" #include "erofs/rebuild.h" +#include "erofs/importer.h" #if defined(HAVE_ZLIB) #include <zlib.h> #endif @@ -704,12 +705,14 @@ static int tarerofs_write_file_data(struct erofs_inode *inode, return 0; } -int tarerofs_parse_tar(struct erofs_inode *root, struct erofs_tarfile *tar) +int tarerofs_parse_tar(struct erofs_importer *im, struct erofs_tarfile *tar) { - char path[PATH_MAX]; struct erofs_pax_header eh = tar->global; - struct erofs_sb_info *sbi = root->sbi; + struct erofs_importer_params *params = im->params; + struct erofs_sb_info *sbi = im->sbi; + struct erofs_inode *root = im->root; bool whout, opq, e = false; + char path[PATH_MAX]; struct stat st; mode_t mode; erofs_off_t tar_offset, dataoff; @@ -1112,7 +1115,7 @@ new_inode: ret = -EIO; } else if (tar->try_no_reorder && !cfg.c_compr_opts[0].alg && - !cfg.c_inline_data) { + params->no_datainline) { ret = tarerofs_write_uncompressed_file(inode, tar); } else { ret = tarerofs_write_file_data(inode, tar); diff --git a/mkfs/main.c b/mkfs/main.c index 9039710..49284f9 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -397,6 +397,8 @@ static struct { {NULL, NULL}, }; +static bool mkfs_no_datainline; + static int parse_extended_opts(const char *opts) { #define MATCH_EXTENTED_OPT(opt, token, keylen) \ @@ -455,11 +457,11 @@ static int parse_extended_opts(const char *opts) } else if (MATCH_EXTENTED_OPT("noinline_data", token, keylen)) { if (vallen) return -EINVAL; - cfg.c_inline_data = false; + mkfs_no_datainline = true; } else if (MATCH_EXTENTED_OPT("inline_data", token, keylen)) { if (vallen) return -EINVAL; - cfg.c_inline_data = !clear; + mkfs_no_datainline = !!clear; } else if (MATCH_EXTENTED_OPT("force-inode-blockmap", token, keylen)) { if (vallen) return -EINVAL; @@ -1328,7 +1330,6 @@ static void erofs_mkfs_default_options(void) { cfg.c_showprogress = true; cfg.c_legacy_compress = false; - cfg.c_inline_data = true; cfg.c_xattr_name_filter = true; #ifdef EROFS_MT_ENABLED cfg.c_mt_workers = erofs_get_available_processors(); @@ -1543,6 +1544,8 @@ int main(int argc, char **argv) erofs_show_config(); importer_params.source = cfg.c_src_path; + importer_params.no_datainline = mkfs_no_datainline; + err = erofs_importer_init(&importer); if (err) goto exit; @@ -1707,43 +1710,39 @@ int main(int argc, char **argv) err = PTR_ERR(root); goto exit; } + } - if (source_mode == EROFS_MKFS_SOURCE_TAR) { - while (!(err = tarerofs_parse_tar(root, &erofstar))) - ; - if (err < 0) - goto exit; - } else if (source_mode == EROFS_MKFS_SOURCE_REBUILD) { - err = erofs_mkfs_rebuild_load_trees(root); - if (err) - goto exit; + importer.root = root; + if (source_mode == EROFS_MKFS_SOURCE_TAR) { + while (!(err = tarerofs_parse_tar(&importer, &erofstar))) + ; + } else if (source_mode == EROFS_MKFS_SOURCE_REBUILD) { + err = erofs_mkfs_rebuild_load_trees(root); #ifdef S3EROFS_ENABLED - } else if (source_mode == EROFS_MKFS_SOURCE_S3) { - if (!s3cfg.access_key[0] && getenv("AWS_ACCESS_KEY_ID")) { - strncpy(s3cfg.access_key, getenv("AWS_ACCESS_KEY_ID"), - sizeof(s3cfg.access_key)); - s3cfg.access_key[S3_ACCESS_KEY_LEN] = '\0'; - } - if (!s3cfg.secret_key[0] && getenv("AWS_SECRET_ACCESS_KEY")) { - strncpy(s3cfg.secret_key, getenv("AWS_SECRET_ACCESS_KEY"), - sizeof(s3cfg.secret_key)); - s3cfg.secret_key[S3_SECRET_KEY_LEN] = '\0'; - } + } else if (source_mode == EROFS_MKFS_SOURCE_S3) { + if (!s3cfg.access_key[0] && getenv("AWS_ACCESS_KEY_ID")) { + strncpy(s3cfg.access_key, getenv("AWS_ACCESS_KEY_ID"), + sizeof(s3cfg.access_key)); + s3cfg.access_key[S3_ACCESS_KEY_LEN] = '\0'; + } + if (!s3cfg.secret_key[0] && getenv("AWS_SECRET_ACCESS_KEY")) { + strncpy(s3cfg.secret_key, getenv("AWS_SECRET_ACCESS_KEY"), + sizeof(s3cfg.secret_key)); + s3cfg.secret_key[S3_SECRET_KEY_LEN] = '\0'; + } - if (incremental_mode || - dataimport_mode == EROFS_MKFS_DATA_IMPORT_RVSP) - err = -EOPNOTSUPP; - else - err = s3erofs_build_trees(root, &s3cfg, - cfg.c_src_path, - dataimport_mode == EROFS_MKFS_DATA_IMPORT_ZEROFILL); - if (err) - goto exit; + if (incremental_mode || + dataimport_mode == EROFS_MKFS_DATA_IMPORT_RVSP) + err = -EOPNOTSUPP; + else + err = s3erofs_build_trees(&importer, &s3cfg, + cfg.c_src_path, + dataimport_mode == EROFS_MKFS_DATA_IMPORT_ZEROFILL); #endif - } } + if (err < 0) + goto exit; - importer.root = root; err = erofs_importer_load_tree(&importer, source_mode != EROFS_MKFS_SOURCE_LOCALDIR, incremental_mode); @@ -1763,7 +1762,7 @@ int main(int argc, char **argv) if (erofs_sb_has_metabox(&g_sbi)) { erofs_update_progressinfo("Handling metabox ..."); - erofs_metabox_iflush(&g_sbi); + erofs_metabox_iflush(&importer); if (err) goto exit; } @@ -1771,7 +1770,7 @@ int main(int argc, char **argv) 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(&g_sbi); + err = erofs_flush_packed_inode(&importer); if (err) goto exit; } -- 2.43.5