[PATCH] [MTD-UTILS] mkfs.jffs2: Remove Incorrect Find Optimization

Grant Erickson gerickson at nuovations.com
Fri Jun 13 11:46:29 EDT 2008


Remove performance optimization in find_filesystem_entry that prevented 
the successful simultaneous use of --root and --devtable where the 
latter is only used to fix-up permissions and ownership and to create 
device nodes.

As it stood, the performance optimization prevented a successful find 
where directory recursion was required or where the file being searched 
for had any mode permission bits set.

See http://lists.infradead.org/pipermail/linux-mtd/2008-June/021997.html
for additional information.

Signed-off-by: Grant Erickson <gerickson at nuovations.com>
---
 mkfs.jffs2.c |   39 ++++++++++++++++++---------------------
 1 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/mkfs.jffs2.c b/mkfs.jffs2.c
index cdf2a5a..f042ae7 100644
--- a/mkfs.jffs2.c
+++ b/mkfs.jffs2.c
@@ -276,30 +276,27 @@ static struct filesystem_entry *find_filesystem_entry(
 		e = dir->files;
 	}
 	while (e) {
-		/* Only bother to do the expensive strcmp on matching file types */
-		if (type == (e->sb.st_mode & S_IFMT)) {
-			if (S_ISDIR(e->sb.st_mode)) {
-				int len = strlen(e->fullname);
-
-				/* Check if we are a parent of the correct path */
-				if (strncmp(e->fullname, fullname, len) == 0) {
-					/* Is this an _exact_ match? */
-					if (strcmp(fullname, e->fullname) == 0) {
-						return (e);
-					}
-					/* Looks like we found a parent of the correct path */
-					if (fullname[len] == '/') {
-						if (e->files) {
-							return (find_filesystem_entry (e, fullname, type));
-						} else {
-							return NULL;
-						}
-					}
-				}
-			} else {
+		if (S_ISDIR(e->sb.st_mode)) {
+			int len = strlen(e->fullname);
+
+			/* Check if we are a parent of the correct path */
+			if (strncmp(e->fullname, fullname, len) == 0) {
+				/* Is this an _exact_ match? */
 				if (strcmp(fullname, e->fullname) == 0) {
 					return (e);
 				}
+				/* Looks like we found a parent of the correct path */
+				if (fullname[len] == '/') {
+					if (e->files) {
+						return (find_filesystem_entry (e, fullname, type));
+					} else {
+						return NULL;
+					}
+				}
+			}
+		} else {
+			if (strcmp(fullname, e->fullname) == 0) {
+				return (e);
 			}
 		}
 		e = e->next;
-- 
1.5.4.3




More information about the linux-mtd mailing list