reconnect_one(): use lookup_one_len_unlocked()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 14 Apr 2016 23:12:42 +0000 (19:12 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 2 May 2016 23:47:24 +0000 (19:47 -0400)
... and explain the non-obvious logics in case when lookup yields
a different dentry.

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

index c46f1a190b8d9ecedd8157530ecfc3ec9ccf16c4..402c5caab5ca8723ff344fa9bdeed17718ae5fff 100644 (file)
@@ -143,14 +143,18 @@ static struct dentry *reconnect_one(struct vfsmount *mnt,
        if (err)
                goto out_err;
        dprintk("%s: found name: %s\n", __func__, nbuf);
-       inode_lock(parent->d_inode);
-       tmp = lookup_one_len(nbuf, parent, strlen(nbuf));
-       inode_unlock(parent->d_inode);
+       tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf));
        if (IS_ERR(tmp)) {
                dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp));
                goto out_err;
        }
        if (tmp != dentry) {
+               /*
+                * Somebody has renamed it since exportfs_get_name();
+                * great, since it could've only been renamed if it
+                * got looked up and thus connected, and it would
+                * remain connected afterwards.  We are done.
+                */
                dput(tmp);
                goto out_reconnected;
        }