NFSv4: don't require lock for get_renew_cred or get_machine_cred
This lock is no longer necessary. If nfs4_get_renew_cred() needs to hunt through the open-state creds for a user cred, it still takes the lock to stablize the rbtree, but otherwise there are no races. Note that this completely removes the lock from nfs4_renew_state(). It appears that the original need for the locking here was removed long ago, and there is no longer anything to protect. Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
a534ecb013
commit
f15e1e8bc6
|
@ -250,7 +250,7 @@ struct nfs4_add_xprt_data {
|
|||
|
||||
struct nfs4_state_maintenance_ops {
|
||||
int (*sched_state_renewal)(struct nfs_client *, struct rpc_cred *, unsigned);
|
||||
struct rpc_cred * (*get_state_renewal_cred_locked)(struct nfs_client *);
|
||||
struct rpc_cred * (*get_state_renewal_cred)(struct nfs_client *);
|
||||
int (*renew_lease)(struct nfs_client *, struct rpc_cred *);
|
||||
};
|
||||
|
||||
|
@ -451,8 +451,8 @@ extern void nfs4_set_lease_period(struct nfs_client *clp,
|
|||
|
||||
/* nfs4state.c */
|
||||
struct rpc_cred *nfs4_get_clid_cred(struct nfs_client *clp);
|
||||
struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp);
|
||||
struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp);
|
||||
struct rpc_cred *nfs4_get_machine_cred(struct nfs_client *clp);
|
||||
struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp);
|
||||
int nfs4_discover_server_trunking(struct nfs_client *clp,
|
||||
struct nfs_client **);
|
||||
int nfs40_discover_server_trunking(struct nfs_client *clp,
|
||||
|
|
|
@ -9606,14 +9606,14 @@ static const struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = {
|
|||
|
||||
static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
|
||||
.sched_state_renewal = nfs4_proc_async_renew,
|
||||
.get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
|
||||
.get_state_renewal_cred = nfs4_get_renew_cred,
|
||||
.renew_lease = nfs4_proc_renew,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
|
||||
.sched_state_renewal = nfs41_proc_async_sequence,
|
||||
.get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
|
||||
.get_state_renewal_cred = nfs4_get_machine_cred,
|
||||
.renew_lease = nfs4_proc_sequence,
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -68,7 +68,6 @@ nfs4_renew_state(struct work_struct *work)
|
|||
if (test_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state))
|
||||
goto out;
|
||||
|
||||
spin_lock(&clp->cl_lock);
|
||||
lease = clp->cl_lease_time;
|
||||
last = clp->cl_last_renewal;
|
||||
now = jiffies;
|
||||
|
@ -79,8 +78,7 @@ nfs4_renew_state(struct work_struct *work)
|
|||
renew_flags |= NFS4_RENEW_DELEGATION_CB;
|
||||
|
||||
if (renew_flags != 0) {
|
||||
cred = ops->get_state_renewal_cred_locked(clp);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred(clp);
|
||||
if (cred == NULL) {
|
||||
if (!(renew_flags & NFS4_RENEW_DELEGATION_CB)) {
|
||||
set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
|
||||
|
@ -104,7 +102,6 @@ nfs4_renew_state(struct work_struct *work)
|
|||
} else {
|
||||
dprintk("%s: failed to call renewd. Reason: lease not expired \n",
|
||||
__func__);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
}
|
||||
nfs4_schedule_state_renewal(clp);
|
||||
out_exp:
|
||||
|
|
|
@ -164,7 +164,7 @@ out:
|
|||
return status;
|
||||
}
|
||||
|
||||
struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
|
||||
struct rpc_cred *nfs4_get_machine_cred(struct nfs_client *clp)
|
||||
{
|
||||
struct rpc_cred *cred = clp->cl_root_cred;
|
||||
|
||||
|
@ -210,22 +210,23 @@ nfs4_get_renew_cred_server_locked(struct nfs_server *server)
|
|||
}
|
||||
|
||||
/**
|
||||
* nfs4_get_renew_cred_locked - Acquire credential for a renew operation
|
||||
* nfs4_get_renew_cred - Acquire credential for a renew operation
|
||||
* @clp: client state handle
|
||||
*
|
||||
* Returns an rpc_cred with reference count bumped, or NULL.
|
||||
* Caller must hold clp->cl_lock.
|
||||
*/
|
||||
struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
|
||||
struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp)
|
||||
{
|
||||
struct rpc_cred *cred = NULL;
|
||||
struct nfs_server *server;
|
||||
|
||||
/* Use machine credentials if available */
|
||||
cred = nfs4_get_machine_cred_locked(clp);
|
||||
cred = nfs4_get_machine_cred(clp);
|
||||
if (cred != NULL)
|
||||
goto out;
|
||||
|
||||
spin_lock(&clp->cl_lock);
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
|
||||
cred = nfs4_get_renew_cred_server_locked(server);
|
||||
|
@ -233,6 +234,7 @@ struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
|
|||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
spin_unlock(&clp->cl_lock);
|
||||
|
||||
out:
|
||||
return cred;
|
||||
|
@ -402,9 +404,7 @@ struct rpc_cred *nfs4_get_clid_cred(struct nfs_client *clp)
|
|||
{
|
||||
struct rpc_cred *cred;
|
||||
|
||||
spin_lock(&clp->cl_lock);
|
||||
cred = nfs4_get_machine_cred_locked(clp);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
cred = nfs4_get_machine_cred(clp);
|
||||
return cred;
|
||||
}
|
||||
|
||||
|
@ -1908,9 +1908,7 @@ static int nfs4_check_lease(struct nfs_client *clp)
|
|||
/* Is the client already known to have an expired lease? */
|
||||
if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
|
||||
return 0;
|
||||
spin_lock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred_locked(clp);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred(clp);
|
||||
if (cred == NULL) {
|
||||
cred = nfs4_get_clid_cred(clp);
|
||||
status = -ENOKEY;
|
||||
|
@ -2112,9 +2110,7 @@ static int nfs4_handle_migration(struct nfs_client *clp)
|
|||
dprintk("%s: migration reported on \"%s\"\n", __func__,
|
||||
clp->cl_hostname);
|
||||
|
||||
spin_lock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred_locked(clp);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred(clp);
|
||||
if (cred == NULL)
|
||||
return -NFS4ERR_NOENT;
|
||||
|
||||
|
@ -2160,9 +2156,7 @@ static int nfs4_handle_lease_moved(struct nfs_client *clp)
|
|||
dprintk("%s: lease moved reported on \"%s\"\n", __func__,
|
||||
clp->cl_hostname);
|
||||
|
||||
spin_lock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred_locked(clp);
|
||||
spin_unlock(&clp->cl_lock);
|
||||
cred = ops->get_state_renewal_cred(clp);
|
||||
if (cred == NULL)
|
||||
return -NFS4ERR_NOENT;
|
||||
|
||||
|
|
Loading…
Reference in New Issue