nfsd: Reorder nfsd_cache_match to check more powerful discriminators first
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 6 Aug 2014 17:44:25 +0000 (13:44 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Sun, 17 Aug 2014 16:00:13 +0000 (12:00 -0400)
We would normally expect the xid and the checksum to be the best
discriminators. Check them before looking at the procedure number,
etc.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfscache.c

index 74603654b7f9633218650d2fc4031545c4cfe920..122f69185ef511414f73e2bdcf2174ca8b2488c7 100644 (file)
@@ -338,20 +338,24 @@ nfsd_cache_csum(struct svc_rqst *rqstp)
 static bool
 nfsd_cache_match(struct svc_rqst *rqstp, __wsum csum, struct svc_cacherep *rp)
 {
-       /* Check RPC header info first */
-       if (rqstp->rq_xid != rp->c_xid || rqstp->rq_proc != rp->c_proc ||
-           rqstp->rq_prot != rp->c_prot || rqstp->rq_vers != rp->c_vers ||
-           rqstp->rq_arg.len != rp->c_len ||
-           !rpc_cmp_addr(svc_addr(rqstp), (struct sockaddr *)&rp->c_addr) ||
-           rpc_get_port(svc_addr(rqstp)) != rpc_get_port((struct sockaddr *)&rp->c_addr))
+       /* Check RPC XID first */
+       if (rqstp->rq_xid != rp->c_xid)
                return false;
-
        /* compare checksum of NFS data */
        if (csum != rp->c_csum) {
                ++payload_misses;
                return false;
        }
 
+       /* Other discriminators */
+       if (rqstp->rq_proc != rp->c_proc ||
+           rqstp->rq_prot != rp->c_prot ||
+           rqstp->rq_vers != rp->c_vers ||
+           rqstp->rq_arg.len != rp->c_len ||
+           !rpc_cmp_addr(svc_addr(rqstp), (struct sockaddr *)&rp->c_addr) ||
+           rpc_get_port(svc_addr(rqstp)) != rpc_get_port((struct sockaddr *)&rp->c_addr))
+               return false;
+
        return true;
 }