[pnfs] [PATCH 03/10] pnfsd: Use 128 bit deviceid on server

Marc Eshel eshel at almaden.ibm.com
Sat Feb 9 03:25:59 EST 2008


From: Dean Hildebrand <dhildeb at us.ibm.com>


---

 fs/nfsd/nfs4filelayoutxdr.c        |   12 +++++++-----
 fs/nfsd/nfs4pnfsds.c               |    4 ++--
 fs/nfsd/nfs4proc.c                 |    6 +++---
 fs/nfsd/nfs4state.c                |    6 +++---
 fs/nfsd/nfs4xdr.c                  |   32 +++++++++++++++++---------------
 include/linux/exportfs.h           |   27 ++++++++++++++++++++-------
 include/linux/nfsd/nfs4layoutxdr.h |   20 +++++++++-----------
 include/linux/nfsd/nfsd4_pnfs.h    |    2 +-
 include/linux/nfsd/pnfsd.h         |    2 +-
 include/linux/nfsd/state.h         |    2 +-
 10 files changed, 64 insertions(+), 49 deletions(-)

diff --git a/fs/nfsd/nfs4filelayoutxdr.c b/fs/nfsd/nfs4filelayoutxdr.c
index 183f23c..7084c70 100644
--- a/fs/nfsd/nfs4filelayoutxdr.c
+++ b/fs/nfsd/nfs4filelayoutxdr.c
@@ -154,14 +154,15 @@ filelayout_encode_layout(struct pnfs_xdr_info *resp, void *layout)
 
 	resp->bytes_written = 0; /* in case there is an error */
 
-	dprintk("%s: devid %u, fsi %u, numfh %u\n",
+	dprintk("%s: device_id %llx:%llx fsi %u, numfh %u\n",
 		__func__,
-		flp->device_id,
+		flp->device_id.pnfs_fsid,
+		flp->device_id.pnfs_devid,
 		flp->lg_first_stripe_index,
 		flp->lg_fh_length);
 
 	/* Ensure room for len, devid, util, and first_stripe_index */
-	leadcount = 20;
+	leadcount = 32;
 	RESERVE_SPACE(leadcount);
 
 	/* Ensure that there is enough space assuming the largest
@@ -182,8 +183,9 @@ filelayout_encode_layout(struct pnfs_xdr_info *resp, void *layout)
 	len += 4;
 
 	/* encode device id */
-	WRITE32(flp->device_id);
-	len += 4;
+	WRITE64(flp->device_id.pnfs_fsid);
+	WRITE64(flp->device_id.pnfs_devid);
+	len += sizeof(deviceid_t);
 
 	/* set and encode flags */
 	nfl_util = flp->lg_stripe_unit;
diff --git a/fs/nfsd/nfs4pnfsds.c b/fs/nfsd/nfs4pnfsds.c
index b97a288..b585ef8 100644
--- a/fs/nfsd/nfs4pnfsds.c
+++ b/fs/nfsd/nfs4pnfsds.c
@@ -201,7 +201,7 @@ alloc_init_mds_id(struct pnfs_get_state *gsp)
 	INIT_LIST_HEAD(&mdp->di_hash);
 	INIT_LIST_HEAD(&mdp->di_mdsclid);
 	list_add(&mdp->di_hash, &mds_id_tbl);
-	mdp->di_mdsid = gsp->devid;
+	mdp->di_mdsid = gsp->dsid;
 	mdp->di_mdsboot = 0;
 	return mdp;
 }
@@ -215,7 +215,7 @@ alloc_init_ds_clientid(struct pnfs_get_state *gsp)
 
 	dprintk("pNFSD: %s\n", __func__);
 
