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
		Add a link
		
	
		Reference in a new issue