[PATCH 1/2] erofs-utils: introduce `struct erofs_rebuild_getdentry_ctx`
Hongzhen Luo
hongzhen at linux.alibaba.com
Wed Nov 27 20:28:55 AEDT 2024
There are so many parameters in erofs_rebuild_get_dentry(), let's
wrap these parameters into `struct erofs_rebuild_getdentry_ctx`.
Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
---
include/erofs/rebuild.h | 12 +++++++--
lib/rebuild.c | 59 ++++++++++++++++++++++++-----------------
lib/tar.c | 17 +++++++++---
3 files changed, 59 insertions(+), 29 deletions(-)
diff --git a/include/erofs/rebuild.h b/include/erofs/rebuild.h
index 59b2f6f57005..b37bc80e8a3c 100644
--- a/include/erofs/rebuild.h
+++ b/include/erofs/rebuild.h
@@ -15,8 +15,16 @@ enum erofs_rebuild_datamode {
EROFS_REBUILD_DATA_FULL,
};
-struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
- char *path, bool aufs, bool *whout, bool *opq, bool to_head);
+struct erofs_rebuild_getdentry_ctx {
+ struct erofs_inode *pwd;
+ char *path;
+ bool aufs;
+ bool *whout;
+ bool *opq;
+ bool to_head;
+};
+
+struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_rebuild_getdentry_ctx *ctx);
int erofs_rebuild_load_tree(struct erofs_inode *root, struct erofs_sb_info *sbi,
enum erofs_rebuild_datamode mode);
diff --git a/lib/rebuild.c b/lib/rebuild.c
index b37823e48858..58f1701b3721 100644
--- a/lib/rebuild.c
+++ b/lib/rebuild.c
@@ -16,6 +16,7 @@
#include "erofs/blobchunk.h"
#include "erofs/internal.h"
#include "liberofs_uuid.h"
+#include "erofs/rebuild.h"
#ifdef HAVE_LINUX_AUFS_TYPE_H
#include <linux/aufs_type.h>
@@ -58,18 +59,17 @@ static struct erofs_dentry *erofs_rebuild_mkdir(struct erofs_inode *dir,
return d;
}
-struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
- char *path, bool aufs, bool *whout, bool *opq, bool to_head)
+struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_rebuild_getdentry_ctx *ctx)
{
struct erofs_dentry *d = NULL;
- unsigned int len = strlen(path);
- char *s = path;
+ unsigned int len = strlen(ctx->path);
+ char *s = ctx->path;
- *whout = false;
- *opq = false;
+ *ctx->whout = false;
+ *ctx->opq = false;
- while (s < path + len) {
- char *slash = memchr(s, '/', path + len - s);
+ while (s < ctx->path + len) {
+ char *slash = memchr(s, '/', ctx->path + len - s);
if (slash) {
if (s == slash) {
@@ -82,22 +82,22 @@ struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
if (!memcmp(s, ".", 2)) {
/* null */
} else if (!memcmp(s, "..", 3)) {
- pwd = pwd->i_parent;
+ ctx->pwd = ctx->pwd->i_parent;
} else {
struct erofs_inode *inode = NULL;
- if (aufs && !slash) {
+ if (ctx->aufs && !slash) {
if (!memcmp(s, AUFS_WH_DIROPQ, sizeof(AUFS_WH_DIROPQ))) {
- *opq = true;
+ *ctx->opq = true;
break;
}
if (!memcmp(s, AUFS_WH_PFX, sizeof(AUFS_WH_PFX) - 1)) {
s += sizeof(AUFS_WH_PFX) - 1;
- *whout = true;
+ *ctx->whout = true;
}
}
- list_for_each_entry(d, &pwd->i_subdirs, d_child) {
+ list_for_each_entry(d, &ctx->pwd->i_subdirs, d_child) {
if (!strcmp(d->name, s)) {
if (d->type != EROFS_FT_DIR && slash)
return ERR_PTR(-EIO);
@@ -107,22 +107,22 @@ struct erofs_dentry *erofs_rebuild_get_dentry(struct erofs_inode *pwd,
}
if (inode) {
- if (to_head) {
+ if (ctx->to_head) {
list_del(&d->d_child);
- list_add(&d->d_child, &pwd->i_subdirs);
+ list_add(&d->d_child, &ctx->pwd->i_subdirs);
}
- pwd = inode;
+ ctx->pwd = inode;
} else if (!slash) {
- d = erofs_d_alloc(pwd, s);
+ d = erofs_d_alloc(ctx->pwd, s);
if (IS_ERR(d))
return d;
d->type = EROFS_FT_UNKNOWN;
- d->inode = pwd;
+ d->inode = ctx->pwd;
} else {
- d = erofs_rebuild_mkdir(pwd, s);
+ d = erofs_rebuild_mkdir(ctx->pwd, s);
if (IS_ERR(d))
return d;
- pwd = d->inode;
+ ctx->pwd = d->inode;
}
}
if (slash) {
@@ -267,6 +267,7 @@ static int erofs_rebuild_dirent_iter(struct erofs_dir_context *ctx)
{
struct erofs_rebuild_dir_context *rctx = (void *)ctx;
struct erofs_inode *mergedir = rctx->mergedir;
+ struct erofs_rebuild_getdentry_ctx dctx;
struct erofs_inode *dir = ctx->dir;
struct erofs_inode *inode, *candidate;
struct erofs_inode src;
@@ -286,8 +287,12 @@ static int erofs_rebuild_dirent_iter(struct erofs_dir_context *ctx)
erofs_dbg("parsing %s", path);
dname = path + strlen(mergedir->i_srcpath) + 1;
- d = erofs_rebuild_get_dentry(mergedir, dname, false,
- &dumb, &dumb, false);
+ dctx.pwd = mergedir;
+ dctx.path = dname;
+ dctx.aufs = false;
+ dctx.whout = dctx.opq = &dumb;
+ dctx.to_head = false;
+ d = erofs_rebuild_get_dentry(&dctx);
if (IS_ERR(d)) {
ret = PTR_ERR(d);
goto out;
@@ -435,6 +440,7 @@ int erofs_rebuild_load_tree(struct erofs_inode *root, struct erofs_sb_info *sbi,
static int erofs_rebuild_basedir_dirent_iter(struct erofs_dir_context *ctx)
{
struct erofs_rebuild_dir_context *rctx = (void *)ctx;
+ struct erofs_rebuild_getdentry_ctx dctx;
struct erofs_inode *dir = ctx->dir;
struct erofs_inode *mergedir = rctx->mergedir;
struct erofs_dentry *d;
@@ -448,8 +454,13 @@ static int erofs_rebuild_basedir_dirent_iter(struct erofs_dir_context *ctx)
dname = strndup(ctx->dname, ctx->de_namelen);
if (!dname)
return -ENOMEM;
- d = erofs_rebuild_get_dentry(mergedir, dname, false,
- &dumb, &dumb, false);
+
+ dctx.pwd = mergedir;
+ dctx.path = dname;
+ dctx.aufs = false;
+ dctx.whout = dctx.opq = &dumb;
+ dctx.to_head = false;
+ d = erofs_rebuild_get_dentry(&dctx);
if (IS_ERR(d)) {
ret = PTR_ERR(d);
goto out;
diff --git a/lib/tar.c b/lib/tar.c
index 990c6cb1b372..60f12cc539c9 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -657,6 +657,7 @@ int tarerofs_parse_tar(struct erofs_inode *root, struct erofs_tarfile *tar)
char path[PATH_MAX];
struct erofs_pax_header eh = tar->global;
struct erofs_sb_info *sbi = root->sbi;
+ struct erofs_rebuild_getdentry_ctx dctx;
bool whout, opq, e = false;
struct stat st;
erofs_off_t tar_offset, dataoff;
@@ -907,7 +908,13 @@ out_eot:
erofs_dbg("parsing %s (mode %05o)", eh.path, st.st_mode);
- d = erofs_rebuild_get_dentry(root, eh.path, tar->aufs, &whout, &opq, true);
+ dctx.pwd = root;
+ dctx.path = eh.path;
+ dctx.aufs = tar->aufs;
+ dctx.whout = &whout;
+ dctx.opq = &opq;
+ dctx.to_head = true;
+ d = erofs_rebuild_get_dentry(&dctx);
if (IS_ERR(d)) {
ret = PTR_ERR(d);
goto out;
@@ -945,8 +952,12 @@ out_eot:
}
d->inode = NULL;
- d2 = erofs_rebuild_get_dentry(root, eh.link, tar->aufs,
- &dumb, &dumb, false);
+ dctx.pwd = root;
+ dctx.path = eh.link;
+ dctx.aufs = tar->aufs;
+ dctx.whout = dctx.opq = &dumb;
+ dctx.to_head = false;
+ d2 = erofs_rebuild_get_dentry(&dctx);
if (IS_ERR(d2)) {
ret = PTR_ERR(d2);
goto out;
--
2.43.5
More information about the Linux-erofs
mailing list