diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2006-08-22 20:06:16 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-09-22 23:24:44 -0400 |
commit | bbf7c1dd2ae2b4040b41b1065ee9b1b6905b1605 (patch) | |
tree | b1867e722c1cc679b1834feeeeb21195f57dc873 /net/sunrpc | |
parent | 5b1eacbcd78930d976eb50a93f1779d311b553d1 (diff) |
SUNRPC: Introduce transport switch callout for pluggable rpcbind
Introduce a clean transport switch API for plugging in different types of
rpcbind mechanisms. For instance, rpcbind can cleanly replace the
existing portmapper client, or a transport can choose to implement RPC
binding any way it likes.
Test plan:
Destructive testing (unplugging the network temporarily). Connectathon
with UDP and TCP. NFSv2/3 and NFSv4 mounting should be carefully checked.
Probably need to rig a server where certain services aren't running, or
that returns an error for some typical operation.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/clnt.c | 3 | ||||
-rw-r--r-- | net/sunrpc/pmap_clnt.c | 4 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 2 |
3 files changed, 5 insertions, 4 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index cee504162a3f..d003c2f5688f 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -774,7 +774,6 @@ call_encode(struct rpc_task *task) | |||
774 | static void | 774 | static void |
775 | call_bind(struct rpc_task *task) | 775 | call_bind(struct rpc_task *task) |
776 | { | 776 | { |
777 | struct rpc_clnt *clnt = task->tk_client; | ||
778 | struct rpc_xprt *xprt = task->tk_xprt; | 777 | struct rpc_xprt *xprt = task->tk_xprt; |
779 | 778 | ||
780 | dprintk("RPC: %4d call_bind (status %d)\n", | 779 | dprintk("RPC: %4d call_bind (status %d)\n", |
@@ -784,7 +783,7 @@ call_bind(struct rpc_task *task) | |||
784 | if (!xprt_bound(xprt)) { | 783 | if (!xprt_bound(xprt)) { |
785 | task->tk_action = call_bind_status; | 784 | task->tk_action = call_bind_status; |
786 | task->tk_timeout = xprt->bind_timeout; | 785 | task->tk_timeout = xprt->bind_timeout; |
787 | rpc_getport(task, clnt); | 786 | xprt->ops->rpcbind(task); |
788 | } | 787 | } |
789 | } | 788 | } |
790 | 789 | ||
diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c index 0efcbf1302a2..f7b279a63baa 100644 --- a/net/sunrpc/pmap_clnt.c +++ b/net/sunrpc/pmap_clnt.c | |||
@@ -81,13 +81,13 @@ static inline void pmap_wake_portmap_waiters(struct rpc_xprt *xprt) | |||
81 | /** | 81 | /** |
82 | * rpc_getport - obtain the port for a given RPC service on a given host | 82 | * rpc_getport - obtain the port for a given RPC service on a given host |
83 | * @task: task that is waiting for portmapper request | 83 | * @task: task that is waiting for portmapper request |
84 | * @clnt: controlling rpc_clnt | ||
85 | * | 84 | * |
86 | * This one can be called for an ongoing RPC request, and can be used in | 85 | * This one can be called for an ongoing RPC request, and can be used in |
87 | * an async (rpciod) context. | 86 | * an async (rpciod) context. |
88 | */ | 87 | */ |
89 | void rpc_getport(struct rpc_task *task, struct rpc_clnt *clnt) | 88 | void rpc_getport(struct rpc_task *task) |
90 | { | 89 | { |
90 | struct rpc_clnt *clnt = task->tk_client; | ||
91 | struct rpc_xprt *xprt = task->tk_xprt; | 91 | struct rpc_xprt *xprt = task->tk_xprt; |
92 | struct sockaddr_in *sap = &xprt->addr; | 92 | struct sockaddr_in *sap = &xprt->addr; |
93 | struct portmap_args *map; | 93 | struct portmap_args *map; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 123ac1e5ba15..4c98b89a5b48 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -1262,6 +1262,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
1262 | .set_buffer_size = xs_udp_set_buffer_size, | 1262 | .set_buffer_size = xs_udp_set_buffer_size, |
1263 | .reserve_xprt = xprt_reserve_xprt_cong, | 1263 | .reserve_xprt = xprt_reserve_xprt_cong, |
1264 | .release_xprt = xprt_release_xprt_cong, | 1264 | .release_xprt = xprt_release_xprt_cong, |
1265 | .rpcbind = rpc_getport, | ||
1265 | .set_port = xs_set_port, | 1266 | .set_port = xs_set_port, |
1266 | .connect = xs_connect, | 1267 | .connect = xs_connect, |
1267 | .buf_alloc = rpc_malloc, | 1268 | .buf_alloc = rpc_malloc, |
@@ -1278,6 +1279,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
1278 | static struct rpc_xprt_ops xs_tcp_ops = { | 1279 | static struct rpc_xprt_ops xs_tcp_ops = { |
1279 | .reserve_xprt = xprt_reserve_xprt, | 1280 | .reserve_xprt = xprt_reserve_xprt, |
1280 | .release_xprt = xs_tcp_release_xprt, | 1281 | .release_xprt = xs_tcp_release_xprt, |
1282 | .rpcbind = rpc_getport, | ||
1281 | .set_port = xs_set_port, | 1283 | .set_port = xs_set_port, |
1282 | .connect = xs_connect, | 1284 | .connect = xs_connect, |
1283 | .buf_alloc = rpc_malloc, | 1285 | .buf_alloc = rpc_malloc, |