break;
err = nfs_delegation_claim_opens(inode, &delegation->stateid,
delegation->type);
- if (!issync || err != -EAGAIN)
+ if (!err)
break;
+ if (err != -EAGAIN)
+ goto abort;
+ if (!issync)
+ goto delay;
+
/*
* Guard against state recovery
*/
err = nfs4_wait_clnt_recover(server->nfs_client);
}
- if (err)
- goto abort;
-
out_return:
return nfs_do_return_delegation(inode, delegation, issync);
+delay:
+ set_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags);
+ set_bit(NFS4SERV_DELEGRETURN_DELAYED, &server->delegation_flags);
+ set_bit(NFS4CLNT_DELEGRETURN_DELAYED, &server->nfs_client->cl_state);
abort:
- spin_lock(&delegation->lock);
clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
- if (err == -EAGAIN) {
- set_bit(NFS_DELEGATION_RETURN_DELAYED, &delegation->flags);
- set_bit(NFS4SERV_DELEGRETURN_DELAYED,
- &server->delegation_flags);
- set_bit(NFS4CLNT_DELEGRETURN_DELAYED,
- &server->nfs_client->cl_state);
- }
- spin_unlock(&delegation->lock);
return err;
}