diff options
Diffstat (limited to 'fs/autofs4/root.c')
-rw-r--r-- | fs/autofs4/root.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 3765c047f157..2a771ec66956 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
@@ -205,7 +205,11 @@ static int autofs4_dir_open(struct inode *inode, struct file *file) | |||
205 | struct vfsmount *fp_mnt = mntget(mnt); | 205 | struct vfsmount *fp_mnt = mntget(mnt); |
206 | struct dentry *fp_dentry = dget(dentry); | 206 | struct dentry *fp_dentry = dget(dentry); |
207 | 207 | ||
208 | while (follow_down(&fp_mnt, &fp_dentry) && d_mountpoint(fp_dentry)); | 208 | if (!autofs4_follow_mount(&fp_mnt, &fp_dentry)) { |
209 | dput(fp_dentry); | ||
210 | mntput(fp_mnt); | ||
211 | return -ENOENT; | ||
212 | } | ||
209 | 213 | ||
210 | fp = dentry_open(fp_dentry, fp_mnt, file->f_flags); | 214 | fp = dentry_open(fp_dentry, fp_mnt, file->f_flags); |
211 | status = PTR_ERR(fp); | 215 | status = PTR_ERR(fp); |
@@ -302,7 +306,14 @@ static int try_to_fill_dentry(struct dentry *dentry, | |||
302 | 306 | ||
303 | DPRINTK("expire done status=%d", status); | 307 | DPRINTK("expire done status=%d", status); |
304 | 308 | ||
305 | return 0; | 309 | /* |
310 | * If the directory still exists the mount request must | ||
311 | * continue otherwise it can't be followed at the right | ||
312 | * time during the walk. | ||
313 | */ | ||
314 | status = d_invalidate(dentry); | ||
315 | if (status != -EBUSY) | ||
316 | return 0; | ||
306 | } | 317 | } |
307 | 318 | ||
308 | DPRINTK("dentry=%p %.*s ino=%p", | 319 | DPRINTK("dentry=%p %.*s ino=%p", |