]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/sunrpc/sunrpc_syms.c
Merge branch 'master' into csb1725
[mv-sheeva.git] / net / sunrpc / sunrpc_syms.c
index c0d085013a2be26f7bf3f34e195cebfc0a716039..9d0809160994a7839c283bb4902fe537a5ee3999 100644 (file)
 #include <linux/sunrpc/rpc_pipe_fs.h>
 #include <linux/sunrpc/xprtsock.h>
 
-extern struct cache_detail ip_map_cache, unix_gid_cache;
+#include "netns.h"
+
+int sunrpc_net_id;
+
+static __net_init int sunrpc_init_net(struct net *net)
+{
+       int err;
+
+       err = rpc_proc_init(net);
+       if (err)
+               goto err_proc;
+
+       err = ip_map_cache_create(net);
+       if (err)
+               goto err_ipmap;
+
+       return 0;
+
+err_ipmap:
+       rpc_proc_exit(net);
+err_proc:
+       return err;
+}
+
+static __net_exit void sunrpc_exit_net(struct net *net)
+{
+       ip_map_cache_destroy(net);
+       rpc_proc_exit(net);
+}
+
+static struct pernet_operations sunrpc_net_ops = {
+       .init = sunrpc_init_net,
+       .exit = sunrpc_exit_net,
+       .id = &sunrpc_net_id,
+       .size = sizeof(struct sunrpc_net),
+};
+
+extern struct cache_detail unix_gid_cache;
 
 extern void cleanup_rpcb_clnt(void);
 
@@ -38,18 +75,22 @@ init_sunrpc(void)
        err = rpcauth_init_module();
        if (err)
                goto out3;
+
+       cache_initialize();
+
+       err = register_pernet_subsys(&sunrpc_net_ops);
+       if (err)
+               goto out4;
 #ifdef RPC_DEBUG
        rpc_register_sysctl();
 #endif
-#ifdef CONFIG_PROC_FS
-       rpc_proc_init();
-#endif
-       cache_initialize();
-       cache_register(&ip_map_cache);
        cache_register(&unix_gid_cache);
        svc_init_xprt_sock();   /* svc sock transport */
        init_socket_xprt();     /* clnt sock transport */
        return 0;
+
+out4:
+       rpcauth_remove_module();
 out3:
        rpc_destroy_mempool();
 out2:
@@ -67,13 +108,10 @@ cleanup_sunrpc(void)
        svc_cleanup_xprt_sock();
        unregister_rpc_pipefs();
        rpc_destroy_mempool();
-       cache_unregister(&ip_map_cache);
        cache_unregister(&unix_gid_cache);
+       unregister_pernet_subsys(&sunrpc_net_ops);
 #ifdef RPC_DEBUG
        rpc_unregister_sysctl();
-#endif
-#ifdef CONFIG_PROC_FS
-       rpc_proc_exit();
 #endif
        rcu_barrier(); /* Wait for completion of call_rcu()'s */
 }