Tuck away the replay_owner in the cstate while we're at it.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
 
 static inline __be32
 nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-          struct nfsd4_open *open, struct nfs4_stateowner **replay_owner)
+          struct nfsd4_open *open)
 {
        __be32 status;
        dprintk("NFSD: nfsd4_open filename %.*s op_stateowner %p\n",
 out:
        if (open->op_stateowner) {
                nfs4_get_stateowner(open->op_stateowner);
-               *replay_owner = open->op_stateowner;
+               cstate->replay_owner = open->op_stateowner;
        }
        nfs4_unlock_state();
        return status;
                return;
        fh_put(&cstate->current_fh);
        fh_put(&cstate->save_fh);
+       BUG_ON(cstate->replay_owner);
        kfree(cstate);
 }
 
                return NULL;
        fh_init(&cstate->current_fh, NFS4_FHSIZE);
        fh_init(&cstate->save_fh, NFS4_FHSIZE);
+       cstate->replay_owner = NULL;
        return cstate;
 }
 
 {
        struct nfsd4_op *op;
        struct nfsd4_compound_state *cstate = NULL;
-       struct nfs4_stateowner *replay_owner = NULL;
        int             slack_bytes;
        __be32          status;
 
                        break;
                case OP_CLOSE:
                        op->status = nfsd4_close(rqstp, cstate,
-                                                &op->u.close, &replay_owner);
+                                                &op->u.close);
                        break;
                case OP_COMMIT:
                        op->status = nfsd4_commit(rqstp, cstate,
                        op->status = nfsd4_link(rqstp, cstate, &op->u.link);
                        break;
                case OP_LOCK:
-                       op->status = nfsd4_lock(rqstp, cstate, &op->u.lock,
-                                               &replay_owner);
+                       op->status = nfsd4_lock(rqstp, cstate, &op->u.lock);
                        break;
                case OP_LOCKT:
                        op->status = nfsd4_lockt(rqstp, cstate, &op->u.lockt);
                        break;
                case OP_LOCKU:
-                       op->status = nfsd4_locku(rqstp, cstate, &op->u.locku,
-                                                &replay_owner);
+                       op->status = nfsd4_locku(rqstp, cstate, &op->u.locku);
                        break;
                case OP_LOOKUP:
                        op->status = nfsd4_lookup(rqstp, cstate,
                        break;
                case OP_OPEN:
                        op->status = nfsd4_open(rqstp, cstate,
-                                               &op->u.open, &replay_owner);
+                                               &op->u.open);
                        break;
                case OP_OPEN_CONFIRM:
                        op->status = nfsd4_open_confirm(rqstp, cstate,
-                                                       &op->u.open_confirm,
-                                                       &replay_owner);
+                                                       &op->u.open_confirm);
                        break;
                case OP_OPEN_DOWNGRADE:
                        op->status = nfsd4_open_downgrade(rqstp, cstate,
-                                                        &op->u.open_downgrade,
-                                                        &replay_owner);
+                                                       &op->u.open_downgrade);
                        break;
                case OP_PUTFH:
                        op->status = nfsd4_putfh(rqstp, cstate, &op->u.putfh);
 
 encode_op:
                if (op->status == nfserr_replay_me) {
-                       op->replay = &replay_owner->so_replay;
+                       op->replay = &cstate->replay_owner->so_replay;
                        nfsd4_encode_replay(resp, op);
                        status = op->status = op->replay->rp_status;
                } else {
                        nfsd4_encode_operation(resp, op);
                        status = op->status;
                }
