Sometimes, it's necessary to know whether it's an incremental build or not.
Signed-off-by: Gao Xiang <[email protected]> --- 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
