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, ...@@ -1818,6 +1818,8 @@ nfsd4_sequence(struct svc_rqst *rqstp,
__be32 __be32
nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_reclaim_complete *rc) 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 (rc->rca_one_fs) {
if (!cstate->current_fh.fh_dentry) if (!cstate->current_fh.fh_dentry)
return nfserr_nofilehandle; return nfserr_nofilehandle;
...@@ -1827,9 +1829,14 @@ nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *csta ...@@ -1827,9 +1829,14 @@ nfsd4_reclaim_complete(struct svc_rqst *rqstp, struct nfsd4_compound_state *csta
*/ */
return nfs_ok; return nfs_ok;
} }
nfs4_lock_state(); nfs4_lock_state();
if (is_client_expired(cstate->session->se_client)) { status = nfserr_complete_already;
nfs4_unlock_state(); 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. * The following error isn't really legal.
* But we only get here if the client just explicitly * 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 ...@@ -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 * error it gets back on an operation for the dead
* client. * client.
*/ */
return nfserr_stale_clientid; goto out;
}
status = nfs_ok;
nfsd4_create_clid_dir(cstate->session->se_client); nfsd4_create_clid_dir(cstate->session->se_client);
out:
nfs4_unlock_state(); nfs4_unlock_state();
return nfs_ok; return status;
} }
__be32 __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