-               if (replay_owner) {
-                       nfs4_put_stateowner(replay_owner);
-                       replay_owner = NULL;
+               if (cstate->replay_owner) {
+                       nfs4_put_stateowner(cstate->replay_owner);
+                       cstate->replay_owner = NULL;
                }
                /* XXX Ugh, we need to get rid of this kind of special case: */
                if (op->opnum == OP_READ && op->u.read.rd_filp)
 
 
 __be32
 nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-                  struct nfsd4_open_confirm *oc,
-                  struct nfs4_stateowner **replay_owner)
+                  struct nfsd4_open_confirm *oc)
 {
        __be32 status;
        struct nfs4_stateowner *sop;
 out:
        if (oc->oc_stateowner) {
                nfs4_get_stateowner(oc->oc_stateowner);
-               *replay_owner = oc->oc_stateowner;
+               cstate->replay_owner = oc->oc_stateowner;
        }
        nfs4_unlock_state();
        return status;
 __be32
 nfsd4_open_downgrade(struct svc_rqst *rqstp,
                     struct nfsd4_compound_state *cstate,
-                    struct nfsd4_open_downgrade *od,
-                    struct nfs4_stateowner **replay_owner)
+                    struct nfsd4_open_downgrade *od)
 {
        __be32 status;
        struct nfs4_stateid *stp;
 out:
        if (od->od_stateowner) {
                nfs4_get_stateowner(od->od_stateowner);
-               *replay_owner = od->od_stateowner;
+               cstate->replay_owner = od->od_stateowner;
        }
        nfs4_unlock_state();
        return status;
  */
 __be32
 nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-           struct nfsd4_close *close, struct nfs4_stateowner **replay_owner)
+           struct nfsd4_close *close)
 {
        __be32 status;
        struct nfs4_stateid *stp;
 out:
        if (close->cl_stateowner) {
                nfs4_get_stateowner(close->cl_stateowner);
-               *replay_owner = close->cl_stateowner;
+               cstate->replay_owner = close->cl_stateowner;
        }
        nfs4_unlock_state();
        return status;
  */
 __be32
 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-          struct nfsd4_lock *lock, struct nfs4_stateowner **replay_owner)
+          struct nfsd4_lock *lock)
 {
        struct nfs4_stateowner *open_sop = NULL;
        struct nfs4_stateowner *lock_sop = NULL;
                release_stateowner(lock_sop);
        if (lock->lk_replay_owner) {
                nfs4_get_stateowner(lock->lk_replay_owner);
-               *replay_owner = lock->lk_replay_owner;
+               cstate->replay_owner = lock->lk_replay_owner;
        }
        nfs4_unlock_state();
        return status;
 
 __be32
 nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
-           struct nfsd4_locku *locku, struct nfs4_stateowner **replay_owner)
+           struct nfsd4_locku *locku)
 {
        struct nfs4_stateid *stp;
        struct file *filp = NULL;
 out:
        if (locku->lu_stateowner) {
                nfs4_get_stateowner(locku->lu_stateowner);
-               *replay_owner = locku->lu_stateowner;
+               cstate->replay_owner = locku->lu_stateowner;
        }
        nfs4_unlock_state();
        return status;
 
 struct nfsd4_compound_state {
        struct svc_fh current_fh;
        struct svc_fh save_fh;
+       struct nfs4_stateowner *replay_owner;
 };
 
 struct nfsd4_change_info {
 extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
                struct svc_fh *current_fh, struct nfsd4_open *open);
 extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp,
-               struct nfsd4_compound_state *, struct nfsd4_open_confirm *oc,
-               struct nfs4_stateowner **);
+               struct nfsd4_compound_state *, struct nfsd4_open_confirm *oc);
 extern __be32 nfsd4_close(struct svc_rqst *rqstp,
                struct nfsd4_compound_state *,
-               struct nfsd4_close *close,
-               struct nfs4_stateowner **replay_owner);
+               struct nfsd4_close *close);
 extern __be32 nfsd4_open_downgrade(struct svc_rqst *rqstp,
-               struct nfsd4_compound_state *, struct nfsd4_open_downgrade *od,
-               struct nfs4_stateowner **replay_owner);
+               struct nfsd4_compound_state *,
+               struct nfsd4_open_downgrade *od);
 extern __be32 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *,
-               struct nfsd4_lock *lock,
-               struct nfs4_stateowner **replay_owner);
+               struct nfsd4_lock *lock);
 extern __be32 nfsd4_lockt(struct svc_rqst *rqstp,
                struct nfsd4_compound_state *,
                struct nfsd4_lockt *lockt);
 extern __be32 nfsd4_locku(struct svc_rqst *rqstp,
                struct nfsd4_compound_state *,
-               struct nfsd4_locku *locku,
-               struct nfs4_stateowner **replay_owner);
+               struct nfsd4_locku *locku);
 extern __be32
 nfsd4_release_lockowner(struct svc_rqst *rqstp,
                struct nfsd4_release_lockowner *rlockowner);