Skip to content

Commit

Permalink
nfsd4: lookup up callback cred only once
Browse files Browse the repository at this point in the history
Lookup the callback cred once and then use it for all subsequent
callbacks.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
  • Loading branch information
J. Bruce Fields committed Apr 29, 2009
1 parent ecdd03b commit 3cef9ab
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
26 changes: 26 additions & 0 deletions fs/nfsd/nfs4callback.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,22 @@ static void warn_no_callback_path(struct nfs4_client *clp, int reason)
(int)clp->cl_name.len, clp->cl_name.data, reason);
}

static struct rpc_cred *lookup_cb_cred(struct nfs4_callback *cb)
{
struct auth_cred acred = {
.machine_cred = 1
};

/*
* Note in the gss case this doesn't actually have to wait for a
* gss upcall (or any calls to the client); this just creates a
* non-uptodate cred which the rpc state machine will fill in with
* a refresh_upcall later.
*/
return rpcauth_lookup_credcache(cb->cb_client->cl_auth, &acred,
RPCAUTH_LOOKUP_NEW);
}

static int do_probe_callback(void *data)
{
struct nfs4_client *clp = data;
Expand All @@ -423,9 +439,18 @@ static int do_probe_callback(void *data)
.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL],
.rpc_argp = clp,
};
struct rpc_cred *cred;
int status;

cred = lookup_cb_cred(cb);
if (IS_ERR(cred)) {
status = PTR_ERR(cred);
goto out;
}
cb->cb_cred = cred;
msg.rpc_cred = cb->cb_cred;
status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT);
out:
if (status)
warn_no_callback_path(clp, status);
else
Expand Down Expand Up @@ -475,6 +500,7 @@ nfsd4_cb_recall(struct nfs4_delegation *dp)
struct rpc_message msg = {
.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_RECALL],
.rpc_argp = cbr,
.rpc_cred = clp->cl_callback.cb_cred
};
int retries = 1;
int status = 0;
Expand Down
4 changes: 4 additions & 0 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,10 @@ shutdown_callback_client(struct nfs4_client *clp)
clp->cl_callback.cb_client = NULL;
rpc_shutdown_client(clnt);
}
if (clp->cl_callback.cb_cred) {
put_rpccred(clp->cl_callback.cb_cred);
clp->cl_callback.cb_cred = NULL;
}
}

static inline void
Expand Down
1 change: 1 addition & 0 deletions include/linux/nfsd/state.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ struct nfs4_callback {
/* RPC client info */
atomic_t cb_set; /* successful CB_NULL call */
struct rpc_clnt * cb_client;
struct rpc_cred * cb_cred;
};

/* Maximum number of slots per session. 128 is useful for long haul TCP */
Expand Down

0 comments on commit 3cef9ab

Please sign in to comment.