diff options
Diffstat (limited to 'fs/nfsd/nfs4callback.c')
-rw-r--r-- | fs/nfsd/nfs4callback.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index cc10ed35ac81..0aaf68beedbd 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -415,6 +415,21 @@ static void warn_no_callback_path(struct nfs4_client *clp, int reason) | |||
415 | (int)clp->cl_name.len, clp->cl_name.data, reason); | 415 | (int)clp->cl_name.len, clp->cl_name.data, reason); |
416 | } | 416 | } |
417 | 417 | ||
418 | static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata) | ||
419 | { | ||
420 | struct nfs4_client *clp = calldata; | ||
421 | |||
422 | if (task->tk_status) | ||
423 | warn_no_callback_path(clp, task->tk_status); | ||
424 | else | ||
425 | atomic_set(&clp->cl_callback.cb_set, 1); | ||
426 | put_nfs4_client(clp); | ||
427 | } | ||
428 | |||
429 | static const struct rpc_call_ops nfsd4_cb_probe_ops = { | ||
430 | .rpc_call_done = nfsd4_cb_probe_done, | ||
431 | }; | ||
432 | |||
418 | static struct rpc_cred *lookup_cb_cred(struct nfs4_callback *cb) | 433 | static struct rpc_cred *lookup_cb_cred(struct nfs4_callback *cb) |
419 | { | 434 | { |
420 | struct auth_cred acred = { | 435 | struct auth_cred acred = { |
@@ -431,9 +446,8 @@ static struct rpc_cred *lookup_cb_cred(struct nfs4_callback *cb) | |||
431 | RPCAUTH_LOOKUP_NEW); | 446 | RPCAUTH_LOOKUP_NEW); |
432 | } | 447 | } |
433 | 448 | ||
434 | static int do_probe_callback(void *data) | 449 | void do_probe_callback(struct nfs4_client *clp) |
435 | { | 450 | { |
436 | struct nfs4_client *clp = data; | ||
437 | struct nfs4_callback *cb = &clp->cl_callback; | 451 | struct nfs4_callback *cb = &clp->cl_callback; |
438 | struct rpc_message msg = { | 452 | struct rpc_message msg = { |
439 | .rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL], | 453 | .rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL], |
@@ -449,15 +463,13 @@ static int do_probe_callback(void *data) | |||
449 | } | 463 | } |
450 | cb->cb_cred = cred; | 464 | cb->cb_cred = cred; |
451 | msg.rpc_cred = cb->cb_cred; | 465 | msg.rpc_cred = cb->cb_cred; |
452 | status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT); | 466 | status = rpc_call_async(cb->cb_client, &msg, RPC_TASK_SOFT, |
467 | &nfsd4_cb_probe_ops, (void *)clp); | ||
453 | out: | 468 | out: |
454 | if (status) | 469 | if (status) { |
455 | warn_no_callback_path(clp, status); | 470 | warn_no_callback_path(clp, status); |
456 | else | 471 | put_nfs4_client(clp); |
457 | atomic_set(&cb->cb_set, 1); | 472 | } |
458 | |||
459 | put_nfs4_client(clp); | ||
460 | return 0; | ||
461 | } | 473 | } |
462 | 474 | ||
463 | /* | 475 | /* |
@@ -466,7 +478,6 @@ out: | |||
466 | void | 478 | void |
467 | nfsd4_probe_callback(struct nfs4_client *clp) | 479 | nfsd4_probe_callback(struct nfs4_client *clp) |
468 | { | 480 | { |
469 | struct task_struct *t; | ||
470 | int status; | 481 | int status; |
471 | 482 | ||
472 | BUG_ON(atomic_read(&clp->cl_callback.cb_set)); | 483 | BUG_ON(atomic_read(&clp->cl_callback.cb_set)); |
@@ -480,12 +491,7 @@ nfsd4_probe_callback(struct nfs4_client *clp) | |||
480 | /* the task holds a reference to the nfs4_client struct */ | 491 | /* the task holds a reference to the nfs4_client struct */ |
481 | atomic_inc(&clp->cl_count); | 492 | atomic_inc(&clp->cl_count); |
482 | 493 | ||
483 | t = kthread_run(do_probe_callback, clp, "nfs4_cb_probe"); | 494 | do_probe_callback(clp); |
484 | |||
485 | if (IS_ERR(t)) | ||
486 | atomic_dec(&clp->cl_count); | ||
487 | |||
488 | return; | ||
489 | } | 495 | } |
490 | 496 | ||
491 | /* | 497 | /* |