untangling do_lookup() - massage !dentry case towards __lookup_hash()
Al Viro [Fri, 30 Mar 2012 18:34:00 +0000 (14:34 -0400)]
Reorder if-else cases for starters...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/namei.c

index 14bb00a..5414438 100644 (file)
@@ -1174,39 +1174,34 @@ retry:
 
                mutex_lock(&dir->i_mutex);
                dentry = d_lookup(parent, name);
-               if (likely(!dentry)) {
-                       dentry = d_alloc_and_lookup(parent, name, nd);
-                       if (IS_ERR(dentry)) {
-                               mutex_unlock(&dir->i_mutex);
-                               return PTR_ERR(dentry);
-                       }
-                       /* known good */
-                       status = 1;
-               } else if (unlikely(d_need_lookup(dentry))) {
+               if (dentry && d_need_lookup(dentry)) {
                        dentry = d_inode_lookup(parent, dentry, nd);
                        if (IS_ERR(dentry)) {
                                mutex_unlock(&dir->i_mutex);
                                return PTR_ERR(dentry);
                        }
-                       /* known good */
-                       status = 1;
-               } else if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
+               } else if (dentry && (dentry->d_flags & DCACHE_OP_REVALIDATE)) {
                        status = d_revalidate(dentry, nd);
-               if (unlikely(status <= 0)) {
-                       if (status < 0) {
-                               mutex_unlock(&dir->i_mutex);
-                               dput(dentry);
-                               return status;
-                       }
-                       if (!d_invalidate(dentry)) {
-                               dput(dentry);
-                               dentry = d_alloc_and_lookup(parent, name, nd);
-                               if (IS_ERR(dentry)) {
+                       if (unlikely(status <= 0)) {
+                               if (status < 0) {
                                        mutex_unlock(&dir->i_mutex);
-                                       return PTR_ERR(dentry);
+                                       dput(dentry);
+                                       return status;
                                }
-                               /* known good */
-                               status = 1;
+                               if (!d_invalidate(dentry)) {
+                                       dput(dentry);
+                                       dentry = d_alloc_and_lookup(parent, name, nd);
+                                       if (IS_ERR(dentry)) {
+                                               mutex_unlock(&dir->i_mutex);
+                                               return PTR_ERR(dentry);
+                                       }
+                               }
+                       }
+               } else if (!dentry) {
+                       dentry = d_alloc_and_lookup(parent, name, nd);
+                       if (IS_ERR(dentry)) {
+                               mutex_unlock(&dir->i_mutex);
+                               return PTR_ERR(dentry);
                        }
                }
                mutex_unlock(&dir->i_mutex);