diff options
-rw-r--r-- | fs/autofs4/autofs_i.h | 7 | ||||
-rw-r--r-- | fs/autofs4/inode.c | 12 | ||||
-rw-r--r-- | fs/autofs4/root.c | 36 |
3 files changed, 26 insertions, 29 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index f4b4030cf406..c28085cb82a5 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -206,11 +206,8 @@ extern const struct inode_operations autofs4_symlink_inode_operations; | |||
206 | extern const struct inode_operations autofs4_dir_inode_operations; | 206 | extern const struct inode_operations autofs4_dir_inode_operations; |
207 | extern const struct file_operations autofs4_dir_operations; | 207 | extern const struct file_operations autofs4_dir_operations; |
208 | extern const struct file_operations autofs4_root_operations; | 208 | extern const struct file_operations autofs4_root_operations; |
209 | 209 | extern const struct dentry_operations autofs4_dentry_operations; | |
210 | /* Operations methods */ | 210 | extern const struct dentry_operations autofs4_mount_dentry_operations; |
211 | |||
212 | struct vfsmount *autofs4_d_automount(struct path *); | ||
213 | int autofs4_d_manage(struct dentry *, bool); | ||
214 | 211 | ||
215 | /* VFS automount flags management functions */ | 212 | /* VFS automount flags management functions */ |
216 | 213 | ||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index dac3dc79ccb4..427c35746340 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -251,12 +251,6 @@ static struct autofs_info *autofs4_mkroot(struct autofs_sb_info *sbi) | |||
251 | return ino; | 251 | return ino; |
252 | } | 252 | } |
253 | 253 | ||
254 | static const struct dentry_operations autofs4_sb_dentry_operations = { | ||
255 | .d_automount = autofs4_d_automount, | ||
256 | .d_manage = autofs4_d_manage, | ||
257 | .d_release = autofs4_dentry_release, | ||
258 | }; | ||
259 | |||
260 | int autofs4_fill_super(struct super_block *s, void *data, int silent) | 254 | int autofs4_fill_super(struct super_block *s, void *data, int silent) |
261 | { | 255 | { |
262 | struct inode * root_inode; | 256 | struct inode * root_inode; |
@@ -311,7 +305,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
311 | goto fail_iput; | 305 | goto fail_iput; |
312 | pipe = NULL; | 306 | pipe = NULL; |
313 | 307 | ||
314 | d_set_d_op(root, &autofs4_sb_dentry_operations); | 308 | d_set_d_op(root, &autofs4_dentry_operations); |
315 | root->d_fsdata = ino; | 309 | root->d_fsdata = ino; |
316 | 310 | ||
317 | /* Can this call block? */ | 311 | /* Can this call block? */ |
@@ -322,8 +316,10 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
322 | goto fail_dput; | 316 | goto fail_dput; |
323 | } | 317 | } |
324 | 318 | ||
325 | if (autofs_type_trigger(sbi->type)) | 319 | if (autofs_type_trigger(sbi->type)) { |
320 | d_set_d_op(root, &autofs4_mount_dentry_operations); | ||
326 | __managed_dentry_set_managed(root); | 321 | __managed_dentry_set_managed(root); |
322 | } | ||
327 | 323 | ||
328 | root_inode->i_fop = &autofs4_root_operations; | 324 | root_inode->i_fop = &autofs4_root_operations; |
329 | root_inode->i_op = &autofs4_dir_inode_operations; | 325 | root_inode->i_op = &autofs4_dir_inode_operations; |
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 52af410a831d..62c1229a4d31 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
@@ -35,6 +35,8 @@ static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long); | |||
35 | #endif | 35 | #endif |
36 | static int autofs4_dir_open(struct inode *inode, struct file *file); | 36 | static int autofs4_dir_open(struct inode *inode, struct file *file); |
37 | static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); | 37 | static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); |
38 | static struct vfsmount *autofs4_d_automount(struct path *); | ||
39 | static int autofs4_d_manage(struct dentry *, bool); | ||
38 | 40 | ||
39 | const struct file_operations autofs4_root_operations = { | 41 | const struct file_operations autofs4_root_operations = { |
40 | .open = dcache_dir_open, | 42 | .open = dcache_dir_open, |
@@ -64,6 +66,18 @@ const struct inode_operations autofs4_dir_inode_operations = { | |||
64 | .rmdir = autofs4_dir_rmdir, | 66 | .rmdir = autofs4_dir_rmdir, |
65 | }; | 67 | }; |
66 | 68 | ||
69 | /* For dentries that don't initiate mounting */ | ||
70 | const struct dentry_operations autofs4_dentry_operations = { | ||
71 | .d_release = autofs4_dentry_release, | ||
72 | }; | ||
73 | |||
74 | /* For dentries that do initiate mounting */ | ||
75 | const struct dentry_operations autofs4_mount_dentry_operations = { | ||
76 | .d_automount = autofs4_d_automount, | ||
77 | .d_manage = autofs4_d_manage, | ||
78 | .d_release = autofs4_dentry_release, | ||
79 | }; | ||
80 | |||
67 | static void autofs4_add_active(struct dentry *dentry) | 81 | static void autofs4_add_active(struct dentry *dentry) |
68 | { | 82 | { |
69 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); | 83 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); |
@@ -158,18 +172,6 @@ void autofs4_dentry_release(struct dentry *de) | |||
158 | } | 172 | } |
159 | } | 173 | } |
160 | 174 | ||
161 | /* For dentries of directories in the root dir */ | ||
162 | static const struct dentry_operations autofs4_root_dentry_operations = { | ||
163 | .d_release = autofs4_dentry_release, | ||
164 | }; | ||
165 | |||
166 | /* For other dentries */ | ||
167 | static const struct dentry_operations autofs4_dentry_operations = { | ||
168 | .d_automount = autofs4_d_automount, | ||
169 | .d_manage = autofs4_d_manage, | ||
170 | .d_release = autofs4_dentry_release, | ||
171 | }; | ||
172 | |||
173 | static struct dentry *autofs4_lookup_active(struct dentry *dentry) | 175 | static struct dentry *autofs4_lookup_active(struct dentry *dentry) |
174 | { | 176 | { |
175 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); | 177 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); |
@@ -337,7 +339,7 @@ static struct dentry *autofs4_mountpoint_changed(struct path *path) | |||
337 | return path->dentry; | 339 | return path->dentry; |
338 | } | 340 | } |
339 | 341 | ||
340 | struct vfsmount *autofs4_d_automount(struct path *path) | 342 | static struct vfsmount *autofs4_d_automount(struct path *path) |
341 | { | 343 | { |
342 | struct dentry *dentry = path->dentry; | 344 | struct dentry *dentry = path->dentry; |
343 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); | 345 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); |
@@ -501,7 +503,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
501 | if (active) { | 503 | if (active) { |
502 | return active; | 504 | return active; |
503 | } else { | 505 | } else { |
504 | d_set_d_op(dentry, &autofs4_root_dentry_operations); | 506 | d_set_d_op(dentry, &autofs4_dentry_operations); |
505 | 507 | ||
506 | /* | 508 | /* |
507 | * A dentry that is not within the root can never trigger a | 509 | * A dentry that is not within the root can never trigger a |
@@ -514,7 +516,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
514 | 516 | ||
515 | /* Mark entries in the root as mount triggers */ | 517 | /* Mark entries in the root as mount triggers */ |
516 | if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) { | 518 | if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) { |
517 | d_set_d_op(dentry, &autofs4_dentry_operations); | 519 | d_set_d_op(dentry, &autofs4_mount_dentry_operations); |
518 | __managed_dentry_set_managed(dentry); | 520 | __managed_dentry_set_managed(dentry); |
519 | } | 521 | } |
520 | 522 | ||
@@ -573,6 +575,8 @@ static int autofs4_dir_symlink(struct inode *dir, | |||
573 | } | 575 | } |
574 | d_add(dentry, inode); | 576 | d_add(dentry, inode); |
575 | 577 | ||
578 | d_set_d_op(dentry, &autofs4_dentry_operations); | ||
579 | |||
576 | dentry->d_fsdata = ino; | 580 | dentry->d_fsdata = ino; |
577 | ino->dentry = dget(dentry); | 581 | ino->dentry = dget(dentry); |
578 | atomic_inc(&ino->count); | 582 | atomic_inc(&ino->count); |
@@ -791,7 +795,7 @@ static inline int autofs4_ask_umount(struct vfsmount *mnt, int __user *p) | |||
791 | int is_autofs4_dentry(struct dentry *dentry) | 795 | int is_autofs4_dentry(struct dentry *dentry) |
792 | { | 796 | { |
793 | return dentry && dentry->d_inode && | 797 | return dentry && dentry->d_inode && |
794 | (dentry->d_op == &autofs4_root_dentry_operations || | 798 | (dentry->d_op == &autofs4_mount_dentry_operations || |
795 | dentry->d_op == &autofs4_dentry_operations) && | 799 | dentry->d_op == &autofs4_dentry_operations) && |
796 | dentry->d_fsdata != NULL; | 800 | dentry->d_fsdata != NULL; |
797 | } | 801 | } |