void   nfsd_net_reply_cache_destroy(struct nfsd_net *nn);
 int    nfsd_reply_cache_init(struct nfsd_net *);
 void   nfsd_reply_cache_shutdown(struct nfsd_net *);
-int    nfsd_cache_lookup(struct svc_rqst *);
-void   nfsd_cache_update(struct svc_rqst *, int, __be32 *);
+int    nfsd_cache_lookup(struct svc_rqst *rqstp,
+                         struct svc_cacherep **cacherep);
+void   nfsd_cache_update(struct svc_rqst *rqstp, struct svc_cacherep *rp,
+                         int cachetype, __be32 *statp);
 int    nfsd_reply_cache_stats_show(struct seq_file *m, void *v);
 
 #endif /* NFSCACHE_H */
 
 /**
  * nfsd_cache_lookup - Find an entry in the duplicate reply cache
  * @rqstp: Incoming Call to find
+ * @cacherep: OUT: DRC entry for this request
  *
  * Try to find an entry matching the current call in the cache. When none
  * is found, we try to grab the oldest expired entry off the LRU list. If
  *   %RC_REPLY: Reply from cache
  *   %RC_DROPIT: Do not process the request further
  */
-int nfsd_cache_lookup(struct svc_rqst *rqstp)
+int nfsd_cache_lookup(struct svc_rqst *rqstp, struct svc_cacherep **cacherep)
 {
        struct nfsd_net         *nn;
        struct svc_cacherep     *rp, *found;
        LIST_HEAD(dispose);
        int rtn = RC_DOIT;
 
-       rqstp->rq_cacherep = NULL;
        if (type == RC_NOCACHE) {
                nfsd_stats_rc_nocache_inc();
                goto out;
        found = nfsd_cache_insert(b, rp, nn);
        if (found != rp)
                goto found_entry;
-       rqstp->rq_cacherep = rp;
+       *cacherep = rp;
        rp->c_state = RC_INPROG;
        nfsd_prune_bucket_locked(nn, b, 3, &dispose);
        spin_unlock(&b->cache_lock);
 /**
  * nfsd_cache_update - Update an entry in the duplicate reply cache.
  * @rqstp: svc_rqst with a finished Reply
+ * @rp: IN: DRC entry for this request
  * @cachetype: which cache to update
  * @statp: pointer to Reply's NFS status code, or NULL
  *
  * nfsd failed to encode a reply that otherwise would have been cached.
  * In this case, nfsd_cache_update is called with statp == NULL.
  */
-void nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
+void nfsd_cache_update(struct svc_rqst *rqstp, struct svc_cacherep *rp,
+                      int cachetype, __be32 *statp)
 {
        struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
-       struct svc_cacherep *rp = rqstp->rq_cacherep;
        struct kvec     *resv = &rqstp->rq_res.head[0], *cachv;
        struct nfsd_drc_bucket *b;
        int             len;
 
 {
        const struct svc_procedure *proc = rqstp->rq_procinfo;
        __be32 *statp = rqstp->rq_accept_statp;
+       struct svc_cacherep *rp;
 
        /*
         * Give the xdr decoder a chance to change this if it wants
        if (!proc->pc_decode(rqstp, &rqstp->rq_arg_stream))
                goto out_decode_err;
 
-       switch (nfsd_cache_lookup(rqstp)) {
+       rp = NULL;
+       switch (nfsd_cache_lookup(rqstp, &rp)) {
        case RC_DOIT:
                break;
        case RC_REPLY:
        if (!proc->pc_encode(rqstp, &rqstp->rq_res_stream))
                goto out_encode_err;
 
-       nfsd_cache_update(rqstp, rqstp->rq_cachetype, statp + 1);
+       nfsd_cache_update(rqstp, rp, rqstp->rq_cachetype, statp + 1);
 out_cached_reply:
        return 1;
 
        return 1;
 
 out_update_drop:
-       nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
+       nfsd_cache_update(rqstp, rp, RC_NOCACHE, NULL);
 out_dropit:
        return 0;
 
 out_encode_err:
        trace_nfsd_cant_encode_err(rqstp);
-       nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
+       nfsd_cache_update(rqstp, rp, RC_NOCACHE, NULL);
        *statp = rpc_system_err;
        return 1;
 }
 
        /* Catering to nfsd */
        struct auth_domain *    rq_client;      /* RPC peer info */
        struct auth_domain *    rq_gssclient;   /* "gss/"-style peer info */
-       struct svc_cacherep *   rq_cacherep;    /* cache info */
        struct task_struct      *rq_task;       /* service thread */
        struct net              *rq_bc_net;     /* pointer to backchannel's
                                                 * net namespace