OSDN Git Service

SUNRPC: register rpcbind programs in passed network namespase context
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Fri, 13 Jan 2012 08:52:43 +0000 (12:52 +0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 1 Feb 2012 00:28:10 +0000 (19:28 -0500)
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>
include/linux/sunrpc/clnt.h
net/sunrpc/rpcb_clnt.c
net/sunrpc/svc.c

index bfd6185..b0b3e57 100644 (file)
@@ -138,8 +138,9 @@ void                rpc_task_release_client(struct rpc_task *);
 
 int            rpcb_create_local(void);
 void           rpcb_put_local(void);
-int            rpcb_register(u32, u32, int, unsigned short);
-int            rpcb_v4_register(const u32 program, const u32 version,
+int            rpcb_register(struct net *, u32, u32, int, unsigned short);
+int            rpcb_v4_register(struct net *net, const u32 program,
+                                const u32 version,
                                 const struct sockaddr *address,
                                 const char *netid);
 void           rpcb_getport_async(struct rpc_task *);
index 0d76c0f..a5aa50d 100644 (file)
@@ -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
  * 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 = {
                .r_prog         = prog,
@@ -436,7 +436,7 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port)
        struct rpc_message msg = {
                .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 "
                        "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
  * 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)
 {
        struct rpcbind_args map = {
@@ -575,7 +575,7 @@ int rpcb_v4_register(const u32 program, const u32 version,
        struct rpc_message msg = {
                .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)
                return -EPROTONOSUPPORT;
index e4aabc0..889d7b1 100644 (file)
@@ -818,7 +818,7 @@ static int __svc_rpcb_register4(const u32 program, const u32 version,
                return -ENOPROTOOPT;
        }
 
-       error = rpcb_v4_register(program, version,
+       error = rpcb_v4_register(&init_net, program, version,
                                        (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.
         */
        if (error == -EPROTONOSUPPORT)
-               error = rpcb_register(program, version, protocol, port);
+               error = rpcb_register(&init_net, program, version, protocol, port);
 
        return error;
 }
@@ -865,7 +865,7 @@ static int __svc_rpcb_register6(const u32 program, const u32 version,
                return -ENOPROTOOPT;
        }
 
-       error = rpcb_v4_register(program, version,
+       error = rpcb_v4_register(&init_net, program, version,
                                        (const struct sockaddr *)&sin6, netid);
 
        /*
@@ -968,14 +968,14 @@ static void __svc_unregister(const u32 program, const u32 version,
 {
        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
         * request with the legacy rpcbind v2 protocol.
         */
        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",
                        __func__, progname, version, error);