[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