[pnfs] Status meeting pNFS

William A.(Andy) Adamson andros at citi.umich.edu
Thu Aug 31 11:38:27 EDT 2006


marc at almaden.ibm.com said:
> Another alternative is to use *resp in the prototype and extract 'p' in 
> the routine that we call. This would be cleaner allowing the routine to 
> also update 'p' so the caller can tell where we are in the buffer without 
> any extra parameter that return the length, and we can use the returned 
> int for error code instead.
>
> Marc.
bhalevy at panasas.com said:
> I also like this approach better, especially since it allows using
> semi-standard XDR macros RESERVE_SPACE, WRITE* or ADJUST_ARGS. If we want to
> provide a solution which is independent from xdr I think we should also
> provide a size_t parameter with the maximum allowed  buffer size. the
> declaration would look like layout_get(unsigned int **p, size_t  maxlength,
> void *layout); 

i don't see any reason to pass in this whole structure. only 'p' and 'end' are 
used.

struct nfsd4_compoundres {
        /* scratch variables for XDR encode */
        u32 *                           p;
        u32 *                           end;
        struct xdr_buf *                xbuf;
        struct svc_rqst *               rqstp;

        u32                             taglen;
        char *                          tag;
        u32                             opcnt;
        u32 *                           tagp; /* where to encode tag and  
opcount */
};

the WRITE* macro's work on 'p' so resp is not needed to use them.


bhalevy at panasas.com said:
> Currently the layout needs to be encoded in XDR by the file system code
> which means preceding the opaque layout with a 4 byte, XDR encoded  length.
> If you want to keep the file system ignorant about XDR then the  routing also
> needs to return the length of whatever it encoded opaquely  and the nfsd
> should "frame" the layout bits with XDR length and realign  resp->p if
> needed. 

it's not so much keeping the file system ignorant of the XDR as it is keeping 
the nfs layer ignorant of the file system opaque layout. either way, benny's 
suggestion will work.

int layout_get(unsigned int **p, size_t  maxbytes, void *layout); 

layout_get returns a positive length upon succes, or a negative error code 
upon failure.

and maxbytes = (resp->end - resp->p) << 2; always on a 4 byte boundary

for layouts that want to do XDR, the macro RESERVE_SPACE(nbytes) becomes 
something like

RESERVE_SPACE(nbutes, maxbytes)
	BUG_ON(XDR_QUADLEN(nbytes) > (maxbytes >> 2);            \

nfsd4_encode_layoutget then 'frames' the layout bytes with the returned length 
and realign resp->p.


-->Andy






More information about the pNFS mailing list