[PATCH v2 2/4] erofs-utils: lib: switch to use `struct erofs_mkfs_btctx`
Gao Xiang
hsiangkao at linux.alibaba.com
Tue Dec 30 05:06:44 AEDT 2025
Sometimes, it's necessary to know whether it's an incremental build
or not.
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/inode.c | 102 +++++++++++++++++++++++++++-------------------------
1 file changed, 53 insertions(+), 49 deletions(-)
diff --git a/lib/inode.c b/lib/inode.c
index 1d08e39317c0..dc3d82749405 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1450,7 +1450,12 @@ out:
return ret;
}
-static int erofs_mkfs_handle_nondirectory(struct erofs_importer *im,
+struct erofs_mkfs_btctx {
+ struct erofs_importer *im;
+ bool rebuild, incremental;
+};
+
+static int erofs_mkfs_handle_nondirectory(const struct erofs_mkfs_btctx *btctx,
struct erofs_mkfs_job_ndir_ctx *ctx)
{
struct erofs_inode *inode = ctx->inode;
@@ -1480,7 +1485,7 @@ static int erofs_mkfs_handle_nondirectory(struct erofs_importer *im,
}
if (ret)
return ret;
- erofs_prepare_inode_buffer(im, inode);
+ erofs_prepare_inode_buffer(btctx->im, inode);
erofs_write_tail_end(inode);
return 0;
}
@@ -1501,7 +1506,7 @@ struct erofs_mkfs_jobitem {
} u;
};
-static int erofs_mkfs_jobfn(struct erofs_importer *im,
+static int erofs_mkfs_jobfn(const struct erofs_mkfs_btctx *ctx,
struct erofs_mkfs_jobitem *item)
{
struct erofs_inode *inode = item->u.inode;
@@ -1511,7 +1516,7 @@ static int erofs_mkfs_jobfn(struct erofs_importer *im,
return 1;
if (item->type == EROFS_MKFS_JOB_NDIR)
- return erofs_mkfs_handle_nondirectory(im, &item->u.ndir);
+ return erofs_mkfs_handle_nondirectory(ctx, &item->u.ndir);
if (item->type == EROFS_MKFS_JOB_DIR) {
unsigned int bsz = erofs_blksiz(inode->sbi);
@@ -1519,7 +1524,7 @@ static int erofs_mkfs_jobfn(struct erofs_importer *im,
if (inode->datalayout == EROFS_INODE_DATALAYOUT_MAX) {
inode->datalayout = EROFS_INODE_FLAT_INLINE;
- ret = erofs_begin_compress_dir(im, inode);
+ ret = erofs_begin_compress_dir(ctx->im, inode);
if (ret && ret != -ENOSPC)
return ret;
} else {
@@ -1535,7 +1540,7 @@ static int erofs_mkfs_jobfn(struct erofs_importer *im,
* in the parent directory since parent directories should
* generally be prioritized.
*/
- ret = erofs_prepare_inode_buffer(im, inode);
+ ret = erofs_prepare_inode_buffer(ctx->im, inode);
if (ret)
return ret;
inode->bh->op = &erofs_skip_write_bhops;
@@ -1603,8 +1608,8 @@ static void erofs_mkfs_pop_jobitem(struct erofs_mkfs_dfops *q)
static void *z_erofs_mt_dfops_worker(void *arg)
{
- struct erofs_importer *im = arg;
- struct erofs_sb_info *sbi = im->sbi;
+ const struct erofs_mkfs_btctx *ctx = arg;
+ struct erofs_sb_info *sbi = ctx->im->sbi;
struct erofs_mkfs_dfops *dfops = sbi->mkfs_dfops;
int ret;
@@ -1612,7 +1617,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(im, item);
+ ret = erofs_mkfs_jobfn(ctx, item);
erofs_mkfs_pop_jobitem(dfops);
} while (!ret);
@@ -1622,10 +1627,10 @@ 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_importer *im,
+static int erofs_mkfs_go(const struct erofs_mkfs_btctx *ctx,
enum erofs_mkfs_jobtype type, void *elem, int size)
{
- struct erofs_mkfs_dfops *q = im->sbi->mkfs_dfops;
+ struct erofs_mkfs_dfops *q = ctx->im->sbi->mkfs_dfops;
struct erofs_mkfs_jobitem *item;
pthread_mutex_lock(&q->lock);
@@ -1649,14 +1654,14 @@ static int erofs_mkfs_go(struct erofs_importer *im,
return 0;
}
#else
-static int erofs_mkfs_go(struct erofs_importer *im,
+static int erofs_mkfs_go(const struct erofs_mkfs_btctx *ctx,
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(im, &item);
+ return erofs_mkfs_jobfn(ctx, &item);
}
static void erofs_mkfs_flushjobs(struct erofs_sb_info *sbi)
{
@@ -1686,7 +1691,7 @@ int erofs_mkfs_push_pending_job(struct list_head *pending,
return 0;
}
-int erofs_mkfs_flush_pending_jobs(struct erofs_importer *im,
+int erofs_mkfs_flush_pending_jobs(const struct erofs_mkfs_btctx *ctx,
struct list_head *q)
{
struct erofs_mkfs_pending_jobitem *pji, *n;
@@ -1696,7 +1701,7 @@ int erofs_mkfs_flush_pending_jobs(struct erofs_importer *im,
list_for_each_entry_safe(pji, n, q, list) {
list_del(&pji->list);
- err2 = erofs_mkfs_go(im, pji->item.type, &pji->item.u,
+ err2 = erofs_mkfs_go(ctx, pji->item.type, &pji->item.u,
pji->item._usize);
free(pji);
if (!err)
@@ -1809,11 +1814,10 @@ static void erofs_dentry_kill(struct erofs_dentry *d)
free(d);
}
-static int erofs_prepare_dir_inode(struct erofs_importer *im,
- struct erofs_inode *dir,
- bool rebuild,
- bool incremental)
+static int erofs_prepare_dir_inode(const struct erofs_mkfs_btctx *ctx,
+ struct erofs_inode *dir)
{
+ struct erofs_importer *im = ctx->im;
struct erofs_sb_info *sbi = im->sbi;
struct erofs_dentry *d, *n;
unsigned int i_nlink;
@@ -1833,14 +1837,14 @@ static int erofs_prepare_dir_inode(struct erofs_importer *im,
++nr_subdirs;
}
- if (!rebuild) {
+ if (!ctx->rebuild) {
ret = erofs_mkfs_import_localdir(im, dir,
&nr_subdirs, &i_nlink);
if (ret)
return ret;
}
- if (incremental && dir->dev == sbi->dev && !dir->opaque) {
+ if (ctx->incremental && dir->dev == sbi->dev && !dir->opaque) {
ret = erofs_rebuild_load_basedir(dir, &nr_subdirs, &i_nlink);
if (ret)
return ret;
@@ -1861,7 +1865,7 @@ static int erofs_prepare_dir_inode(struct erofs_importer *im,
if (ret)
return ret;
- if (IS_ROOT(dir) && incremental && !erofs_sb_has_48bit(sbi))
+ if (IS_ROOT(dir) && ctx->incremental && !erofs_sb_has_48bit(sbi))
dir->datalayout = EROFS_INODE_FLAT_PLAIN;
dir->i_nlink = i_nlink;
@@ -1879,9 +1883,10 @@ static int erofs_prepare_dir_inode(struct erofs_importer *im,
return 0;
}
-static int erofs_mkfs_begin_nondirectory(struct erofs_importer *im,
+static int erofs_mkfs_begin_nondirectory(const struct erofs_mkfs_btctx *btctx,
struct erofs_inode *inode)
{
+ struct erofs_importer *im = btctx->im;
struct erofs_mkfs_job_ndir_ctx ctx =
{ .inode = inode, .fd = -1 };
int ret;
@@ -1913,14 +1918,14 @@ static int erofs_mkfs_begin_nondirectory(struct erofs_importer *im,
return ret;
}
}
- return erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx));
+ return erofs_mkfs_go(btctx, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx));
}
-static int erofs_mkfs_handle_inode(struct erofs_importer *im,
- struct erofs_inode *inode,
- bool rebuild, bool incremental)
+static int erofs_mkfs_handle_inode(const struct erofs_mkfs_btctx *ctx,
+ struct erofs_inode *inode)
{
const char *relpath = erofs_fspath(inode->i_srcpath);
+ struct erofs_importer *im = ctx->im;
const struct erofs_importer_params *params = im->params;
char *trimmed;
int ret;
@@ -1942,12 +1947,12 @@ static int erofs_mkfs_handle_inode(struct erofs_importer *im,
}
if (S_ISDIR(inode->i_mode)) {
- ret = erofs_prepare_dir_inode(im, inode, rebuild, incremental);
+ ret = erofs_prepare_dir_inode(ctx, inode);
if (ret < 0)
return ret;
}
- if (!rebuild && !params->no_xattrs) {
+ if (!ctx->rebuild && !params->no_xattrs) {
ret = erofs_scan_file_xattrs(inode);
if (ret < 0)
return ret;
@@ -1959,14 +1964,14 @@ static int erofs_mkfs_handle_inode(struct erofs_importer *im,
else if (inode->whiteouts)
erofs_set_origin_xattr(inode);
- ret = erofs_prepare_xattr_ibody(inode, incremental && IS_ROOT(inode));
+ ret = erofs_prepare_xattr_ibody(inode, ctx->incremental && IS_ROOT(inode));
if (ret < 0)
return ret;
if (!S_ISDIR(inode->i_mode)) {
- ret = erofs_mkfs_begin_nondirectory(im, inode);
+ ret = erofs_mkfs_begin_nondirectory(ctx, inode);
} else {
- ret = erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR, &inode,
+ ret = erofs_mkfs_go(ctx, EROFS_MKFS_JOB_DIR, &inode,
sizeof(inode));
}
erofs_info("file %s dumped (mode %05o)", *relpath ? relpath : "/",
@@ -1985,9 +1990,9 @@ static void erofs_mark_parent_inode(struct erofs_inode *inode,
inode->i_parent = (void *)((unsigned long)dir | 1);
}
-static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
- bool incremental)
+static int erofs_mkfs_dump_tree(const struct erofs_mkfs_btctx *ctx)
{
+ struct erofs_importer *im = ctx->im;
struct erofs_inode *root = im->root;
struct erofs_sb_info *sbi = root->sbi;
struct erofs_inode *dumpdir = erofs_igrab(root);
@@ -1998,7 +2003,7 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
erofs_mark_parent_inode(root, root); /* rootdir mark */
root->next_dirwrite = NULL;
/* update dev/i_ino[1] to keep track of the base image */
- if (incremental) {
+ if (ctx->incremental) {
root->dev = root->sbi->dev;
root->i_ino[1] = sbi->root_nid;
erofs_remove_ihash(root);
@@ -2013,12 +2018,12 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
root->xattr_isize = cfg.c_root_xattr_isize;
}
- err = erofs_mkfs_handle_inode(im, root, rebuild, incremental);
+ err = erofs_mkfs_handle_inode(ctx, root);
if (err)
return err;
/* assign root NID immediately for non-incremental builds */
- if (!incremental) {
+ if (!ctx->incremental) {
erofs_mkfs_flushjobs(sbi);
erofs_fixup_meta_blkaddr(root);
sbi->root_nid = root->nid;
@@ -2039,13 +2044,12 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
continue;
if (!erofs_inode_visited(inode)) {
- DBG_BUGON(rebuild && (inode->i_nlink == 1 ||
+ DBG_BUGON(ctx->rebuild && (inode->i_nlink == 1 ||
S_ISDIR(inode->i_mode)) &&
erofs_parent_inode(inode) != dir);
erofs_mark_parent_inode(inode, dir);
- err = erofs_mkfs_handle_inode(im, inode,
- rebuild, incremental);
+ err = erofs_mkfs_handle_inode(ctx, inode);
if (err)
break;
if (S_ISDIR(inode->i_mode)) {
@@ -2053,7 +2057,7 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
last = &inode->next_dirwrite;
(void)erofs_igrab(inode);
}
- } else if (!rebuild) {
+ } else if (!ctx->rebuild) {
++inode->i_nlink;
}
}
@@ -2062,7 +2066,7 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
err2 = grouped_dirdata ?
erofs_mkfs_push_pending_job(&pending_dirs,
EROFS_MKFS_JOB_DIR_BH, &dir, sizeof(dir)) :
- erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR_BH,
+ erofs_mkfs_go(ctx, EROFS_MKFS_JOB_DIR_BH,
&dir, sizeof(dir));
if (err || err2) {
if (!err)
@@ -2070,7 +2074,7 @@ static int erofs_mkfs_dump_tree(struct erofs_importer *im, bool rebuild,
break;
}
} while (dumpdir);
- err2 = erofs_mkfs_flush_pending_jobs(im, &pending_dirs);
+ err2 = erofs_mkfs_flush_pending_jobs(ctx, &pending_dirs);
return err ? err : err2;
}
@@ -2082,7 +2086,7 @@ struct erofs_mkfs_buildtree_ctx {
#define __erofs_mkfs_build_tree erofs_mkfs_build_tree
#endif
-static int __erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx)
+static int __erofs_mkfs_build_tree(const struct erofs_mkfs_btctx *ctx)
{
struct erofs_importer *im = ctx->im;
@@ -2099,7 +2103,7 @@ static int __erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx)
if (err)
return err;
}
- return erofs_mkfs_dump_tree(im, ctx->rebuild, ctx->incremental);
+ return erofs_mkfs_dump_tree(ctx);
}
#ifdef EROFS_MT_ENABLED
@@ -2125,7 +2129,7 @@ static int erofs_get_fdlimit(void)
#endif
}
-static int erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx)
+static int erofs_mkfs_build_tree(struct erofs_mkfs_btctx *ctx)
{
struct erofs_importer *im = ctx->im;
struct erofs_importer_params *params = im->params;
@@ -2162,12 +2166,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, im);
+ z_erofs_mt_dfops_worker, ctx);
if (err)
goto fail;
err = __erofs_mkfs_build_tree(ctx);
- erofs_mkfs_go(im, ~0, NULL, 0);
+ erofs_mkfs_go(ctx, ~0, NULL, 0);
err2 = pthread_join(sbi->dfops_worker, &retval);
DBG_BUGON(!q->exited);
if (!err || err == -ECHILD) {
@@ -2195,7 +2199,7 @@ int erofs_importer_load_tree(struct erofs_importer *im, bool rebuild,
return -EOPNOTSUPP;
}
- return erofs_mkfs_build_tree(&((struct erofs_mkfs_buildtree_ctx) {
+ return erofs_mkfs_build_tree(&((struct erofs_mkfs_btctx) {
.im = im,
.rebuild = rebuild,
.incremental = incremental,
--
2.43.5
More information about the Linux-erofs
mailing list