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


Reply via email to