diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-03 12:46:44 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-24 23:43:27 -0400 |
commit | baa40671d3e3b590a33b2c0e022db61cbebf5c00 (patch) | |
tree | 7cf63d16ee78ed0fcb1a31f58de25ea4098fb636 /fs/autofs4 | |
parent | 2d1d9b5b5cc2d7d528a7cbf621d924de38b1b6b6 (diff) |
autofs4: make freeing sbi rcu-delayed
makes ->d_managed() safety in RCU mode independent from vfsmount_lock
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/autofs4')
-rw-r--r-- | fs/autofs4/autofs_i.h | 1 | ||||
-rw-r--r-- | fs/autofs4/inode.c | 13 |
2 files changed, 5 insertions, 9 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index ebab147e9700..4218e26df916 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -122,6 +122,7 @@ struct autofs_sb_info { | |||
122 | spinlock_t lookup_lock; | 122 | spinlock_t lookup_lock; |
123 | struct list_head active_list; | 123 | struct list_head active_list; |
124 | struct list_head expiring_list; | 124 | struct list_head expiring_list; |
125 | struct rcu_head rcu; | ||
125 | }; | 126 | }; |
126 | 127 | ||
127 | static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb) | 128 | static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb) |
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index b104726e2d0a..3b9cc9b973c2 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -56,18 +56,13 @@ void autofs4_kill_sb(struct super_block *sb) | |||
56 | * just call kill_anon_super when we are called from | 56 | * just call kill_anon_super when we are called from |
57 | * deactivate_super. | 57 | * deactivate_super. |
58 | */ | 58 | */ |
59 | if (!sbi) | 59 | if (sbi) /* Free wait queues, close pipe */ |
60 | goto out_kill_sb; | 60 | autofs4_catatonic_mode(sbi); |
61 | |||
62 | /* Free wait queues, close pipe */ | ||
63 | autofs4_catatonic_mode(sbi); | ||
64 | |||
65 | sb->s_fs_info = NULL; | ||
66 | kfree(sbi); | ||
67 | 61 | ||
68 | out_kill_sb: | ||
69 | DPRINTK("shutting down"); | 62 | DPRINTK("shutting down"); |
70 | kill_litter_super(sb); | 63 | kill_litter_super(sb); |
64 | if (sbi) | ||
65 | kfree_rcu(sbi, rcu); | ||
71 | } | 66 | } |
72 | 67 | ||
73 | static int autofs4_show_options(struct seq_file *m, struct dentry *root) | 68 | static int autofs4_show_options(struct seq_file *m, struct dentry *root) |