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: Mi Jinlong <mijinlong@cn.fujitsu.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Mi Jinlong 2011-04-27 09:14:30 +08:00 коммит произвёл J. Bruce Fields
Родитель 868b89c3dc
Коммит bcecf1ccc3
1 изменённых файлов: 14 добавлений и 5 удалений

Просмотреть файл

@ -1818,6 +1818,8 @@ out:
__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
*/ */
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
* 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