Commit bcecf1cc authored by Mi Jinlong's avatar Mi Jinlong Committed by J. Bruce Fields

nfsd41: error out on repeated RECLAIM_COMPLETE

Servers are supposed to return nfserr_complete_already to clients that
attempt to send multiple RECLAIM_COMPLETEs.
Signed-off-by: default avatarMi Jinlong <mijinlong@cn.fujitsu.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 868b89c3
......@@ -1818,6 +1818,8 @@ nfsd4_sequence(struct svc_rqst *rqstp,
__be32
nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_reclaim_complete *rc)
{
int status = 0;
if (rc->rca_one_fs) {
if (!cstate->current_fh.fh_dentry)
return nfserr_nofilehandle;
......@@ -1827,9 +1829,14 @@ nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *csta
*/
return nfs_ok;
}
nfs4_lock_state();
if (is_client_expired(cstate->session->se_client)) {
nfs4_unlock_state();
status = nfserr_complete_already;
if (cstate->session->se_client->cl_firststate)
goto out;
status = nfserr_stale_clientid;
if (is_client_expired(cstate->session->se_client))
/*
* The following error isn't really legal.
* But we only get here if the client just explicitly
......@@ -1837,11 +1844,13 @@ nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *csta
* error it gets back on an operation for the dead
* client.
*/
return nfserr_stale_clientid;
}
goto out;
status = nfs_ok;
nfsd4_create_clid_dir(cstate->session->se_client);
out:
nfs4_unlock_state();
return nfs_ok;
return status;
}
__be32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment