On Sat, Mar 28, 2009 at 11:30:52AM +0300, Benny Halevy wrote: > From: Andy Adamson <andros@xxxxxxxxxx> > > Remove the allocation of struct nfsd4_compound_state. Thanks, applied. (Some minor fixup required as I wanted to apply this before #1.) --b. > > Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> > Signed-off-by: Benny Halevy <bhalevy@xxxxxxxxxxx> > --- > fs/nfsd/nfs4proc.c | 40 +++++++++------------------------------- > include/linux/nfsd/xdr4.h | 9 +++++---- > 2 files changed, 14 insertions(+), 35 deletions(-) > > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index 7839654..c8e1ad0 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -809,29 +809,6 @@ static inline void nfsd4_increment_op_stats(u32 opnum) > 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 *); > > @@ -859,12 +836,13 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, > { > 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); > @@ -873,6 +851,9 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, > 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); > /* Use the deferral mechanism only for NFSv4.0 compounds */ > rqstp->rq_usedeferral = (args->minorversion == 0); > > @@ -883,11 +864,6 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, > 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++]; > @@ -964,7 +940,9 @@ encode_op: > status = nfserr_jukebox; > } > > - 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); > /* Reset deferral mechanism for RPC deferrals */ > diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h > index 27bd3e3..fd15ddc 100644 > --- a/include/linux/nfsd/xdr4.h > +++ b/include/linux/nfsd/xdr4.h > @@ -45,9 +45,9 @@ > #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 { > @@ -416,7 +416,8 @@ struct nfsd4_compoundres { > 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) > -- > 1.6.2.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html