|
@@ -1108,6 +1108,36 @@ nfsd41_copy_replay_data(struct nfsd4_compoundres *resp,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Encode the replay sequence operation from the slot values.
|
|
|
+ * If cachethis is FALSE encode the uncached rep error on the next
|
|
|
+ * operation which sets resp->p and increments resp->opcnt for
|
|
|
+ * nfs4svc_encode_compoundres.
|
|
|
+ *
|
|
|
+ */
|
|
|
+static __be32
|
|
|
+nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
|
|
|
+ struct nfsd4_compoundres *resp)
|
|
|
+{
|
|
|
+ struct nfsd4_op *op;
|
|
|
+ struct nfsd4_slot *slot = resp->cstate.slot;
|
|
|
+
|
|
|
+ dprintk("--> %s resp->opcnt %d cachethis %u \n", __func__,
|
|
|
+ resp->opcnt, resp->cstate.slot->sl_cache_entry.ce_cachethis);
|
|
|
+
|
|
|
+ /* Encode the replayed sequence operation */
|
|
|
+ op = &args->ops[resp->opcnt - 1];
|
|
|
+ nfsd4_encode_operation(resp, op);
|
|
|
+
|
|
|
+ /* Return nfserr_retry_uncached_rep in next operation. */
|
|
|
+ if (args->opcnt > 1 && slot->sl_cache_entry.ce_cachethis == 0) {
|
|
|
+ op = &args->ops[resp->opcnt++];
|
|
|
+ op->status = nfserr_retry_uncached_rep;
|
|
|
+ nfsd4_encode_operation(resp, op);
|
|
|
+ }
|
|
|
+ return op->status;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Keep the first page of the replay. Copy the NFSv4.1 data from the first
|
|
|
* cached page. Replace any futher replay pages from the cache.
|
|
@@ -1131,10 +1161,12 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
|
|
|
* session inactivity timer fires and a solo sequence operation
|
|
|
* is sent (lease renewal).
|
|
|
*/
|
|
|
- if (seq && nfsd4_not_cached(resp)) {
|
|
|
- seq->maxslots = resp->cstate.session->se_fchannel.maxreqs;
|
|
|
- return nfs_ok;
|
|
|
- }
|
|
|
+ seq->maxslots = resp->cstate.session->se_fchannel.maxreqs;
|
|
|
+
|
|
|
+ /* Either returns 0 or nfserr_retry_uncached */
|
|
|
+ status = nfsd4_enc_sequence_replay(resp->rqstp->rq_argp, resp);
|
|
|
+ if (status == nfserr_retry_uncached_rep)
|
|
|
+ return status;
|
|
|
|
|
|
if (!nfsd41_copy_replay_data(resp, entry)) {
|
|
|
/*
|