untangling do_lookup() - take __lookup_hash()-calling case out of line.
Al Viro [Fri, 30 Mar 2012 18:48:04 +0000 (14:48 -0400)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/namei.c

index a919aff..5eeec56 100644 (file)
@@ -1208,22 +1208,14 @@ unlazy:
                dentry = __d_lookup(parent, name);
        }
 
-       if (dentry && unlikely(d_need_lookup(dentry))) {
+       if (unlikely(!dentry))
+               goto need_lookup;
+
+       if (unlikely(d_need_lookup(dentry))) {
                dput(dentry);
-               dentry = NULL;
+               goto need_lookup;
        }
-retry:
-       if (unlikely(!dentry)) {
-               struct inode *dir = parent->d_inode;
-               BUG_ON(nd->inode != dir);
 
-               mutex_lock(&dir->i_mutex);
-               dentry = __lookup_hash(name, parent, nd);
-               mutex_unlock(&dir->i_mutex);
-               if (IS_ERR(dentry))
-                       return PTR_ERR(dentry);
-               goto done;
-       }
        if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
                status = d_revalidate(dentry, nd);
        if (unlikely(status <= 0)) {
@@ -1233,8 +1225,7 @@ retry:
                }
                if (!d_invalidate(dentry)) {
                        dput(dentry);
-                       dentry = NULL;
-                       goto retry;
+                       goto need_lookup;
                }
        }
 done:
@@ -1249,6 +1240,16 @@ done:
                nd->flags |= LOOKUP_JUMPED;
        *inode = path->dentry->d_inode;
        return 0;
+
+need_lookup:
+       BUG_ON(nd->inode != parent->d_inode);
+
+       mutex_lock(&parent->d_inode->i_mutex);
+       dentry = __lookup_hash(name, parent, nd);
+       mutex_unlock(&parent->d_inode->i_mutex);
+       if (IS_ERR(dentry))
+               return PTR_ERR(dentry);
+       goto done;
 }
 
 static inline int may_lookup(struct nameidata *nd)