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

Marc Eshel eshel at almaden.ibm.com
Tue Sep 4 12:26:06 EDT 2007


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;
 };
 


More information about the pNFS mailing list