nfsdstats.nfs4_opcount[opnum]++;
 }
 
-static void cstate_free(struct nfsd4_compound_state *cstate)
-{
-       if (cstate == NULL)
-               return;
-       fh_put(&cstate->current_fh);
-       fh_put(&cstate->save_fh);
-       BUG_ON(cstate->replay_owner);
-       kfree(cstate);
-}
-
-static struct nfsd4_compound_state *cstate_alloc(void)
-{
-       struct nfsd4_compound_state *cstate;
-
-       cstate = kmalloc(sizeof(struct nfsd4_compound_state), GFP_KERNEL);
-       if (cstate == NULL)
-               return NULL;
-       fh_init(&cstate->current_fh, NFS4_FHSIZE);
-       fh_init(&cstate->save_fh, NFS4_FHSIZE);
-       cstate->replay_owner = NULL;
-       return cstate;
-}
-
 typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *,
                              void *);
 
 {
        struct nfsd4_op *op;
        struct nfsd4_operation *opdesc;
-       struct nfsd4_compound_state *cstate = NULL;
+       struct nfsd4_compound_state *cstate = &resp->cstate;
        int             slack_bytes;
        __be32          status;
 
        resp->xbuf = &rqstp->rq_res;
-       resp->p = rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len;
+       resp->p = rqstp->rq_res.head[0].iov_base +
+                                               rqstp->rq_res.head[0].iov_len;
        resp->tagp = resp->p;
        /* reserve space for: taglen, tag, and opcnt */
        resp->p += 2 + XDR_QUADLEN(args->taglen);
        resp->tag = args->tag;
        resp->opcnt = 0;
        resp->rqstp = rqstp;
+       resp->cstate.replay_owner = NULL;
+       fh_init(&resp->cstate.current_fh, NFS4_FHSIZE);
+       fh_init(&resp->cstate.save_fh, NFS4_FHSIZE);
 
        /*
         * According to RFC3010, this takes precedence over all other errors.
        if (args->minorversion > NFSD_SUPPORTED_MINOR_VERSION)
                goto out;
 
-       status = nfserr_resource;
-       cstate = cstate_alloc();
-       if (cstate == NULL)
-               goto out;
-
        status = nfs_ok;
        while (!status && resp->opcnt < args->opcnt) {
                op = &args->ops[resp->opcnt++];
                nfsd4_increment_op_stats(op->opnum);
        }
 
-       cstate_free(cstate);
+       fh_put(&resp->cstate.current_fh);
+       fh_put(&resp->cstate.save_fh);
+       BUG_ON(resp->cstate.replay_owner);
 out:
        nfsd4_release_compoundargs(args);
        dprintk("nfsv4 compound returned %d\n", ntohl(status));
 
 #define XDR_LEN(n)                     (((n) + 3) & ~3)
 
 struct nfsd4_compound_state {
-       struct svc_fh current_fh;
-       struct svc_fh save_fh;
-       struct nfs4_stateowner *replay_owner;
+       struct svc_fh           current_fh;
+       struct svc_fh           save_fh;
+       struct nfs4_stateowner  *replay_owner;
 };
 
 struct nfsd4_change_info {
        u32                             taglen;
        char *                          tag;
        u32                             opcnt;
-       __be32 *                        tagp; /* where to encode tag and  opcount */
+       __be32 *                        tagp; /* tag, opcount encode location */
+       struct nfsd4_compound_state     cstate;
 };
 
 #define NFS4_SVC_XDRSIZE               sizeof(struct nfsd4_compoundargs)