mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-08 07:38:10 +00:00
SUNRPC: register rpcbind programs in passed network namespase context
Registering rpcbind program requires rpcbind clients, which are per network namespace context. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
c2550e07a6
commit
977ac31573
3 changed files with 12 additions and 11 deletions
|
@ -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)
|
||||||
* 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)
|
||||||
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,
|
||||||
* 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,
|
||||||
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,
|
||||||
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,
|
||||||
* 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,
|
||||||
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,
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue