lookup_one_len_unlocked(): use lookup_dcache()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 6 Mar 2016 03:31:50 +0000 (22:31 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 14 Mar 2016 04:15:36 +0000 (00:15 -0400)
No need to lock parent just because of ->d_revalidate() on child;
contrary to the stale comment, lookup_dcache() *can* be used without
locking the parent.  Result can be moved as soon as we return, of
course, but the same is true for lookup_one_len_unlocked() itself.

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

index 955e886..ae67335 100644 (file)
@@ -1444,8 +1444,6 @@ static int follow_dotdot(struct nameidata *nd)
  * This looks up the name in dcache, possibly revalidates the old dentry and
  * allocates a new one if not found or not valid.  In the need_lookup argument
  * returns whether i_op->lookup is necessary.
- *
- * dir->d_inode->i_mutex must be held
  */
 static struct dentry *lookup_dcache(struct qstr *name, struct dentry *dir,
                                    unsigned int flags)
@@ -2351,15 +2349,7 @@ struct dentry *lookup_one_len_unlocked(const char *name,
        if (err)
                return ERR_PTR(err);
 
-       /*
-        * __d_lookup() is used to try to get a quick answer and avoid the
-        * mutex.  A false-negative does no harm.
-        */
-       ret = __d_lookup(base, &this);
-       if (ret && unlikely(ret->d_flags & DCACHE_OP_REVALIDATE)) {
-               dput(ret);
-               ret = NULL;
-       }
+       ret = lookup_dcache(&this, base, 0);
        if (ret)
                return ret;