瀏覽代碼

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>
Al Viro 12 年之前
父節點
當前提交
baa40671d3
共有 2 個文件被更改,包括 5 次插入9 次删除
  1. 1 0
      fs/autofs4/autofs_i.h
  2. 4 9
      fs/autofs4/inode.c

+ 1 - 0
fs/autofs4/autofs_i.h

@@ -122,6 +122,7 @@ struct autofs_sb_info {
 	spinlock_t lookup_lock;
 	spinlock_t lookup_lock;
 	struct list_head active_list;
 	struct list_head active_list;
 	struct list_head expiring_list;
 	struct list_head expiring_list;
+	struct rcu_head rcu;
 };
 };
 
 
 static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
 static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)

+ 4 - 9
fs/autofs4/inode.c

@@ -56,18 +56,13 @@ void autofs4_kill_sb(struct super_block *sb)
 	 * just call kill_anon_super when we are called from
 	 * just call kill_anon_super when we are called from
 	 * deactivate_super.
 	 * 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");
 	DPRINTK("shutting down");
 	kill_litter_super(sb);
 	kill_litter_super(sb);
+	if (sbi)
+		kfree_rcu(sbi, rcu);
 }
 }
 
 
 static int autofs4_show_options(struct seq_file *m, struct dentry *root)
 static int autofs4_show_options(struct seq_file *m, struct dentry *root)