diff options
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4callback.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 4788d09d9bec..711c6282151f 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -409,6 +409,12 @@ int setup_callback_client(struct nfs4_client *clp) | |||
409 | 409 | ||
410 | } | 410 | } |
411 | 411 | ||
412 | static void warn_no_callback_path(struct nfs4_client *clp, int reason) | ||
413 | { | ||
414 | dprintk("NFSD: warning: no callback path to client %.*s: error %d\n", | ||
415 | (int)clp->cl_name.len, clp->cl_name.data, reason); | ||
416 | } | ||
417 | |||
412 | static int do_probe_callback(void *data) | 418 | static int do_probe_callback(void *data) |
413 | { | 419 | { |
414 | struct nfs4_client *clp = data; | 420 | struct nfs4_client *clp = data; |
@@ -419,24 +425,12 @@ static int do_probe_callback(void *data) | |||
419 | }; | 425 | }; |
420 | int status; | 426 | int status; |
421 | 427 | ||
422 | status = setup_callback_client(clp); | ||
423 | if (status) | ||
424 | goto out_err; | ||
425 | |||
426 | status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT); | 428 | status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT); |
427 | |||
428 | if (status) | 429 | if (status) |
429 | goto out_release_client; | 430 | warn_no_callback_path(clp, status); |
431 | else | ||
432 | atomic_set(&cb->cb_set, 1); | ||
430 | 433 | ||
431 | atomic_set(&cb->cb_set, 1); | ||
432 | put_nfs4_client(clp); | ||
433 | return 0; | ||
434 | out_release_client: | ||
435 | rpc_shutdown_client(cb->cb_client); | ||
436 | cb->cb_client = NULL; | ||
437 | out_err: | ||
438 | dprintk("NFSD: warning: no callback path to client %.*s: error %d\n", | ||
439 | (int)clp->cl_name.len, clp->cl_name.data, status); | ||
440 | put_nfs4_client(clp); | 434 | put_nfs4_client(clp); |
441 | return 0; | 435 | return 0; |
442 | } | 436 | } |
@@ -448,9 +442,16 @@ void | |||
448 | nfsd4_probe_callback(struct nfs4_client *clp) | 442 | nfsd4_probe_callback(struct nfs4_client *clp) |
449 | { | 443 | { |
450 | struct task_struct *t; | 444 | struct task_struct *t; |
445 | int status; | ||
451 | 446 | ||
452 | BUG_ON(atomic_read(&clp->cl_callback.cb_set)); | 447 | BUG_ON(atomic_read(&clp->cl_callback.cb_set)); |
453 | 448 | ||
449 | status = setup_callback_client(clp); | ||
450 | if (status) { | ||
451 | warn_no_callback_path(clp, status); | ||
452 | return; | ||
453 | } | ||
454 | |||
454 | /* the task holds a reference to the nfs4_client struct */ | 455 | /* the task holds a reference to the nfs4_client struct */ |
455 | atomic_inc(&clp->cl_count); | 456 | atomic_inc(&clp->cl_count); |
456 | 457 | ||