-	mdp = find_pnfs_mds_id(gsp->devid);
+	mdp = find_pnfs_mds_id(gsp->dsid);
 	if (!mdp)
 		mdp = alloc_init_mds_id(gsp);
 	if (!mdp)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 88edf0c..8cc6a14 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -1201,9 +1201,9 @@ nfsd4_getdevinfo(struct svc_rqst *rqstp,
 	struct svc_fh *current_fh = &cstate->current_fh;
 	int status;
 
-	dprintk("%s: type %u dev_id %u maxcnt %u\n",
-	       __func__, gdp->gd_type, gdp->gd_devid,
-	       gdp->gd_maxcount);
+	dprintk("%s: type %u dev_id %llx:%llx maxcnt %u\n",
+	       __func__, gdp->gd_type, gdp->gd_devid.pnfs_fsid,
+	       gdp->gd_devid.pnfs_devid, gdp->gd_maxcount);
 
 	status = fh_verify(rqstp, current_fh, 0, MAY_NOP);
 	if (status) {
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 232e7aa..abcb640 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -4288,7 +4288,7 @@ release_pnfs_ds_dev_list(struct nfs4_stateid *stp)
 }
 
 static int
-nfs4_add_pnfs_ds_dev(struct nfs4_stateid *stp, u32 devid)
+nfs4_add_pnfs_ds_dev(struct nfs4_stateid *stp, u32 dsid)
 {
 	struct pnfs_ds_dev_entry *ddp;
 
@@ -4298,7 +4298,7 @@ nfs4_add_pnfs_ds_dev(struct nfs4_stateid *stp, u32 devid)
 
 	INIT_LIST_HEAD(&ddp->dd_dev_entry);
 	list_add(&ddp->dd_dev_entry, &stp->st_pnfs_ds_id);
-	ddp->dd_devid = devid;
+	ddp->dd_dsid = dsid;
 	return 0;
 }
 
@@ -4754,7 +4754,7 @@ nfs4_pnfs_cb_get_state(struct super_block *sb, struct pnfs_get_state *arg)
 		/* XXX ANDROS: marc removed nfs4_check_fh - how come? */
 
 		/* arg->devid is the Data server id, set by the cluster fs */
-		status = nfs4_add_pnfs_ds_dev(stp, arg->devid);
+		status = nfs4_add_pnfs_ds_dev(stp, arg->dsid);
 		if (status)
 			goto out;
 
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 32b5a55..0dcc581 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1250,20 +1250,15 @@ nfsd4_decode_getdevlist(struct nfsd4_compoundargs *argp,
 	DECODE_TAIL;
 }
 
-/* GETDEVICEINFO: minorversion1-13.txt
-u32             pnfs_deviceid4                  device_id;
-u32             pnfs_layouttype4                layout_type;
-u32             count4                          maxcount;
-
-*/
-  static int
+static int
 nfsd4_decode_getdevinfo(struct nfsd4_compoundargs *argp,
 			struct nfsd4_pnfs_getdevinfo *gdev)
 {
 	DECODE_HEAD;
 
-	READ_BUF(12);
-	READ32(gdev->gd_devid);
+	READ_BUF(8 + sizeof(deviceid_t));
+	READ64(gdev->gd_devid.pnfs_fsid);
+	READ64(gdev->gd_devid.pnfs_devid);
 	READ32(gdev->gd_type);
 	READ32(gdev->gd_maxcount);
 
@@ -3222,8 +3217,12 @@ nfsd4_encode_devlist_iterator(struct nfsd4_compoundres *resp,
 			goto out;
 
 		/* Encode device id and layout type */
-		RESERVE_SPACE(8);
-		WRITE32(iter_arg.devid);
+		RESERVE_SPACE(4 + sizeof(deviceid_t));
+		/* TODO: Need to encode an identifier that uniquely
+		 * identifies the export. (fsid)
+		 */
+		WRITE64(0L);			/* devid major */
+		WRITE64(iter_arg.devid);	/* devid minor */
 		WRITE32(iter_arg.type);
 		ADJUST_ARGS();
 		*bytes_written += 8;
@@ -3236,18 +3235,20 @@ nfsd4_encode_devlist_iterator(struct nfsd4_compoundres *resp,
 
 		/* Set dev info arguments */
 		info_arg.type = gdevl->gd_type;
-		info_arg.devid = iter_arg.devid;
+		info_arg.devid.pnfs_fsid = 0;
+		info_arg.devid.pnfs_devid = iter_arg.devid;
 
 		/* set xdr info */
 		info_arg.xdr.p = resp->p;
 		info_arg.xdr.end = resp->end;
 		info_arg.xdr.maxcount = maxcount;
 
-		dprintk("%s: pre get_device_info type %u, mxcnt %u,devid %u\n",
+		dprintk("%s: pre gdi type %u, mxcnt %u,devid %llx:%llx\n",
 			__func__,
 			info_arg.type,
 			info_arg.xdr.maxcount,
-			info_arg.devid);
+			info_arg.devid.pnfs_fsid,
+			info_arg.devid.pnfs_devid);
 		nfserr = sb->s_export_op->get_device_info(sb, &info_arg);
 		dprintk("%s: post get_device_info err %d bytes_wr %u\n",
 			__func__,
@@ -3414,7 +3415,8 @@ nfsd4_encode_getdevinfo(struct nfsd4_compoundres *resp,
 
 	/* Set layout type and id of device to encode */
 	args.type = gdev->gd_type;
-	args.devid = gdev->gd_devid;
+	args.devid.pnfs_fsid = gdev->gd_devid.pnfs_fsid;
+	args.devid.pnfs_devid = gdev->gd_devid.pnfs_devid;
 
 	/* Set xdr info so file system can encode device */
 	args.xdr.p   = resp->p;
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h
index 2f4c704..3de187b 100644
--- a/include/linux/exportfs.h
+++ b/include/linux/exportfs.h
@@ -37,6 +37,11 @@ enum fid_type {
 
 #if defined(CONFIG_PNFS)
 
+typedef struct {
+	uint64_t	pnfs_fsid;	/* fsid */
+	uint64_t	pnfs_devid;	/* deviceid */
+} deviceid_t;
+
 /* XDR stream arguments and results.  Exported file system uses this
  * struct to encode information and return how many bytes were encoded.
  */
@@ -57,22 +62,23 @@ typedef int (*pnfs_encodedev_t)(struct pnfs_xdr_info *xdr, void *device);
 /* Arguments for get_device_info */
 struct pnfs_devinfo_arg {
 	u32 type;
-	u32 devid;
+	deviceid_t devid;
 	struct pnfs_xdr_info xdr;
 	pnfs_encodedev_t func;
 };
 
 /* Used by get_device_iter to retrieve all available devices.
  * Args:
- * gld_type - layout type
- * gld_cookie/verf - index and verifier of current list item
- * gld_devid - output device id
+ * type - layout type
+ * cookie/verf - index and verifier of current list item
+ * export_id - Minor part of deviceid_t
+ * eof - end of file?
  */
 struct pnfs_deviter_arg {
 	u32 type;	/* request */
 	u64 cookie;	/* request/response */
 	u64 verf;	/* request/response */
-	u32 devid;	/* response */
+	u64 devid;	/* response */
 	u32 eof;	/* response */
 };
 
@@ -86,8 +92,14 @@ struct nfsd4_layout_seg {
 
 /* Used by layout_get to encode layout (loc_body var in spec)
  * Args:
- * xdr - xdr stream
- * layout - pointer to layout to be encoded
+ * minlength - min number of accessible bytes given by layout
+ * func - per layout encoding function
+ * export_id - Major part of deviceid_t.  File system uses this
+ * to build the deviceid returned in the layout.
+ * fh - fs can modify the file handle for use on data servers
+ * seg - layout info requested and layout info returned
+ * xdr - xdr info
+ * return_on_close - true if layout to be returned on file close
  * TODO: use common func with dev?
  */
 typedef int (*pnfs_encodelayout_t)(struct pnfs_xdr_info *xdr, void *layout);
@@ -96,6 +108,7 @@ typedef int (*pnfs_encodelayout_t)(struct pnfs_xdr_info *xdr, void *layout);
 struct pnfs_layoutget_arg {
 	u64			minlength;	/* request */
 	pnfs_encodelayout_t 	func;		/* request */
+	u64			fsid;		/* request */
 	struct knfsd_fh		*fh;		/* request/response */
 	struct nfsd4_layout_seg	seg;		/* request/response */
 	struct pnfs_xdr_info	xdr;		/* request/response */
diff --git a/include/linux/nfsd/nfs4layoutxdr.h b/include/linux/nfsd/nfs4layoutxdr.h
index 97a7686..3a152e5 100644
--- a/include/linux/nfsd/nfs4layoutxdr.h
+++ b/include/linux/nfsd/nfs4layoutxdr.h
@@ -39,22 +39,20 @@
 #if defined(CONFIG_PNFSD)
 
 /* Macros from fs/nfsd/nfs4xdr.c */
-#define ENCODE_HEAD              u32 *p
-
+#define ENCODE_HEAD              __be32 *p
 #define WRITE32(n)               *p++ = htonl(n)
 #define WRITE64(n)               do {                           \
 	*p++ = htonl((u32)((n) >> 32));                         \
 	*p++ = htonl((u32)(n));					\
 } while (0)
-#define WRITEMEM(ptr,nbytes)     do {                           \
-	*(p + XDR_QUADLEN(nbytes) - 1) = 0;                     \
-	memcpy(p, ptr, nbytes);                                 \
-	p += XDR_QUADLEN(nbytes);                               \
+#define WRITEMEM(ptr,nbytes)     do {				\
+	*(p + XDR_QUADLEN(nbytes) - 1) = 0;			\
+	memcpy(p, ptr, nbytes);					\
+	p += XDR_QUADLEN(nbytes);				\
 } while (0)
-
-#define RESERVE_SPACE(nbytes)   do {                            \
-	p = resp->p;                                            \
-	BUG_ON(p + XDR_QUADLEN(nbytes) > resp->end);            \
+#define RESERVE_SPACE(nbytes)	do {				\
+	p = resp->p;						\
+	BUG_ON(p + XDR_QUADLEN(nbytes) > resp->end);		\
 } while (0)
 #define ADJUST_ARGS()           resp->p = p
 
@@ -83,7 +81,7 @@ struct pnfs_filelayout_layout {
 	u32                             lg_commit_through_mds; /* response */
 	u64                             lg_stripe_unit; /* response */
 	u32                             lg_first_stripe_index;	/* response */
-	u32				device_id;		/* response */
+	deviceid_t			device_id;		/* response */
 	u32                             lg_fh_length;		/* response */
 	struct knfsd_fh                 *lg_fh_list;		/* response */
 };
diff --git a/include/linux/nfsd/nfsd4_pnfs.h b/include/linux/nfsd/nfsd4_pnfs.h
index bc794e2..94afcb6 100644
--- a/include/linux/nfsd/nfsd4_pnfs.h
+++ b/include/linux/nfsd/nfsd4_pnfs.h
@@ -55,7 +55,7 @@ struct nfsd4_pnfs_getdevlist {
 
 struct nfsd4_pnfs_getdevinfo {
 	u32		gd_type;	/* request */
-	u32		gd_devid;	/* request */
+	deviceid_t	gd_devid;	/* request */
 	u32		gd_maxcount;	/* request */
 	struct svc_fh	*gd_fhp;	/* response */
 };
diff --git a/include/linux/nfsd/pnfsd.h b/include/linux/nfsd/pnfsd.h
index 8a03fed..2e63781 100644
--- a/include/linux/nfsd/pnfsd.h
+++ b/include/linux/nfsd/pnfsd.h
@@ -42,7 +42,7 @@
 
 /* pNFS Metadata to Data server state communication*/
 struct pnfs_get_state {
-	u32			devid;    /* request */
+	u32			dsid;    /* request */
 	unsigned long		ino;      /* request */
 	stateid_t		stid;     /* request;response */
 	clientid_t		clid;     /* response */
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 67f5b08..8cde9ea 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -389,7 +389,7 @@ struct nfs4_file {
 
 struct pnfs_ds_dev_entry {
 	struct list_head	dd_dev_entry; /* st_pnfs_ds_id entry */
-	u32			dd_devid;
+	u32			dd_dsid;
 };
 #endif /* CONFIG_PNFSD */
 


More information about the pNFS mailing list