diff options
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 33f12b84e265..c979fcf88798 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -241,6 +241,8 @@ rpc_clone_client(struct rpc_clnt *clnt) | |||
241 | rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval); | 241 | rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval); |
242 | if (new->cl_auth) | 242 | if (new->cl_auth) |
243 | atomic_inc(&new->cl_auth->au_count); | 243 | atomic_inc(&new->cl_auth->au_count); |
244 | new->cl_pmap = &new->cl_pmap_default; | ||
245 | rpc_init_wait_queue(&new->cl_pmap_default.pm_bindwait, "bindwait"); | ||
244 | return new; | 246 | return new; |
245 | out_no_clnt: | 247 | out_no_clnt: |
246 | printk(KERN_INFO "RPC: out of memory in %s\n", __FUNCTION__); | 248 | printk(KERN_INFO "RPC: out of memory in %s\n", __FUNCTION__); |
@@ -329,6 +331,44 @@ rpc_release_client(struct rpc_clnt *clnt) | |||
329 | rpc_destroy_client(clnt); | 331 | rpc_destroy_client(clnt); |
330 | } | 332 | } |
331 | 333 | ||
334 | /** | ||
335 | * rpc_bind_new_program - bind a new RPC program to an existing client | ||
336 | * @old - old rpc_client | ||
337 | * @program - rpc program to set | ||
338 | * @vers - rpc program version | ||
339 | * | ||
340 | * Clones the rpc client and sets up a new RPC program. This is mainly | ||
341 | * of use for enabling different RPC programs to share the same transport. | ||
342 | * The Sun NFSv2/v3 ACL protocol can do this. | ||
343 | */ | ||
344 | struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old, | ||
345 | struct rpc_program *program, | ||
346 | int vers) | ||
347 | { | ||
348 | struct rpc_clnt *clnt; | ||
349 | struct rpc_version *version; | ||
350 | int err; | ||
351 | |||
352 | BUG_ON(vers >= program->nrvers || !program->version[vers]); | ||
353 | version = program->version[vers]; | ||
354 | clnt = rpc_clone_client(old); | ||
355 | if (IS_ERR(clnt)) | ||
356 | goto out; | ||
357 | clnt->cl_procinfo = version->procs; | ||
358 | clnt->cl_maxproc = version->nrprocs; | ||
359 | clnt->cl_protname = program->name; | ||
360 | clnt->cl_prog = program->number; | ||
361 | clnt->cl_vers = version->number; | ||
362 | clnt->cl_stats = program->stats; | ||
363 | err = rpc_ping(clnt, RPC_TASK_SOFT|RPC_TASK_NOINTR); | ||
364 | if (err != 0) { | ||
365 | rpc_shutdown_client(clnt); | ||
366 | clnt = ERR_PTR(err); | ||
367 | } | ||
368 | out: | ||
369 | return clnt; | ||
370 | } | ||
371 | |||
332 | /* | 372 | /* |
333 | * Default callback for async RPC calls | 373 | * Default callback for async RPC calls |
334 | */ | 374 | */ |