[pnfs] Status meeting pNFS

William A.(Andy) Adamson andros at citi.umich.edu
Wed Aug 30 14:11:41 EDT 2006


hi benny


> I'd like to discuss some nfsd internal API issues:
>   - first parameter for layout_encode is currently unsigned int **resp, 
> shouldn't it be
>     struct nfsd4_compoundres *resp like for the filelayout_encode methods?

dean and i looked - and indeed this is a bug.

what the encode functions want is to dereference the u32 * resp->p which 
points to the location into the encode xdr buf.

the current code works ONLY because the nfsd4_compoundres struct has 'p' as 
the first element in the structure:


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

and therefore, dereferencing the *resp as an unsigned int ** gives you resp->p.

this is a bug. the declaration is cool, but fs/nfsd/nfs4xdr.c: 
nfsd4_encode_layoutget() needs to be changed as follows


diff -puN fs/nfsd/nfs4xdr.c~fix-pnfsd-encode-layout fs/nfsd/nfs4xdr.c
--- pnfs/fs/nfsd/nfs4xdr.c~fix-pnfsd-encode-layout      2006-08-30 
13:37:09.000000000 -0400
+++ pnfs-andros/fs/nfsd/nfs4xdr.c       2006-08-30 13:37:33.000000000 -0400
@@ -2785,11 +2785,11 @@ nfsd4_encode_layoutget(struct nfsd4_comp
                if (lgp->lg_ops->layout_encode == NULL &&
                                lgp->lg_type == LAYOUT_NFSV4_FILES)
                {
-                       filelayout_encode_layout(resp, lgp->lg_layout);
+                       filelayout_encode_layout(&resp->p, lgp->lg_layout);
                        filelayout_free_layout(lgp->lg_layout);
                }
                else {
-                       lgp->lg_ops->layout_encode((void *)resp, lgp->
lg_layout);+                       lgp->lg_ops->layout_encode(&resp->p, lgp->
lg_layout);
                        lgp->lg_ops->layout_free(lgp->lg_layout);
                }
        }




> 
>   - similarly for devaddr_encode (currently it's void *)

dean and i think that devaddr_encode should be changed to

        void (*devaddr_encode)(unsigned int **, void * devaddr);

and have &resp->p passed as the first argument, just as in the fix above. this 
is so layout modules will not have to include nfs .h files in order to compile.


> 
>   - can the encode functions return int status rather than void?
>     It's possible in our case to get an internal failure here.

yes. good idea.

> 
>   - layout_get and layout_return API get a void * as second parameter
>     but actually a struct nfsd4_pnfs_layout{get,return} * pointer is passed
>     and they need to typecast the void * internally.  Can't the API be 
> formalized?

we could follow the pattern of include/linux/nfs_fs_i.h which is included in 
include/linux/fs.h and formalize the API. ok by me.


as far as the rest of your message concerning pnfsd layoutget error processing 
- i'll respond later after some thought..

-->Andy



More information about the pNFS mailing list