浏览代码

sunrpc: The per-net skeleton

Register empty per-net operations for the sunrpc layer.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Pavel Emelyanov 14 年之前
父节点
当前提交
2f72c9b737
共有 2 个文件被更改,包括 42 次插入1 次删除
  1. 12 0
      net/sunrpc/netns.h
  2. 30 1
      net/sunrpc/sunrpc_syms.c

+ 12 - 0
net/sunrpc/netns.h

@@ -0,0 +1,12 @@
+#ifndef __SUNRPC_NETNS_H__
+#define __SUNRPC_NETNS_H__
+
+#include <net/net_namespace.h>
+#include <net/netns/generic.h>
+
+struct sunrpc_net {
+};
+
+extern int sunrpc_net_id;
+
+#endif

+ 30 - 1
net/sunrpc/sunrpc_syms.c

@@ -22,6 +22,26 @@
 #include <linux/sunrpc/rpc_pipe_fs.h>
 #include <linux/sunrpc/rpc_pipe_fs.h>
 #include <linux/sunrpc/xprtsock.h>
 #include <linux/sunrpc/xprtsock.h>
 
 
+#include "netns.h"
+
+int sunrpc_net_id;
+
+static __net_init int sunrpc_init_net(struct net *net)
+{
+	return 0;
+}
+
+static __net_exit void sunrpc_exit_net(struct net *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 ip_map_cache, unix_gid_cache;
 extern struct cache_detail ip_map_cache, unix_gid_cache;
 
 
 extern void cleanup_rpcb_clnt(void);
 extern void cleanup_rpcb_clnt(void);
@@ -38,18 +58,26 @@ init_sunrpc(void)
 	err = rpcauth_init_module();
 	err = rpcauth_init_module();
 	if (err)
 	if (err)
 		goto out3;
 		goto out3;
+
+	cache_initialize();
+
+	err = register_pernet_subsys(&sunrpc_net_ops);
+	if (err)
+		goto out4;
 #ifdef RPC_DEBUG
 #ifdef RPC_DEBUG
 	rpc_register_sysctl();
 	rpc_register_sysctl();
 #endif
 #endif
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 	rpc_proc_init();
 	rpc_proc_init();
 #endif
 #endif
-	cache_initialize();
 	cache_register(&ip_map_cache);
 	cache_register(&ip_map_cache);
 	cache_register(&unix_gid_cache);
 	cache_register(&unix_gid_cache);
 	svc_init_xprt_sock();	/* svc sock transport */
 	svc_init_xprt_sock();	/* svc sock transport */
 	init_socket_xprt();	/* clnt sock transport */
 	init_socket_xprt();	/* clnt sock transport */
 	return 0;
 	return 0;
+
+out4:
+	rpcauth_remove_module();
 out3:
 out3:
 	rpc_destroy_mempool();
 	rpc_destroy_mempool();
 out2:
 out2:
@@ -69,6 +97,7 @@ cleanup_sunrpc(void)
 	rpc_destroy_mempool();
 	rpc_destroy_mempool();
 	cache_unregister(&ip_map_cache);
 	cache_unregister(&ip_map_cache);
 	cache_unregister(&unix_gid_cache);
 	cache_unregister(&unix_gid_cache);
+	unregister_pernet_subsys(&sunrpc_net_ops);
 #ifdef RPC_DEBUG
 #ifdef RPC_DEBUG
 	rpc_unregister_sysctl();
 	rpc_unregister_sysctl();
 #endif
 #endif