NFS: Split out the body of nfs4_reclaim_open_state()

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>
This commit is contained in:
Anna Schumaker 2018-09-11 16:23:46 -04:00 committed by Trond Myklebust
parent 10ec57e4c5
commit cb7a8384dc

View File

@ -1549,10 +1549,51 @@ out:
return status; 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) static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
{ {
struct nfs4_state *state; struct nfs4_state *state;
struct nfs4_lock_state *lock;
int status = 0; int status = 0;
/* Note: we rely on the sp->so_states list being ordered /* Note: we rely on the sp->so_states list being ordered
@ -1575,43 +1616,13 @@ restart:
continue; continue;
refcount_inc(&state->count); refcount_inc(&state->count);
spin_unlock(&sp->so_lock); spin_unlock(&sp->so_lock);
status = ops->recover_open(sp, state); status = __nfs4_reclaim_open_state(sp, state, ops);
if (status >= 0) { if (status >= 0) {
status = nfs4_reclaim_locks(state, ops); nfs4_put_open_state(state);
if (status >= 0) { spin_lock(&sp->so_lock);
if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) { goto restart;
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;
}
} }
switch (status) { switch (status) {
default: default:
printk(KERN_ERR "NFS: %s: unhandled error %d\n", printk(KERN_ERR "NFS: %s: unhandled error %d\n",