|
@@ -2292,14 +2292,16 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
|
|
|
|
|
|
dprintk("--> %s slot %p\n", __func__, slot);
|
|
|
|
|
|
+ slot->sl_flags |= NFSD4_SLOT_INITIALIZED;
|
|
|
slot->sl_opcnt = resp->opcnt;
|
|
|
slot->sl_status = resp->cstate.status;
|
|
|
|
|
|
- slot->sl_flags |= NFSD4_SLOT_INITIALIZED;
|
|
|
- if (nfsd4_not_cached(resp)) {
|
|
|
- slot->sl_datalen = 0;
|
|
|
+ if (!nfsd4_cache_this(resp)) {
|
|
|
+ slot->sl_flags &= ~NFSD4_SLOT_CACHED;
|
|
|
return;
|
|
|
}
|
|
|
+ slot->sl_flags |= NFSD4_SLOT_CACHED;
|
|
|
+
|
|
|
base = resp->cstate.data_offset;
|
|
|
slot->sl_datalen = buf->len - base;
|
|
|
if (read_bytes_from_xdr_buf(buf, base, slot->sl_data, slot->sl_datalen))
|
|
@@ -2326,8 +2328,16 @@ nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
|
|
|
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_flags & NFSD4_SLOT_CACHETHIS)) {
|
|
|
+ if (slot->sl_flags & NFSD4_SLOT_CACHED)
|
|
|
+ return op->status;
|
|
|
+ if (args->opcnt == 1) {
|
|
|
+ /*
|
|
|
+ * The original operation wasn't a solo sequence--we
|
|
|
+ * always cache those--so this retry must not match the
|
|
|
+ * original:
|
|
|
+ */
|
|
|
+ op->status = nfserr_seq_false_retry;
|
|
|
+ } else {
|
|
|
op = &args->ops[resp->opcnt++];
|
|
|
op->status = nfserr_retry_uncached_rep;
|
|
|
nfsd4_encode_operation(resp, op);
|