[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