Commit e372ba60 authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: decoding errors can still be cached and require space

Currently a non-idempotent op reply may be cached if it fails in the
proc code but not if it fails at xdr decoding.  I doubt there are any
xdr-decoding-time errors that would make this a problem in practice, so
this probably isn't a serious bug.

The space estimates should also take into account space required for
encoding of error returns.  Again, not a practical problem, though it
would become one after future patches which will tighten the space
estimates.
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent f34e432b
...@@ -1215,6 +1215,8 @@ static inline struct nfsd4_operation *OPDESC(struct nfsd4_op *op) ...@@ -1215,6 +1215,8 @@ static inline struct nfsd4_operation *OPDESC(struct nfsd4_op *op)
bool nfsd4_cache_this_op(struct nfsd4_op *op) bool nfsd4_cache_this_op(struct nfsd4_op *op)
{ {
if (op->opnum == OP_ILLEGAL)
return false;
return OPDESC(op)->op_flags & OP_CACHEME; return OPDESC(op)->op_flags & OP_CACHEME;
} }
......
...@@ -1677,11 +1677,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) ...@@ -1677,11 +1677,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
op->opnum = OP_ILLEGAL; op->opnum = OP_ILLEGAL;
op->status = nfserr_op_illegal; op->status = nfserr_op_illegal;
} }
if (op->status) {
argp->opcnt = i+1;
break;
}
/* /*
* We'll try to cache the result in the DRC if any one * We'll try to cache the result in the DRC if any one
* op in the compound wants to be cached: * op in the compound wants to be cached:
...@@ -1689,6 +1684,11 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) ...@@ -1689,6 +1684,11 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
cachethis |= nfsd4_cache_this_op(op); cachethis |= nfsd4_cache_this_op(op);
max_reply = max(max_reply, nfsd4_max_reply(op->opnum)); max_reply = max(max_reply, nfsd4_max_reply(op->opnum));
if (op->status) {
argp->opcnt = i+1;
break;
}
} }
/* Sessions make the DRC unnecessary: */ /* Sessions make the DRC unnecessary: */
if (argp->minorversion) if (argp->minorversion)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment