[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