summaryrefslogtreecommitdiff
path: root/net/sunrpc/svc.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2011-05-09 15:22:55 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-05-27 17:42:47 -0400
commit7402ab19cdd5943c7dd4f3399afe3abda8077ef5 (patch)
tree70c2a418124011a1c8337ec6b221c945846b3f4a /net/sunrpc/svc.c
parentda09eb93033e7204cb3e3f3140b46cf108c42c8f (diff)
downloadlinux-rpi3-7402ab19cdd5943c7dd4f3399afe3abda8077ef5.tar.gz
linux-rpi3-7402ab19cdd5943c7dd4f3399afe3abda8077ef5.tar.bz2
linux-rpi3-7402ab19cdd5943c7dd4f3399afe3abda8077ef5.zip
SUNRPC: Use AF_LOCAL for rpcbind upcalls
As libtirpc does in user space, have our registration API try using an AF_LOCAL transport first when registering and unregistering. This means we don't chew up privileged ports, and our registration is bound to an "owner" (the effective uid of the process on the sending end of the transport). Only that "owner" may unregister the service. The kernel could probe rpcbind via an rpcbind query to determine whether rpcbind has an AF_LOCAL service. For simplicity, we use the same technique that libtirpc uses: simply fail over to network loopback if creating an AF_LOCAL transport to the well-known rpcbind service socket fails. This means we open-code the pathname of the rpcbind socket in the kernel. For now we have to do that anyway because the kernel's RPC over AF_LOCAL implementation does not support autobind. That may be undesirable in the long term. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/svc.c')
-rw-r--r--net/sunrpc/svc.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 08e05a8ce025..2b90292e9505 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -942,6 +942,8 @@ static void svc_unregister(const struct svc_serv *serv)
if (progp->pg_vers[i]->vs_hidden)
continue;
+ dprintk("svc: attempting to unregister %sv%u\n",
+ progp->pg_name, i);
__svc_unregister(progp->pg_prog, i, progp->pg_name);
}
}