OSDN Git Service

NFS: Split out the body of nfs4_reclaim_open_state()
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 11 Sep 2018 20:23:46 +0000 (16:23 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 30 Sep 2018 19:35:17 +0000 (15:35 -0400)
Moving all of this into a new function removes the need for cramped
indentation, making the code overall easier to look at.   I also take
this chance to switch copy recovery over to using
nfs4_stateid_match_other()

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4state.c

index 6ca3bd0..8c7fe22 100644 (file)
@@ -1549,10 +1549,51 @@ out:
        return status;
 }
 
+static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_state *state,
+                                    const struct nfs4_state_recovery_ops *ops)
+{
+       struct nfs4_lock_state *lock;
+       int status;
+
+       status = ops->recover_open(sp, state);
+       if (status < 0)
+               return status;
+
+       status = nfs4_reclaim_locks(state, ops);
+       if (status < 0)
+               return status;
+
+       if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) {
+               spin_lock(&state->state_lock);
+               list_for_each_entry(lock, &state->lock_states, ls_locks) {
+                       if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
+                               pr_warn_ratelimited("NFS: %s: Lock reclaim failed!\n", __func__);
+               }
+               spin_unlock(&state->state_lock);
+       }
+
+#ifdef CONFIG_NFS_V4_2
+       if (test_bit(NFS_CLNT_DST_SSC_COPY_STATE, &state->flags)) {
+               struct nfs4_copy_state *copy;
+               spin_lock(&sp->so_server->nfs_client->cl_lock);
+               list_for_each_entry(copy, &sp->so_server->ss_copies, copies) {
+                       if (nfs4_stateid_match_other(&state->stateid, &copy->parent_state->stateid))
+                               continue;
+                       copy->flags = 1;
+                       complete(&copy->completion);
+                       break;
+               }
+               spin_unlock(&sp->so_server->nfs_client->cl_lock);
+       }
+#endif /* CONFIG_NFS_V4_2 */
+
+       clear_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
+       return status;
+}
+
 static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
 {
        struct nfs4_state *state;
-       struct nfs4_lock_state *lock;
        int status = 0;
 
        /* Note: we rely on the sp->so_states list being ordered 
@@ -1575,43 +1616,13 @@ restart:
                        continue;
                refcount_inc(&state->count);
                spin_unlock(&sp->so_lock);
-               status = ops->recover_open(sp, state);
+               status = __nfs4_reclaim_open_state(sp, state, ops);
                if (status >= 0) {
-                       status = nfs4_reclaim_locks(state, ops);
-                       if (status >= 0) {
-                               if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) {
-                                       spin_lock(&state->state_lock);
-                                       list_for_each_entry(lock, &state->lock_states, ls_locks) {
-                                               if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
-                                                       pr_warn_ratelimited("NFS: "
-                                                                           "%s: Lock reclaim "
-                                                                           "failed!\n", __func__);
-                                       }
-                                       spin_unlock(&state->state_lock);
-                               }
-                               clear_bit(NFS_STATE_RECLAIM_NOGRACE,
-                                       &state->flags);
-#ifdef CONFIG_NFS_V4_2
-                               if (test_bit(NFS_CLNT_DST_SSC_COPY_STATE, &state->flags)) {
-                                       struct nfs4_copy_state *copy;
-
-                                       spin_lock(&sp->so_server->nfs_client->cl_lock);
-                                       list_for_each_entry(copy, &sp->so_server->ss_copies, copies) {
-                                               if (memcmp(&state->stateid.other, &copy->parent_state->stateid.other, NFS4_STATEID_SIZE))
-                                                       continue;
-                                               copy->flags = 1;
-                                               complete(&copy->completion);
-                                               printk("AGLO: server rebooted waking up the copy\n");
-                                               break;
-                                       }
-                                       spin_unlock(&sp->so_server->nfs_client->cl_lock);
-                               }
-#endif /* CONFIG_NFS_V4_2 */
-                               nfs4_put_open_state(state);
-                               spin_lock(&sp->so_lock);
-                               goto restart;
-                       }
+                       nfs4_put_open_state(state);
+                       spin_lock(&sp->so_lock);
+                       goto restart;
                }
+
                switch (status) {
                        default:
                                printk(KERN_ERR "NFS: %s: unhandled error %d\n",