diff options
Diffstat (limited to 'fs/exportfs/expfs.c')
-rw-r--r-- | fs/exportfs/expfs.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index c46f1a190b8d..207ba8d627ca 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c | |||
@@ -143,14 +143,18 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, | |||
143 | if (err) | 143 | if (err) |
144 | goto out_err; | 144 | goto out_err; |
145 | dprintk("%s: found name: %s\n", __func__, nbuf); | 145 | dprintk("%s: found name: %s\n", __func__, nbuf); |
146 | inode_lock(parent->d_inode); | 146 | tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); |
147 | tmp = lookup_one_len(nbuf, parent, strlen(nbuf)); | ||
148 | inode_unlock(parent->d_inode); | ||
149 | if (IS_ERR(tmp)) { | 147 | if (IS_ERR(tmp)) { |
150 | dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); | 148 | dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); |
151 | goto out_err; | 149 | goto out_err; |
152 | } | 150 | } |
153 | if (tmp != dentry) { | 151 | if (tmp != dentry) { |
152 | /* | ||
153 | * Somebody has renamed it since exportfs_get_name(); | ||
154 | * great, since it could've only been renamed if it | ||
155 | * got looked up and thus connected, and it would | ||
156 | * remain connected afterwards. We are done. | ||
157 | */ | ||
154 | dput(tmp); | 158 | dput(tmp); |
155 | goto out_reconnected; | 159 | goto out_reconnected; |
156 | } | 160 | } |
@@ -308,7 +312,7 @@ static int get_name(const struct path *path, char *name, struct dentry *child) | |||
308 | goto out; | 312 | goto out; |
309 | 313 | ||
310 | error = -EINVAL; | 314 | error = -EINVAL; |
311 | if (!file->f_op->iterate) | 315 | if (!file->f_op->iterate && !file->f_op->iterate_shared) |
312 | goto out_close; | 316 | goto out_close; |
313 | 317 | ||
314 | buffer.sequence = 0; | 318 | buffer.sequence = 0; |