Merge branch 'master' into gfs2
[powerpc.git] / net / sunrpc / pmap_clnt.c
index a398575..623180f 100644 (file)
@@ -6,7 +6,6 @@
  * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
  */
 
-#include <linux/config.h>
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/kernel.h>
@@ -82,6 +81,7 @@ rpc_getport(struct rpc_task *task, struct rpc_clnt *clnt)
        rpc_call_setup(child, &msg, 0);
 
        /* ... and run the child task */
+       task->tk_xprt->stat.bind_count++;
        rpc_run_child(task, child, pmap_getport_done);
        return;
 
@@ -90,8 +90,7 @@ bailout:
        map->pm_binding = 0;
        rpc_wake_up(&map->pm_bindwait);
        spin_unlock(&pmap_lock);
-       task->tk_status = -EIO;
-       task->tk_action = NULL;
+       rpc_exit(task, -EIO);
 }
 
 #ifdef CONFIG_ROOT_NFS
@@ -104,6 +103,11 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
                .pm_prot        = prot,
                .pm_port        = 0
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &pmap_procedures[PMAP_GETPORT],
+               .rpc_argp       = &map,
+               .rpc_resp       = &map.pm_port,
+       };
        struct rpc_clnt *pmap_clnt;
        char            hostname[32];
        int             status;
@@ -117,7 +121,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
                return PTR_ERR(pmap_clnt);
 
        /* Setup the call info struct */
-       status = rpc_call(pmap_clnt, PMAP_GETPORT, &map, &map.pm_port, 0);
+       status = rpc_call_sync(pmap_clnt, &msg, 0);
 
        if (status >= 0) {
                if (map.pm_port != 0)
@@ -132,21 +136,22 @@ static void
 pmap_getport_done(struct rpc_task *task)
 {
        struct rpc_clnt *clnt = task->tk_client;
+       struct rpc_xprt *xprt = task->tk_xprt;
        struct rpc_portmap *map = clnt->cl_pmap;
 
        dprintk("RPC: %4d pmap_getport_done(status %d, port %d)\n",
                        task->tk_pid, task->tk_status, clnt->cl_port);
+
+       xprt->ops->set_port(xprt, 0);
        if (task->tk_status < 0) {
                /* Make the calling task exit with an error */
-               task->tk_action = NULL;
+               task->tk_action = rpc_exit_task;
        } else if (clnt->cl_port == 0) {
                /* Program not registered */
-               task->tk_status = -EACCES;
-               task->tk_action = NULL;
+               rpc_exit(task, -EACCES);
        } else {
-               /* byte-swap port number first */
+               xprt->ops->set_port(xprt, clnt->cl_port);
                clnt->cl_port = htons(clnt->cl_port);
-               clnt->cl_xprt->addr.sin_port = clnt->cl_port;
        }
        spin_lock(&pmap_lock);
        map->pm_binding = 0;
@@ -161,16 +166,27 @@ pmap_getport_done(struct rpc_task *task)
 int
 rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
 {
-       struct sockaddr_in      sin;
-       struct rpc_portmap      map;
+       struct sockaddr_in      sin = {
+               .sin_family     = AF_INET,
+               .sin_addr.s_addr = htonl(INADDR_LOOPBACK),
+       };
+       struct rpc_portmap      map = {
+               .pm_prog        = prog,
+               .pm_vers        = vers,
+               .pm_prot        = prot,
+               .pm_port        = port,
+       };
+       struct rpc_message msg = {
+               .rpc_proc       = &pmap_procedures[port ? PMAP_SET : PMAP_UNSET],
+               .rpc_argp       = &map,
+               .rpc_resp       = okay,
+       };
        struct rpc_clnt         *pmap_clnt;
        int error = 0;
 
        dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n",
                        prog, vers, prot, port);
 
-       sin.sin_family = AF_INET;
-       sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1);
        if (IS_ERR(pmap_clnt)) {
                error = PTR_ERR(pmap_clnt);
@@ -178,13 +194,7 @@ rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
                return error;
        }
 
-       map.pm_prog = prog;
-       map.pm_vers = vers;
-       map.pm_prot = prot;
-       map.pm_port = port;
-
-       error = rpc_call(pmap_clnt, port? PMAP_SET : PMAP_UNSET,
-                                       &map, okay, 0);
+       error = rpc_call_sync(pmap_clnt, &msg, 0);
 
        if (error < 0) {
                printk(KERN_WARNING
@@ -207,7 +217,7 @@ pmap_create(char *hostname, struct sockaddr_in *srvaddr, int proto, int privileg
        xprt = xprt_create_proto(proto, srvaddr, NULL);
        if (IS_ERR(xprt))
                return (struct rpc_clnt *)xprt;
-       xprt->addr.sin_port = htons(RPC_PMAP_PORT);
+       xprt->ops->set_port(xprt, RPC_PMAP_PORT);
        if (!privileged)
                xprt->resvport = 0;
 
@@ -217,7 +227,6 @@ pmap_create(char *hostname, struct sockaddr_in *srvaddr, int proto, int privileg
                                RPC_AUTH_UNIX);
        if (!IS_ERR(clnt)) {
                clnt->cl_softrtry = 1;
-               clnt->cl_chatty   = 1;
                clnt->cl_oneshot  = 1;
        }
        return clnt;
@@ -261,6 +270,8 @@ static struct rpc_procinfo  pmap_procedures[] = {
          .p_decode             = (kxdrproc_t) xdr_decode_bool,
          .p_bufsiz             = 4,
          .p_count              = 1,
+         .p_statidx            = PMAP_SET,
+         .p_name               = "SET",
        },
 [PMAP_UNSET] = {
          .p_proc               = PMAP_UNSET,
@@ -268,6 +279,8 @@ static struct rpc_procinfo  pmap_procedures[] = {
          .p_decode             = (kxdrproc_t) xdr_decode_bool,
          .p_bufsiz             = 4,
          .p_count              = 1,
+         .p_statidx            = PMAP_UNSET,
+         .p_name               = "UNSET",
        },
 [PMAP_GETPORT] = {
          .p_proc               = PMAP_GETPORT,
@@ -275,6 +288,8 @@ static struct rpc_procinfo  pmap_procedures[] = {
          .p_decode             = (kxdrproc_t) xdr_decode_port,
          .p_bufsiz             = 4,
          .p_count              = 1,
+         .p_statidx            = PMAP_GETPORT,
+         .p_name               = "GETPORT",
        },
 };