autofs4: make freeing sbi rcu-delayed
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 3 Oct 2013 16:46:44 +0000 (12:46 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Oct 2013 03:43:27 +0000 (23:43 -0400)
makes ->d_managed() safety in RCU mode independent from vfsmount_lock

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/autofs4/autofs_i.h
fs/autofs4/inode.c

index ebab147e970038aace85ad1095220dbc6784f5df..4218e26df916245818272785203358b5cd8a130f 100644 (file)
@@ -122,6 +122,7 @@ struct autofs_sb_info {
        spinlock_t lookup_lock;
        struct list_head active_list;
        struct list_head expiring_list;
+       struct rcu_head rcu;
 };
 
 static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
index b104726e2d0a7dbdb998e3daa574ec5e0326138c..3b9cc9b973c25086992cb7e2273f1286a76f084c 100644 (file)
@@ -56,18 +56,13 @@ void autofs4_kill_sb(struct super_block *sb)
         * just call kill_anon_super when we are called from
         * deactivate_super.
         */
-       if (!sbi)
-               goto out_kill_sb;
-
-       /* Free wait queues, close pipe */
-       autofs4_catatonic_mode(sbi);
-
-       sb->s_fs_info = NULL;
-       kfree(sbi);
+       if (sbi) /* Free wait queues, close pipe */
+               autofs4_catatonic_mode(sbi);
 
-out_kill_sb:
        DPRINTK("shutting down");
        kill_litter_super(sb);
+       if (sbi)
+               kfree_rcu(sbi, rcu);
 }
 
 static int autofs4_show_options(struct seq_file *m, struct dentry *root)