Commit 6dc9d57a authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: Callers to nfs4_get_renew_cred() need to hold nfs_client->cl_lock

Ditto for nfs4_get_setclientid_cred().
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 02860014
...@@ -202,7 +202,7 @@ extern void nfs4_kill_renewd(struct nfs_client *); ...@@ -202,7 +202,7 @@ extern void nfs4_kill_renewd(struct nfs_client *);
extern void nfs4_renew_state(struct work_struct *); extern void nfs4_renew_state(struct work_struct *);
/* nfs4state.c */ /* nfs4state.c */
struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp); struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp);
extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *); extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *);
extern void nfs4_put_state_owner(struct nfs4_state_owner *); extern void nfs4_put_state_owner(struct nfs4_state_owner *);
......
...@@ -77,7 +77,7 @@ nfs4_renew_state(struct work_struct *work) ...@@ -77,7 +77,7 @@ nfs4_renew_state(struct work_struct *work)
timeout = (2 * lease) / 3 + (long)last - (long)now; timeout = (2 * lease) / 3 + (long)last - (long)now;
/* Are we close to a lease timeout? */ /* Are we close to a lease timeout? */
if (time_after(now, last + lease/3)) { if (time_after(now, last + lease/3)) {
cred = nfs4_get_renew_cred(clp); cred = nfs4_get_renew_cred_locked(clp);
if (cred == NULL) { if (cred == NULL) {
set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
......
...@@ -71,14 +71,12 @@ static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred) ...@@ -71,14 +71,12 @@ static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred)
return status; return status;
} }
static struct rpc_cred *nfs4_get_machine_cred(struct nfs_client *clp) static struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
{ {
struct rpc_cred *cred = NULL; struct rpc_cred *cred = NULL;
spin_lock(&clp->cl_lock);
if (clp->cl_machine_cred != NULL) if (clp->cl_machine_cred != NULL)
cred = get_rpccred(clp->cl_machine_cred); cred = get_rpccred(clp->cl_machine_cred);
spin_unlock(&clp->cl_lock);
return cred; return cred;
} }
...@@ -94,7 +92,7 @@ static void nfs4_clear_machine_cred(struct nfs_client *clp) ...@@ -94,7 +92,7 @@ static void nfs4_clear_machine_cred(struct nfs_client *clp)
put_rpccred(cred); put_rpccred(cred);
} }
struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp) struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
{ {
struct nfs4_state_owner *sp; struct nfs4_state_owner *sp;
struct rb_node *pos; struct rb_node *pos;
...@@ -110,13 +108,24 @@ struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp) ...@@ -110,13 +108,24 @@ struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp)
return cred; return cred;
} }
static struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp)
{
struct rpc_cred *cred;
spin_lock(&clp->cl_lock);
cred = nfs4_get_renew_cred_locked(clp);
spin_unlock(&clp->cl_lock);
return cred;
}
static struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp) static struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp)
{ {
struct nfs4_state_owner *sp; struct nfs4_state_owner *sp;
struct rb_node *pos; struct rb_node *pos;
struct rpc_cred *cred; struct rpc_cred *cred;
cred = nfs4_get_machine_cred(clp); spin_lock(&clp->cl_lock);
cred = nfs4_get_machine_cred_locked(clp);
if (cred != NULL) if (cred != NULL)
goto out; goto out;
pos = rb_first(&clp->cl_state_owners); pos = rb_first(&clp->cl_state_owners);
...@@ -125,6 +134,7 @@ static struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp) ...@@ -125,6 +134,7 @@ static struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp)
cred = get_rpccred(sp->so_cred); cred = get_rpccred(sp->so_cred);
} }
out: out:
spin_unlock(&clp->cl_lock);
return cred; return cred;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment