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:
Родитель
868b89c3dc
Коммит
bcecf1ccc3
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче