Re: [pnfs] [PATCH 7/7] nfsd: nfs4xdr decode_stateid helper function

J. Bruce Fields
2008-08-19T22:44:35Z

On Sun, Aug 17, 2008 at 03:02:01PM +0300, Boaz Harrosh wrote:
> Trond Myklebust wrote:
> > On Wed, 2008-08-13 at 11:03 -0400, J. Bruce Fields wrote:
> >> On Wed, Aug 13, 2008 at 10:31:54AM +0300, Benny Halevy wrote:
> >>> On Aug. 12, 2008, 22:04 +0300, "J. Bruce Fields" <bfields@fieldses.org> wrote:
> >>>> On Tue, Aug 12, 2008 at 08:46:18PM +0300, Benny Halevy wrote:
> >>>>> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> >>>>> ---
> >>>>> fs/nfsd/nfs4xdr.c | 99 +++++++++++++++++++++++++++++-----------------------
> >>>>> 1 files changed, 55 insertions(+), 44 deletions(-)
> >>>>>
> >>>>> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> >>>>> index 47ac498..9570b1b 100644
> >>>>> --- a/fs/nfsd/nfs4xdr.c
> >>>>> +++ b/fs/nfsd/nfs4xdr.c
> >>>>> static __be32
> >>>>> @@ -929,9 +939,10 @@ nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write)
> >>>>> int len;
> >>>>> DECODE_HEAD;
> >>>>>
> >>>>> - READ_BUF(sizeof(stateid_opaque_t) + 20);
> >>>>> - READ32(write->wr_stateid.si_generation);
> >>>>> - COPYMEM(&write->wr_stateid.si_opaque, sizeof(stateid_opaque_t));
> >>>>> + status = nfsd4_decode_stateid(argp, &write->wr_stateid);
> >>>>> + if (status)
> >>>>> + return status;
> >>>>> + READ_BUF(16);
> >>>> How did that 20 become a 16?
> >>> It was sizeof(stateid_opaque_t) + 20 == sizeof(stateid_t) - 4 + 20 ==
> >>> sizeof(stateid_t) + 16.
> >> Whoops! Even now I still fall into the stateid_opaque_t/stateid_t trap!
> >
> > Which is a good reason for ditching the entire confusing typedef, and
> > replacing it with a packed structure instead:
> >
> > struct stateid {
> > __be32 generation;
> > char opaque[12];
> > } __attribute__((packed));
> >
> > Trond
> >
>
> Please use the "__packed" Kernel macro for better compilers support.
>
> And Yes I would suggest using "__packed" where ever a struct is defined
> for on-the-wire. Even just for indication to fellow programmers that this
> is going on the wire as is.

OK. This all sounds reasonable, but I can't volunteer at the moment,
so: patches welcomed.

--b.