Skip to content

Commit

Permalink
nfsd4: create rpc callback client from server thread
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
J. Bruce Fields committed Apr 29, 2009
1 parent e1cab5a commit ecdd03b
Showing 1 changed file with 16 additions and 15 deletions.
31 changes: 16 additions & 15 deletions fs/nfsd/nfs4callback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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);

Expand Down

0 comments on commit ecdd03b

Please sign in to comment.