[pnfs] [PATCH] update 2.6.23 pNFS server ops to draft 13

Ricardo Labiaga ricardo.labiaga at netapp.com
Wed Sep 5 20:48:21 EDT 2007


Hi Marc,

It's been applied to the 2.6.23 pNFS server.

- ricardo

On Tue, 2007-09-04 at 09:26 -0700, Marc Eshel wrote:
> From: Marc Eshel <eshel at almaden.ibm.com>
> 
> 
> ---
> 
>  fs/nfsd/nfs4filelayoutxdr.c        |   28
> ++++++++++++++++++----------
>  fs/nfsd/nfs4xdr.c                  |   16 +++++++++++-----
>  include/linux/nfs4.h               |   18 ++++++++++++++++++
>  include/linux/nfs4_pnfs.h          |    7 +------
>  include/linux/nfsd/nfs4layoutxdr.h |    2 +-
>  5 files changed, 49 insertions(+), 22 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4filelayoutxdr.c b/fs/nfsd/nfs4filelayoutxdr.c
> index cab3723..f50e9f9 100644
> --- a/fs/nfsd/nfs4filelayoutxdr.c
> +++ b/fs/nfsd/nfs4filelayoutxdr.c
> @@ -52,13 +52,17 @@ filelayout_encode_devaddr(u32 *p, u32 *e
>         u32 *p_in = p;
> 
>         fdev = (struct pnfs_filelayout_devaddr *)dev_addr;
> -        len = 4
> +XDR_QUADLEN(fdev->r_netid.len)+XDR_QUADLEN(fdev->r_addr.len);
> +        len = 6
> +XDR_QUADLEN(fdev->r_netid.len)+XDR_QUADLEN(fdev->r_addr.len);
>          len = len << 2;
>         if (p + XDR_QUADLEN(len) > end)
>                 return -ENOMEM;
>         WRITE32(len);
> -       WRITE32(fdev->r_dev_type);
> -       WRITE32(1);
> +
> +       WRITE32(1);  /* 1 in indices list */
> +       WRITE32(0);  /* index 0 */
> +       WRITE32(1);  /* 1 DS per device id */
> +       WRITE32(1);  /* 1 in list of multipath */
> +
>         WRITE32(fdev->r_netid.len);
>         WRITEMEM(fdev->r_netid.data,fdev->r_netid.len);
>         WRITE32(fdev->r_addr.len);
> @@ -89,11 +93,13 @@ filelayout_encode_layoutlist_item(u32 *p
>         int len;
>         unsigned int fhlen = item->dev_fh.fh_size;
> 
> -       len = 12 + fhlen;
> +       len = 20 + fhlen;
>         if (p + XDR_QUADLEN(len) > end)
>                 return -ENOMEM;
>         WRITE32(item->dev_id);
> +       WRITE32(item->dev_util); /* nfl_util4 */
>         WRITE32(item->dev_index);
> +       WRITE32(1); /* One for now can be an array of FHs */
>         WRITE32(fhlen);
>         WRITEMEM(&item->dev_fh.fh_base, fhlen);
>         return len;
> @@ -107,19 +113,20 @@ filelayout_encode_layout(u32 *p, u32 *en
>         struct nfsd4_pnfs_layoutlist *item;
>         int i, full_len, len;
>         u32 *totlen;
> +       u32 nfl_util;
> 
>         flp = (struct nfsd4_pnfs_filelayout *)layout;
> -       len = 32;
> +       len = 4;
>         if (p + XDR_QUADLEN(len + 4) > end)
>                 return -ENOMEM;
>         full_len = len + 4;
>         totlen = p;     /* fill-in opaque layout length later*/
>         p++;
> -       WRITE32(flp->lg_stripe_type);
> -       WRITE32(flp->lg_commit_through_mds);
> -       WRITE64(flp->lg_stripe_unit);
> -       WRITE64(flp->lg_file_size);
> -       WRITE32(flp->lg_indexlen);
> +       nfl_util = flp->lg_stripe_unit;
> +       if (flp->lg_commit_through_mds)
> +               nfl_util |= NFL4_UFLG_COMMIT_THRU_MDS;
> +       if (flp->lg_stripe_type)
> +               nfl_util |= NFL4_UFLG_DENSE;
> 
>         if (flp->lg_indexlen > 0) {   //??? if>0 must build index list
>                 printk("filelayout_encode_layout: XXX add loop for
> index list\n");
> @@ -127,6 +134,7 @@ filelayout_encode_layout(u32 *p, u32 *en
>         WRITE32(flp->lg_llistlen);
>         for (i=0; i < flp->lg_llistlen; i++) {
>                 item = &flp->lg_llist[i];
> +               item->dev_util = nfl_util;
>                 len = filelayout_encode_layoutlist_item(p, end, item);
>                 if (len > 0) {
>                         p += XDR_QUADLEN(len);
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 1c4b7f2..971f1c2 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -3158,10 +3158,14 @@ nfsd4_encode_devlist_item(struct nfsd4_c
>         int len;
>         ENCODE_HEAD;
> 
> -       RESERVE_SPACE(8);
> +       RESERVE_SPACE(28);
>         WRITE32(dlist->dev_id);
> -       WRITE32(lotype);
> +
> +       WRITE32(1); /* 1 in list of device_addr */
> +       WRITE32(lotype); /* layout type */
> +      
>         ADJUST_ARGS();
> +       dprintk("%s: device id %d\n",__FUNCTION__, dlist->dev_id);
> 
>         if (ex_ops->devaddr_encode == NULL && lotype ==
> LAYOUT_NFSV4_FILES)
>         {
> @@ -3211,7 +3215,7 @@ nfsd4_encode_getdevlist(struct nfsd4_com
>                 item = gdevl->gd_devlist;
>                 for (i = 0; i < gdevl->gd_devlist_len; i++) {
>                         dprintk("%s: i %d item %p\n",__FUNCTION__, i,
> item);
> -                       len = nfsd4_encode_devlist_item (resp, item,
> +                       len = nfsd4_encode_devlist_item(resp, item,
>                                                 gdevl->gd_ops,
> gdevl->gd_type);
>                         item++;
>                         if (len <= 0) {
> @@ -3239,12 +3243,14 @@ nfsd4_encode_getdevinfo(struct nfsd4_com
> 
>         printk("%s: err %d\n",__FUNCTION__, nfserr);
>         if (!nfserr) {
> -               RESERVE_SPACE(8);
> +               RESERVE_SPACE(28);
>                 WRITE32(gdev->gd_type);
> +               ADJUST_ARGS();
> +
>                 if (gdev->gd_ops->devaddr_encode == NULL &&
>                                         gdev->gd_type ==
> LAYOUT_NFSV4_FILES)
>                 {
> -                       len = filelayout_encode_devaddr(p,
> resp->end,gdev->gd_devaddr);
> +                       len = filelayout_encode_devaddr(p, resp->end,
> gdev->gd_devaddr);
>                         filelayout_free_devaddr(gdev->gd_devaddr);
>                 }
>                 else {
> diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
> index a87d469..36bfd37 100644
> --- a/include/linux/nfs4.h
> +++ b/include/linux/nfs4.h
> @@ -297,6 +297,11 @@ enum nfsstat4 {
>         NFS4ERR_CONN_BINDING_NOT_ENFORCED = 10073,
>         NFS4ERR_CLIENTID_BUSY = 10074,
>         NFS4ERR_PNFS_IO_HOLE = 10075,
> +       NFS4ERR_SEQ_FALSE_RETRY = 10076,
> +       NFS4ERR_BAD_HIGH_SLOT = 10077,
> +       NFS4ERR_DEADSESSION = 10078,
> +       NFS4ERR_ENCR_ALG_UNSUPP = 10079,
> +       NFS4ERR_PNFS_NO_LAYOUT = 10080
>  };
> 
>  /*
> @@ -500,6 +505,19 @@ enum pnfs_iomode {
>         IOMODE_ANY = 3,
>  };
> 
> +#define NFL4_UFLG_MASK                 0x0000003F
> +#define NFL4_UFLG_DENSE                        0x00000001
> +#define NFL4_UFLG_COMMIT_THRU_MDS      0x00000002
> +#define NFL4_UFLG_STRIPE_UNIT_SIZE_MASK        0xFFFFFFC0
> +
> +/* Encoded in the loh_body field of type layouthint4 */
> +enum filelayout_hint_care4 {
> +       NFLH4_CARE_DENSE                = NFL4_UFLG_DENSE,
> +       NFLH4_CARE_COMMIT_THRU_MDS      = NFL4_UFLG_COMMIT_THRU_MDS,
> +       NFLH4_CARE_STRIPE_UNIT_SIZE     = 0x00000040,
> +       NFLH4_CARE_STRIPE_COUNT         = 0x00000080
> +};
> +
>  #endif /* CONFIG_PNFS */
> 
>  /* Create Session Flags */
> diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
> index 74d25fd..48c33fa 100644
> --- a/include/linux/nfs4_pnfs.h
> +++ b/include/linux/nfs4_pnfs.h
> @@ -122,13 +122,13 @@ struct pnfs_layoutdriver_type {
>  struct pnfs_device
>  {
>         int           dev_id;
> -       int           dev_type;
>         unsigned int  dev_count;
>         unsigned int  dev_addr_len;
>         char          dev_addr_buf[NFS4_PNFS_DEV_MAXSIZE];
>  };
> 
>  struct pnfs_devicelist {
> +       int                 layout_type;
>         unsigned int        num_devs;
>         unsigned int        eof;
>         unsigned int        devs_len;
> @@ -170,9 +170,4 @@ void pnfs_unregister_layoutdriver(struct
>  #define NFS4_PNFS_MAX_LAYOUTS 4
>  #define NFS4_PNFS_PRIVATE_LAYOUT 0x80000000
> 
> -enum file_layout_device_type {
> -       FILE_SIMPLE  = 1,
> -       FILE_COMPLEX = 2
> -};
> -
>  #endif /* LINUX_NFS4_PNFS_H */
> diff --git a/include/linux/nfsd/nfs4layoutxdr.h
> b/include/linux/nfsd/nfs4layoutxdr.h
> index 25cde5f..2d0159a 100644
> --- a/include/linux/nfsd/nfs4layoutxdr.h
> +++ b/include/linux/nfsd/nfs4layoutxdr.h
> @@ -58,7 +58,6 @@ #define ADJUST_ARGS()           resp->p
> 
>  /* the nfsd4_pnfs_devlist dev_addr for the file layout type */
>  struct pnfs_filelayout_devaddr {
> -       u32                     r_dev_type;
>         struct xdr_netobj       r_netid;
>         struct xdr_netobj       r_addr;
>  };
> @@ -66,6 +65,7 @@ struct pnfs_filelayout_devaddr {
>  struct nfsd4_pnfs_layoutlist {
>         u32                             dev_id;
>         u32                             dev_index;
> +       u32                             dev_util;
>         struct knfsd_fh                 dev_fh;
>  };
> 
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> 
> 


More information about the pNFS mailing list