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

Commit da3846a2 authored by Andy Adamson's avatar Andy Adamson Committed by J. Bruce Fields
Browse files

nfsd41: nfsd DRC logic



Replay a request in nfsd4_sequence.
Add a minorversion to struct nfsd4_compound_state.

Pass the current slot to nfs4svc_encode_compound res via struct
nfsd4_compoundres to set an NFSv4.1 DRC entry.

Signed-off-by: default avatarAndy <Adamson&lt;andros@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfsd41: use bool inuse for slot state]
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfsd41: use cstate session in nfs4svc_encode_compoundres]
[nfsd41 replace nfsd4_set_cache_entry]
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent c3d06f9c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -936,6 +936,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
			BUG_ON(op->status == nfs_ok);

encode_op:
		/* Only from SEQUENCE or CREATE_SESSION */
		if (resp->cstate.status == nfserr_replay_cache) {
			dprintk("%s NFS4.1 replay from cache\n", __func__);
			status = op->status;
			goto out;
		}
		if (op->status == nfserr_replay_me) {
			op->replay = &cstate->replay_owner->so_replay;
			nfsd4_encode_replay(resp, op);
@@ -964,6 +970,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
		status = nfserr_jukebox;
	}

	resp->cstate.status = status;
	fh_put(&resp->cstate.current_fh);
	fh_put(&resp->cstate.save_fh);
	BUG_ON(resp->cstate.replay_owner);
+6 −0
Original line number Diff line number Diff line
@@ -989,6 +989,8 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp)
	}

	resp->rqstp->rq_resused = entry->ce_resused;
	resp->opcnt = entry->ce_opcnt;
	resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
	status = entry->ce_status;

	return status;
@@ -1214,6 +1216,10 @@ nfsd4_sequence(struct svc_rqst *rqstp,
	if (status == nfserr_replay_cache) {
		cstate->slot = slot;
		cstate->session = session;
		/* Return the cached reply status and set cstate->status
		 * for nfsd4_svc_encode_compoundres processing*/
		status = nfsd4_replay_cache_entry(resp);
		cstate->status = nfserr_replay_cache;
		goto replay_cache;
	}
	if (status)
+11 −0
Original line number Diff line number Diff line
@@ -3049,6 +3049,17 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compo
		iov = &rqstp->rq_res.head[0];
	iov->iov_len = ((char*)resp->p) - (char*)iov->iov_base;
	BUG_ON(iov->iov_len > PAGE_SIZE);
	if (resp->cstate.slot != NULL) {
		if (resp->cstate.status == nfserr_replay_cache) {
			iov->iov_len = resp->cstate.iovlen;
		} else {
			nfsd4_store_cache_entry(resp);
			dprintk("%s: SET SLOT STATE TO AVAILABLE\n", __func__);
			resp->cstate.slot->sl_inuse = 0;
		}
		if (resp->cstate.session)
			nfsd4_put_session(resp->cstate.session);
	}
	return 1;
}

+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ struct nfsd4_compound_state {
	struct nfsd4_session	*session;
	struct nfsd4_slot	*slot;
	__be32			*statp;
	size_t			iovlen;
	u32			status;
};