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

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

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
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -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;
}
}


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