提交 977ac315 编写于 作者: S Stanislav Kinsbursky 提交者: Trond Myklebust

SUNRPC: register rpcbind programs in passed network namespase context

Registering rpcbind program requires rpcbind clients, which are per network
namespace context.
Signed-off-by: NStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 c2550e07
...@@ -138,8 +138,9 @@ void rpc_task_release_client(struct rpc_task *); ...@@ -138,8 +138,9 @@ void rpc_task_release_client(struct rpc_task *);
int rpcb_create_local(void); int rpcb_create_local(void);
void rpcb_put_local(void); void rpcb_put_local(void);
int rpcb_register(u32, u32, int, unsigned short); int rpcb_register(struct net *, u32, u32, int, unsigned short);
int rpcb_v4_register(const u32 program, const u32 version, int rpcb_v4_register(struct net *net, const u32 program,
const u32 version,
const struct sockaddr *address, const struct sockaddr *address,
const char *netid); const char *netid);
void rpcb_getport_async(struct rpc_task *); void rpcb_getport_async(struct rpc_task *);
......
...@@ -425,7 +425,7 @@ static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg) ...@@ -425,7 +425,7 @@ static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg)
* IN6ADDR_ANY (ie available for all AF_INET and AF_INET6 * IN6ADDR_ANY (ie available for all AF_INET and AF_INET6
* addresses). * addresses).
*/ */
int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port) int rpcb_register(struct net *net, u32 prog, u32 vers, int prot, unsigned short port)
{ {
struct rpcbind_args map = { struct rpcbind_args map = {
.r_prog = prog, .r_prog = prog,
...@@ -436,7 +436,7 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port) ...@@ -436,7 +436,7 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port)
struct rpc_message msg = { struct rpc_message msg = {
.rpc_argp = &map, .rpc_argp = &map,
}; };
struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id); struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " dprintk("RPC: %sregistering (%u, %u, %d, %u) with local "
"rpcbind\n", (port ? "" : "un"), "rpcbind\n", (port ? "" : "un"),
...@@ -563,7 +563,7 @@ static int rpcb_unregister_all_protofamilies(struct sunrpc_net *sn, ...@@ -563,7 +563,7 @@ static int rpcb_unregister_all_protofamilies(struct sunrpc_net *sn,
* service on any IPv4 address, but not on IPv6. The latter * service on any IPv4 address, but not on IPv6. The latter
* advertises the service on all IPv4 and IPv6 addresses. * advertises the service on all IPv4 and IPv6 addresses.
*/ */
int rpcb_v4_register(const u32 program, const u32 version, int rpcb_v4_register(struct net *net, const u32 program, const u32 version,
const struct sockaddr *address, const char *netid) const struct sockaddr *address, const char *netid)
{ {
struct rpcbind_args map = { struct rpcbind_args map = {
...@@ -575,7 +575,7 @@ int rpcb_v4_register(const u32 program, const u32 version, ...@@ -575,7 +575,7 @@ int rpcb_v4_register(const u32 program, const u32 version,
struct rpc_message msg = { struct rpc_message msg = {
.rpc_argp = &map, .rpc_argp = &map,
}; };
struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id); struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
if (sn->rpcb_local_clnt4 == NULL) if (sn->rpcb_local_clnt4 == NULL)
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
......
...@@ -818,7 +818,7 @@ static int __svc_rpcb_register4(const u32 program, const u32 version, ...@@ -818,7 +818,7 @@ static int __svc_rpcb_register4(const u32 program, const u32 version,
return -ENOPROTOOPT; return -ENOPROTOOPT;
} }
error = rpcb_v4_register(program, version, error = rpcb_v4_register(&init_net, program, version,
(const struct sockaddr *)&sin, netid); (const struct sockaddr *)&sin, netid);
/* /*
...@@ -826,7 +826,7 @@ static int __svc_rpcb_register4(const u32 program, const u32 version, ...@@ -826,7 +826,7 @@ static int __svc_rpcb_register4(const u32 program, const u32 version,
* registration request with the legacy rpcbind v2 protocol. * registration request with the legacy rpcbind v2 protocol.
*/ */
if (error == -EPROTONOSUPPORT) if (error == -EPROTONOSUPPORT)
error = rpcb_register(program, version, protocol, port); error = rpcb_register(&init_net, program, version, protocol, port);
return error; return error;
} }
...@@ -865,7 +865,7 @@ static int __svc_rpcb_register6(const u32 program, const u32 version, ...@@ -865,7 +865,7 @@ static int __svc_rpcb_register6(const u32 program, const u32 version,
return -ENOPROTOOPT; return -ENOPROTOOPT;
} }
error = rpcb_v4_register(program, version, error = rpcb_v4_register(&init_net, program, version,
(const struct sockaddr *)&sin6, netid); (const struct sockaddr *)&sin6, netid);
/* /*
...@@ -968,14 +968,14 @@ static void __svc_unregister(const u32 program, const u32 version, ...@@ -968,14 +968,14 @@ static void __svc_unregister(const u32 program, const u32 version,
{ {
int error; int error;
error = rpcb_v4_register(program, version, NULL, ""); error = rpcb_v4_register(&init_net, program, version, NULL, "");
/* /*
* User space didn't support rpcbind v4, so retry this * User space didn't support rpcbind v4, so retry this
* request with the legacy rpcbind v2 protocol. * request with the legacy rpcbind v2 protocol.
*/ */
if (error == -EPROTONOSUPPORT) if (error == -EPROTONOSUPPORT)
error = rpcb_register(program, version, 0, 0); error = rpcb_register(&init_net, program, version, 0, 0);
dprintk("svc: %s(%sv%u), error %d\n", dprintk("svc: %s(%sv%u), error %d\n",
__func__, progname, version, error); __func__, progname, version, error);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册