diff mbox

[39/43] nfsd4: really fix nfs4err_resource in 4.1 case

Message ID 1399841568-19716-40-git-send-email-bfields@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Bruce Fields May 11, 2014, 8:52 p.m. UTC
From: "J. Bruce Fields" <bfields@redhat.com>

encode_getattr, for example, can return nfserr_resource to indicate it
ran out of buffer space.  That's not a legal error in the 4.1 case.
And in the 4.1 case, if we ran out of buffer space, we should have
exceeded a session limit too.

(Note in 1bc49d83c37cfaf46be357757e592711e67f9809 "nfsd4: fix
nfs4err_resource in 4.1 case" we originally tried fixing this error
return before fixing the problem that we could error out while we still
had lots of available space.  The result was to trade one illegal error
for another in those cases.  We decided that was helpful, so reverted
the change in fc208d026be0c7d60db9118583fc62f6ca97743d, and are only
reinstating it now that we've elimited almost all of those cases.)

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
---
 fs/nfsd/nfs4xdr.c |    7 +++++++
 1 file changed, 7 insertions(+)

Comments

Christoph Hellwig May 12, 2014, 5:33 a.m. UTC | #1
> +	if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) {
> +		struct nfsd4_slot *slot = resp->cstate.slot;
> +
> +		if (slot->sl_flags & NFSD4_SLOT_CACHETHIS)
> +			op->status = nfserr_rep_too_big_to_cache;
> +		else
> +			op->status = nfserr_rep_too_big;

There is a closing brace missing here, which breaks the compile for me.

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bruce Fields May 12, 2014, 2:18 p.m. UTC | #2
On Sun, May 11, 2014 at 10:33:17PM -0700, Christoph Hellwig wrote:
> > +	if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) {
> > +		struct nfsd4_slot *slot = resp->cstate.slot;
> > +
> > +		if (slot->sl_flags & NFSD4_SLOT_CACHETHIS)
> > +			op->status = nfserr_rep_too_big_to_cache;
> > +		else
> > +			op->status = nfserr_rep_too_big;
> 
> There is a closing brace missing here, which breaks the compile for me.

Aie, sorry, I guess I didn't test anything after moving that patch back
in the series.  I normally do a quick test-compile of whatever a patch
touched while rebasing, then run a set of regression tests before
posting.  But in this case I think I finished the rebase in a hurry
Friday, then posted Sunday without remembering what exactly I'd last
done....

Anyway, fixed, new tests are running--thanks for the review.

--b.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 91a50a0..5ff7bea 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3900,6 +3900,13 @@  nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
 			space_needed = COMPOUND_ERR_SLACK_SPACE;
 		op->status = nfsd4_check_resp_size(resp, space_needed);
 	}
+	if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) {
+		struct nfsd4_slot *slot = resp->cstate.slot;
+
+		if (slot->sl_flags & NFSD4_SLOT_CACHETHIS)
+			op->status = nfserr_rep_too_big_to_cache;
+		else
+			op->status = nfserr_rep_too_big;
 	if (op->status == nfserr_resource ||
 	    op->status == nfserr_rep_too_big ||
 	    op->status == nfserr_rep_too_big_to_cache) {