SUNRPC: fix bug in patch "portmapper doesn't need a reserved port"
The in-kernel portmapper does in fact need a reserved port when registering new services, but not when performing bind queries. Ensure that we distinguish between the two cases. Signed-off-by: Chuck Lever <cel@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
f134585a73
commit
6cd7525a00
@ -26,7 +26,7 @@
|
||||
#define PMAP_GETPORT 3
|
||||
|
||||
static struct rpc_procinfo pmap_procedures[];
|
||||
static struct rpc_clnt * pmap_create(char *, struct sockaddr_in *, int);
|
||||
static struct rpc_clnt * pmap_create(char *, struct sockaddr_in *, int, int);
|
||||
static void pmap_getport_done(struct rpc_task *);
|
||||
static struct rpc_program pmap_program;
|
||||
static DEFINE_SPINLOCK(pmap_lock);
|
||||
@ -65,7 +65,7 @@ rpc_getport(struct rpc_task *task, struct rpc_clnt *clnt)
|
||||
map->pm_binding = 1;
|
||||
spin_unlock(&pmap_lock);
|
||||
|
||||
pmap_clnt = pmap_create(clnt->cl_server, sap, map->pm_prot);
|
||||
pmap_clnt = pmap_create(clnt->cl_server, sap, map->pm_prot, 0);
|
||||
if (IS_ERR(pmap_clnt)) {
|
||||
task->tk_status = PTR_ERR(pmap_clnt);
|
||||
goto bailout;
|
||||
@ -112,7 +112,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
|
||||
NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot);
|
||||
|
||||
sprintf(hostname, "%u.%u.%u.%u", NIPQUAD(sin->sin_addr.s_addr));
|
||||
pmap_clnt = pmap_create(hostname, sin, prot);
|
||||
pmap_clnt = pmap_create(hostname, sin, prot, 0);
|
||||
if (IS_ERR(pmap_clnt))
|
||||
return PTR_ERR(pmap_clnt);
|
||||
|
||||
@ -171,7 +171,7 @@ rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
|
||||
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP);
|
||||
pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1);
|
||||
if (IS_ERR(pmap_clnt)) {
|
||||
error = PTR_ERR(pmap_clnt);
|
||||
dprintk("RPC: couldn't create pmap client. Error = %d\n", error);
|
||||
@ -198,7 +198,7 @@ rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
|
||||
}
|
||||
|
||||
static struct rpc_clnt *
|
||||
pmap_create(char *hostname, struct sockaddr_in *srvaddr, int proto)
|
||||
pmap_create(char *hostname, struct sockaddr_in *srvaddr, int proto, int privileged)
|
||||
{
|
||||
struct rpc_xprt *xprt;
|
||||
struct rpc_clnt *clnt;
|
||||
@ -208,7 +208,8 @@ pmap_create(char *hostname, struct sockaddr_in *srvaddr, int proto)
|
||||
if (IS_ERR(xprt))
|
||||
return (struct rpc_clnt *)xprt;
|
||||
xprt->addr.sin_port = htons(RPC_PMAP_PORT);
|
||||
xprt->resvport = 0;
|
||||
if (!privileged)
|
||||
xprt->resvport = 0;
|
||||
|
||||
/* printk("pmap: create clnt\n"); */
|
||||
clnt = rpc_new_client(xprt, hostname,
|
||||
|
Loading…
Reference in New Issue
Block a user