NFSv4: don't require lock for get_renew_cred or get_machine_cred
authorNeilBrown <neilb@suse.com>
Mon, 3 Dec 2018 00:30:30 +0000 (11:30 +1100)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 19 Dec 2018 18:52:45 +0000 (13:52 -0500)
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>
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c
fs/nfs/nfs4renewd.c
fs/nfs/nfs4state.c

index 1b994b52751892cc419bfeae906ee09c300d3196..ad649a49822f4b5326cc1b1daf94e66bd9baad82 100644 (file)
@@ -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,
index 867457d6dfbe54060ae6f152ca2a07dfa605ff71..cafa155a053e1c9bbf7f7b4bb682cc74dfac3794 100644 (file)
@@ -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
index 1f8c2ae43a8dfb871b84f6cc7104655283d95ac3..8880cd958210c1c1c4f4a32405dcc8d67e8f7d44 100644 (file)
@@ -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:
index 511bcdee98f5f5e74c5d8504c52f64d6686cea49..f142fca6995bd2e9012e691827c75fc49e677427 100644 (file)
@@ -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;