mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
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:
parent
10ec57e4c5
commit
cb7a8384dc
@ -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, ©->parent_state->stateid))
|
||||||
|
continue;
|
||||||
|
copy->flags = 1;
|
||||||
|
complete(©->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, ©->parent_state->stateid.other, NFS4_STATEID_SIZE))
|
|
||||||
continue;
|
|
||||||
copy->flags = 1;
|
|
||||||
complete(©->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",
|
||||||
|
Loading…
Reference in New Issue
Block a user