]> Pileus Git - ~andy/linux/blobdiff - fs/ncpfs/inode.c
ncpfs: rcu-delay unload_nls() and freeing ncp_server
[~andy/linux] / fs / ncpfs / inode.c
index 4659da67e7f6d0efa17f06934ed9f7200c3dadfd..2cf2ebecb55f30993eda3dd4dac1dca5b2aa3584 100644 (file)
@@ -782,6 +782,17 @@ out:
        return error;
 }
 
+static void delayed_free(struct rcu_head *p)
+{
+       struct ncp_server *server = container_of(p, struct ncp_server, rcu);
+#ifdef CONFIG_NCPFS_NLS
+       /* unload the NLS charsets */
+       unload_nls(server->nls_vol);
+       unload_nls(server->nls_io);
+#endif /* CONFIG_NCPFS_NLS */
+       kfree(server);
+}
+
 static void ncp_put_super(struct super_block *sb)
 {
        struct ncp_server *server = NCP_SBP(sb);
@@ -792,11 +803,6 @@ static void ncp_put_super(struct super_block *sb)
 
        ncp_stop_tasks(server);
 
-#ifdef CONFIG_NCPFS_NLS
-       /* unload the NLS charsets */
-       unload_nls(server->nls_vol);
-       unload_nls(server->nls_io);
-#endif /* CONFIG_NCPFS_NLS */
        mutex_destroy(&server->rcv.creq_mutex);
        mutex_destroy(&server->root_setup_lock);
        mutex_destroy(&server->mutex);
@@ -813,8 +819,7 @@ static void ncp_put_super(struct super_block *sb)
        vfree(server->rxbuf);
        vfree(server->txbuf);
        vfree(server->packet);
-       sb->s_fs_info = NULL;
-       kfree(server);
+       call_rcu(&server->rcu, delayed_free);
 }
 
 static int ncp_statfs(struct dentry *dentry, struct kstatfs *buf)