summaryrefslogtreecommitdiff
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2009-02-23 19:35:22 -0800
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-04-29 16:44:53 -0400
commitecdd03b7914c91ef849e49c4d466c87f4981b5cd (patch)
tree16d67b4af0e8545f60e31f0b1f9cfb0f97526641 /fs/nfsd
parente1cab5a5896e142190cd66a8287099b52e5855a7 (diff)
downloadlinux-3.10-ecdd03b7914c91ef849e49c4d466c87f4981b5cd.tar.gz
linux-3.10-ecdd03b7914c91ef849e49c4d466c87f4981b5cd.tar.bz2
linux-3.10-ecdd03b7914c91ef849e49c4d466c87f4981b5cd.zip
nfsd4: create rpc callback client from server thread
The code is a little simpler, and it should be easier to avoid races, if we just do all rpc client creation/destruction from nfsd or laundromat threads and do only the rpc calls themselves asynchronously. The rpc creation doesn't involve any significant waiting (it doesn't call the client, for example), so there's no reason not to do this. Also don't bother destroying the client on failure of the rpc null probe. We may want to retry the probe later anyway. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4callback.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 4788d09d9be..711c6282151 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -409,6 +409,12 @@ int setup_callback_client(struct nfs4_client *clp)
}
+static void warn_no_callback_path(struct nfs4_client *clp, int reason)
+{
+ dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
+ (int)clp->cl_name.len, clp->cl_name.data, reason);
+}
+
static int do_probe_callback(void *data)
{
struct nfs4_client *clp = data;
@@ -419,24 +425,12 @@ static int do_probe_callback(void *data)
};
int status;
- status = setup_callback_client(clp);
- if (status)
- goto out_err;
-
status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT);
-
if (status)
- goto out_release_client;
+ warn_no_callback_path(clp, status);
+ else
+ atomic_set(&cb->cb_set, 1);
- atomic_set(&cb->cb_set, 1);
- put_nfs4_client(clp);
- return 0;
-out_release_client:
- rpc_shutdown_client(cb->cb_client);
- cb->cb_client = NULL;
-out_err:
- dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
- (int)clp->cl_name.len, clp->cl_name.data, status);
put_nfs4_client(clp);
return 0;
}
@@ -448,9 +442,16 @@ void
nfsd4_probe_callback(struct nfs4_client *clp)
{
struct task_struct *t;
+ int status;
BUG_ON(atomic_read(&clp->cl_callback.cb_set));
+ status = setup_callback_client(clp);
+ if (status) {
+ warn_no_callback_path(clp, status);
+ return;
+ }
+
/* the task holds a reference to the nfs4_client struct */
atomic_inc(&clp->cl_count);