[PATCH 2/3] erofs-utils: avoid `.` dirent insertion if dot_omitted is enabled

Gao Xiang hsiangkao at linux.alibaba.com
Thu Jul 31 13:16:41 AEST 2025


It's also used for the upcoming sort optimization.

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/inode.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/lib/inode.c b/lib/inode.c
index cbce712b..59031144 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -235,12 +235,15 @@ static int erofs_prepare_dir_file(struct erofs_inode *dir,
 	unsigned int i;
 	unsigned int d_size = 0;
 
-	/* dot is pointed to the current dir inode */
-	d = erofs_d_alloc(dir, ".");
-	if (IS_ERR(d))
-		return PTR_ERR(d);
-	d->inode = erofs_igrab(dir);
-	d->type = EROFS_FT_DIR;
+	if (!dot_omitted) {
+		/* dot is pointed to the current dir inode */
+		d = erofs_d_alloc(dir, ".");
+		if (IS_ERR(d))
+			return PTR_ERR(d);
+		d->inode = erofs_igrab(dir);
+		d->type = EROFS_FT_DIR;
+	}
+	dir->dot_omitted = dot_omitted;
 
 	/* dotdot is pointed to the parent dir */
 	d = erofs_d_alloc(dir, "..");
@@ -249,24 +252,17 @@ static int erofs_prepare_dir_file(struct erofs_inode *dir,
 	d->inode = erofs_igrab(erofs_parent_inode(dir));
 	d->type = EROFS_FT_DIR;
 
-	nr_subdirs += 2;
-
+	nr_subdirs += 1 + !dot_omitted;
 	sorted_d = malloc(nr_subdirs * sizeof(d));
 	if (!sorted_d)
 		return -ENOMEM;
 
-	dir->dot_omitted = dot_omitted;
 	i = 0;
 	list_for_each_entry_safe(d, n, &dir->i_subdirs, d_child) {
 		list_del(&d->d_child);
-		if (dot_omitted && !strcmp(d->name, ".")) {
-			erofs_iput(d->inode);
-			free(d);
-			continue;
-		}
 		sorted_d[i++] = d;
 	}
-	DBG_BUGON(i + dot_omitted != nr_subdirs);
+	DBG_BUGON(i != nr_subdirs);
 	qsort(sorted_d, i, sizeof(d), comp_subdir);
 	while (i)
 		list_add(&sorted_d[--i]->d_child, &dir->i_subdirs);
-- 
2.43.5



More information about the Linux-erofs mailing list