aboutsummaryrefslogtreecommitdiffstats
path: root/fs/autofs4/root.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/autofs4/root.c')
-rw-r--r--fs/autofs4/root.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
index 9194e274f849..dbd95512808c 100644
--- a/fs/autofs4/root.c
+++ b/fs/autofs4/root.c
@@ -36,7 +36,7 @@ static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long);
36static int autofs4_dir_open(struct inode *inode, struct file *file); 36static int autofs4_dir_open(struct inode *inode, struct file *file);
37static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); 37static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *);
38static struct vfsmount *autofs4_d_automount(struct path *); 38static struct vfsmount *autofs4_d_automount(struct path *);
39static int autofs4_d_manage(struct dentry *, bool); 39static int autofs4_d_manage(struct dentry *, bool, bool);
40 40
41const struct file_operations autofs4_root_operations = { 41const struct file_operations autofs4_root_operations = {
42 .open = dcache_dir_open, 42 .open = dcache_dir_open,
@@ -450,7 +450,7 @@ done:
450 return NULL; 450 return NULL;
451} 451}
452 452
453int autofs4_d_manage(struct dentry *dentry, bool mounting_here) 453int autofs4_d_manage(struct dentry *dentry, bool mounting_here, bool rcu_walk)
454{ 454{
455 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); 455 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
456 456
@@ -464,6 +464,10 @@ int autofs4_d_manage(struct dentry *dentry, bool mounting_here)
464 return 0; 464 return 0;
465 } 465 }
466 466
467 /* We need to sleep, so we need pathwalk to be in ref-mode */
468 if (rcu_walk)
469 return -ECHILD;
470
467 /* Wait for pending expires */ 471 /* Wait for pending expires */
468 do_expire_wait(dentry); 472 do_expire_wait(dentry);
469 473