Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −5
Original line number Original line Diff line number Diff line
@@ -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