]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
nfsd4: really fix nfs4err_resource in 4.1 case
authorJ. Bruce Fields <bfields@redhat.com>
Thu, 8 May 2014 21:38:18 +0000 (17:38 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 28 May 2014 18:53:06 +0000 (14:53 -0400)
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

index 1bf5cd3ddde31e741ed5b117d3f921905552ced6..abbe978327499a0271bd8915dd71aadaceb37591 100644 (file)
@@ -3903,6 +3903,14 @@ 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) {