From 1263a74aff28f969043c89d0235b332529df4a30 Mon Sep 17 00:00:00 2001 From: Grant Erickson Date: Sat, 14 Jun 2008 01:46:29 +1000 Subject: mkfs.jffs2: Remove Incorrect Find Optimization 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 Signed-off-by: Josh Boyer --- mkfs.jffs2.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'mkfs.jffs2.c') 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; -- cgit v1.2.3