lookup_fast(): clean up the logics around the fallback to non-rcu mode
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Jan 2017 06:35:39 +0000 (01:35 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Jan 2017 06:35:39 +0000 (01:35 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index f08eca2..dfe6e32 100644 (file)
@@ -1558,12 +1558,7 @@ static int lookup_fast(struct nameidata *nd,
                *seqp = seq;
                if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
                        status = d_revalidate(dentry, nd->flags);
-               if (unlikely(status <= 0)) {
-                       if (unlazy_walk(nd, dentry, seq))
-                               return -ECHILD;
-                       if (status == -ECHILD)
-                               status = d_revalidate(dentry, nd->flags);
-               } else {
+               if (likely(status > 0)) {
                        /*
                         * Note: do negative dentry check after revalidation in
                         * case that drops it.
@@ -1574,9 +1569,12 @@ static int lookup_fast(struct nameidata *nd,
                        path->dentry = dentry;
                        if (likely(__follow_mount_rcu(nd, path, inode, seqp)))
                                return 1;
-                       if (unlazy_walk(nd, dentry, seq))
-                               return -ECHILD;
                }
+               if (unlazy_walk(nd, dentry, seq))
+                       return -ECHILD;
+               if (unlikely(status == -ECHILD))
+                       /* we'd been told to redo it in non-rcu mode */
+                       status = d_revalidate(dentry, nd->flags);
        } else {
                dentry = __d_lookup(parent, &nd->last);
                if (unlikely(!dentry))