NFSv4.x: Enforce the ca_maxresponsesize_cached on the back channel
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 23 Jan 2016 20:21:08 +0000 (15:21 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 24 Jan 2016 22:12:48 +0000 (17:12 -0500)
We have no duplicate reply cache, so we always set the back channel
ca_maxresponsesize_cached to zero when negotiating the session.
That means we should always error out as soon as we see the server
set args->csa_cachethis.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/callback_proc.c

index e0844fdbd9ac4a99d4616838bf1d38557311abcf..345df63090176a293a177d83b3a7d3c4cf370ddc 100644 (file)
@@ -381,9 +381,8 @@ validate_seqid(struct nfs4_slot_table *tbl, struct cb_sequenceargs * args)
                if (args->csa_cachethis == 0)
                        return htonl(NFS4ERR_RETRY_UNCACHED_REP);
 
-               /* The ca_maxresponsesize_cached is 0 with no DRC */
-               else if (args->csa_cachethis == 1)
-                       return htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE);
+               /* Liar! We never allowed you to set csa_cachethis != 0 */
+               return htonl(NFS4ERR_SEQ_FALSE_RETRY);
        }
 
        /* Wraparound */
@@ -500,6 +499,10 @@ __be32 nfs4_callback_sequence(struct cb_sequenceargs *args,
 
        cps->slotid = args->csa_slotid;
 
+       /* The ca_maxresponsesize_cached is 0 with no DRC */
+       if (args->csa_cachethis != 0)
+               return htonl(NFS4ERR_REP_TOO_BIG_TO_CACHE);
+
        /*
         * Check for pending referring calls.  If a match is found, a
         * related callback was received before the response to the original