[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