[pnfs] new version of xdr for pNFS Linux client/server
Marc Eshel
eshel at almaden.ibm.com
Tue Aug 22 18:24:11 EDT 2006
Attached is the patch to upgrade the pNFS Linux client and server code
to the latest spec. If there are no objection I will check it in to the
cvs tree in a couple of days.
Marc.
-------------- next part --------------
Index: nfs4.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4.h,v
retrieving revision 1.8
diff -u -r1.8 nfs4.h
--- nfs4.h 13 Jul 2006 17:18:46 -0000 1.8
+++ nfs4.h 22 Aug 2006 22:12:29 -0000
@@ -152,11 +152,11 @@
OP_VERIFY = 37,
OP_WRITE = 38,
OP_RELEASE_LOCKOWNER = 39,
- OP_LAYOUTGET = 40,
- OP_LAYOUTCOMMIT = 41,
- OP_LAYOUTRETURN = 42,
- OP_GETDEVICEINFO = 43,
- OP_GETDEVICELIST = 44,
+ OP_GETDEVICEINFO = 47,
+ OP_GETDEVICELIST = 48,
+ OP_LAYOUTCOMMIT = 49,
+ OP_LAYOUTGET = 50,
+ OP_LAYOUTRETURN = 51,
OP_ILLEGAL = 10044,
};
Index: nfs4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfs4_pnfs.h,v
retrieving revision 1.10
diff -u -r1.10 nfs4_pnfs.h
--- nfs4_pnfs.h 18 Aug 2006 14:09:33 -0000 1.10
+++ nfs4_pnfs.h 22 Aug 2006 22:12:29 -0000
@@ -116,14 +116,16 @@
struct pnfs_device
{
- unsigned int layoutclass;
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 {
unsigned int num_devs;
+ unsigned int eof;
unsigned int devs_len;
struct pnfs_device devs[NFS4_PNFS_DEV_MAXCOUNT];
};
@@ -168,6 +170,11 @@
LAYOUT_OSD2_OBJECTS = 2,
LAYOUT_BLOCK_VOLUME = 3,
LAYOUT_PVFS2 = 4
+};
+
+enum file_layout_device_type {
+ FILE_SIMPLE = 1,
+ FILE_COMPLEX = 2
};
#endif /* LINUX_NFS4_PNFS_H */
Index: nfsd/nfs4layoutxdr.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/nfs4layoutxdr.h,v
retrieving revision 1.2
diff -u -r1.2 nfs4layoutxdr.h
--- nfsd/nfs4layoutxdr.h 12 Apr 2006 17:59:58 -0000 1.2
+++ nfsd/nfs4layoutxdr.h 22 Aug 2006 22:12:30 -0000
@@ -62,13 +62,9 @@
struct xdr_netobj r_addr;
};
-struct nfsd4_pnfs_layoutdevlist {
- u32 len;
- u32 *list;
-};
-
struct nfsd4_pnfs_layoutlist {
- struct nfsd4_pnfs_layoutdevlist dev_ids;
+ u32 dev_id;
+ u32 dev_index;
struct knfsd_fh *fhp;
};
@@ -77,6 +73,8 @@
u32 lg_commit_through_mds; /* response */
u64 lg_stripe_unit; /* response */
u64 lg_file_size; /* response */
+ u32 lg_indexlen; /* response */
+ u32 *lg_indexlist; /* response */
u32 lg_llistlen; /* response */
struct nfsd4_pnfs_layoutlist *lg_llist; /* response */
};
Index: nfsd/nfsd4_pnfs.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/nfsd4_pnfs.h,v
retrieving revision 1.4
diff -u -r1.4 nfsd4_pnfs.h
--- nfsd/nfsd4_pnfs.h 25 Jul 2006 04:35:03 -0000 1.4
+++ nfsd/nfsd4_pnfs.h 22 Aug 2006 22:12:30 -0000
@@ -45,7 +45,7 @@
* the gd_ops->layout_encode() callback */
struct nfsd4_pnfs_devlist {
u32 dev_id;
- u32 dev_lotype;
+ u32 dev_type;
void *dev_addr; /* encoded by callback */
};
@@ -56,8 +56,10 @@
/* nfs4_verifier */
u64 gd_verf; /* request - response */
struct export_operations *gd_ops;
+ u32 gd_dev_type; /* response */
u32 gd_devlist_len; /* response */
struct nfsd4_pnfs_devlist *gd_devlist; /*response */
+ u32 gd_eof;
};
struct nfsd4_pnfs_getdevinfo {
@@ -65,7 +67,9 @@
u32 gd_dev_id; /* request */
u32 gd_maxcnt; /* request */
struct export_operations *gd_ops;
- void *gd_devaddr; /*response */
+ u32 gd_dev_type; /* response */
+ u32 gd_devlist_len; /* response */
+ void *gd_devaddr; /*response */
};
struct nfsd4_pnfs_layoutget {
Index: nfsd/state.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/include/linux/nfsd/state.h,v
retrieving revision 1.7
diff -u -r1.7 state.h
--- nfsd/state.h 25 Jul 2006 04:35:03 -0000 1.7
+++ nfsd/state.h 22 Aug 2006 22:12:30 -0000
@@ -139,7 +139,8 @@
enum layout_recall_type {
RECALL_FILE = 1,
- RECALL_FSID = 2
+ RECALL_FSID = 2,
+ RECALL_ALL = 3
};
struct nfs4_cb_layout {
Index: callback.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/callback.h,v
retrieving revision 1.4
diff -u -r1.4 callback.h
--- callback.h 25 Jul 2006 04:35:02 -0000 1.4
+++ callback.h 22 Aug 2006 22:11:58 -0000
@@ -62,7 +62,8 @@
enum layout_recall_type {
RECALL_FILE = 1,
- RECALL_FSID = 2
+ RECALL_FSID = 2,
+ RECALL_ALL = 3
};
struct cb_pnfs_layoutrecallargs {
Index: callback_xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/callback_xdr.c,v
retrieving revision 1.5
diff -u -r1.5 callback_xdr.c
--- callback_xdr.c 25 Jul 2006 04:35:02 -0000 1.5
+++ callback_xdr.c 22 Aug 2006 22:11:58 -0000
@@ -228,7 +228,7 @@
READ64(args->cbl_fsid.major);
READ64(args->cbl_fsid.minor);
}
- else {
+ else if (args->cbl_recall_type == RECALL_FILE) {
status = decode_fh(xdr, &args->cbl_fh);
if (unlikely(status != 0))
goto out;
Index: nfs4filelayout.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4filelayout.c,v
retrieving revision 1.25
diff -u -r1.25 nfs4filelayout.c
--- nfs4filelayout.c 31 Jul 2006 23:32:59 -0000 1.25
+++ nfs4filelayout.c 22 Aug 2006 22:11:58 -0000
@@ -443,6 +443,10 @@
READ32(fl->commit_through_mds);
READ64(fl->stripe_unit);
READ64(fl->file_size);
+ READ32(fl->index_len);
+ if (fl->index_len > 0) { //??? if>0 must build index list
+ printk("filelayout_set_layout: XXX add loop for index list\n");
+ }
READ32(fl->num_devs);
dprintk("DEBUG: %s: type %d stripe_unit %lld file_size %lld devs %d\n",
@@ -450,18 +454,11 @@
fl->file_size, fl->num_devs);
for (i = 0; i < fl->num_devs; i++) {
- uint32_t devs_per_stripe, j;
-
- READ32(devs_per_stripe);
/* dev_id */
READ32(fl->devs[i].dev_id);
+ READ32(fl->devs[i].dev_index);
- for (j = 1; j < devs_per_stripe; j++) {
- uint32_t tmp_id;
- READ32(tmp_id);
- }
-
/* fh */
memset(&fl->devs[i].fh, 0, sizeof(struct nfs_fh));
READ32(fl->devs[i].fh.size);
Index: nfs4filelayout.h
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4filelayout.h,v
retrieving revision 1.5
diff -u -r1.5 nfs4filelayout.h
--- nfs4filelayout.h 13 Jul 2006 17:18:40 -0000 1.5
+++ nfs4filelayout.h 22 Aug 2006 22:11:58 -0000
@@ -56,6 +56,7 @@
struct nfs4_filelayout_devs {
u32 dev_id;
+ u32 dev_index;
struct nfs_fh fh;
};
@@ -70,6 +71,7 @@
u32 stripe_type;
u32 commit_through_mds;
u64 stripe_unit;
+ unsigned int index_len;
unsigned int num_devs;
struct nfs4_filelayout_devs devs[NFS4_PNFS_MAX_DEVS];
};
Index: nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfs/nfs4xdr.c,v
retrieving revision 1.19
diff -u -r1.19 nfs4xdr.c
--- nfs4xdr.c 13 Jul 2006 17:18:41 -0000 1.19
+++ nfs4xdr.c 22 Aug 2006 22:11:59 -0000
@@ -3787,7 +3787,7 @@
READ32(res->devs[cnt].dev_id); /* device id */
READ_BUF(4);
- READ32(res->devs[cnt].layoutclass);
+ READ32(res->devs[cnt].dev_type);
READ_BUF(4);
READ32(len);
@@ -3807,6 +3807,8 @@
total_len += len;
cnt++;
}
+ READ_BUF(4);
+ READ32(res->eof);
res->devs_len = total_len;
return 0;
@@ -3829,7 +3831,13 @@
READ32(res->dev_id); /* device id */
READ_BUF(4);
- READ32(res->layoutclass);
+ READ32(res->dev_type);
+
+ READ_BUF(4);
+ READ32(res->dev_count);
+ if (res->dev_count > 1) { //??? if>1 must loop on list
+ printk("decode_getdeviceinfo: XXX add loop \n");
+ }
READ_BUF(4);
READ32(len);
@@ -4820,11 +4828,14 @@
RESERVE_SPACE(40);
WRITE32(OP_LAYOUTRETURN);
WRITE64(args->clientid);
- WRITE64(args->offset);
- WRITE64(args->length);
WRITE32(args->reclaim);
- WRITE32(args->iomode);
WRITE32(args->type);
+ WRITE32(args->iomode);
+ if (args->type == LAYOUT_NFSV4_FILES)
+ {
+ WRITE64(args->offset);
+ WRITE64(args->length);
+ }
return 0;
}
Index: nfs4callback.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4callback.c,v
retrieving revision 1.2
diff -u -r1.2 nfs4callback.c
--- nfs4callback.c 25 Jul 2006 04:35:03 -0000 1.2
+++ nfs4callback.c 22 Aug 2006 22:12:16 -0000
@@ -264,7 +264,7 @@
lr->cbl_layoutchanged, lr->cbl_recall_type,
lr->cbl_fsid.major, lr->cbl_fsid.minor);
}
- else {
+ else if (lr->cbl_recall_type == RECALL_FILE) {
WRITE32(len);
WRITEMEM(lr->cbl_fhval, len);
WRITE64(lr->cbl_offset);
Index: nfs4filelayoutxdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4filelayoutxdr.c,v
retrieving revision 1.13
diff -u -r1.13 nfs4filelayoutxdr.c
--- nfs4filelayoutxdr.c 12 Apr 2006 18:03:42 -0000 1.13
+++ nfs4filelayoutxdr.c 22 Aug 2006 22:12:16 -0000
@@ -83,21 +83,14 @@
static int
filelayout_encode_layoutlist_item(struct nfsd4_compoundres *resp, struct nfsd4_pnfs_layoutlist *item)
{
- struct nfsd4_pnfs_layoutdevlist *dlist;
- int i, len;
+ int len;
unsigned int fhlen = item->fhp->fh_size;
- u32 *devid;
ENCODE_HEAD;
- dlist = &item->dev_ids;
- len = 8 + (4 * dlist->len) + fhlen;
+ len = 12 + fhlen;
RESERVE_SPACE(len);
- WRITE32(dlist->len);
-
- devid = dlist->list;
- for (i=0; i < dlist->len; i++) {
- WRITE32(devid[i]);
- }
+ WRITE32(item->dev_id);
+ WRITE32(item->dev_index);
WRITE32(fhlen);
WRITEMEM(&item->fhp->fh_base, fhlen);
ADJUST_ARGS();
@@ -115,7 +108,7 @@
ENCODE_HEAD;
flp = (struct nfsd4_pnfs_filelayout *)layout;
- len = 28;
+ len = 32;
RESERVE_SPACE(len + 4);
totlen = p; /* fill-in opaque layout length later*/
p++;
@@ -123,6 +116,10 @@
WRITE32(flp->lg_commit_through_mds);
WRITE64(flp->lg_stripe_unit);
WRITE64(flp->lg_file_size);
+ WRITE32(flp->lg_indexlen);
+ if (flp->lg_indexlen > 0) { //??? if>0 must build index list
+ printk("filelayout_encode_layout: XXX add loop for index list\n");
+ }
WRITE32(flp->lg_llistlen);
ADJUST_ARGS();
for (i=0; i < flp->lg_llistlen; i++) {
@@ -147,8 +144,6 @@
return;
item = flp->lg_llist;
for (i=0; i < flp->lg_llistlen; i++) {
- if (item->dev_ids.list)
- kfree(item->dev_ids.list);
#if 0 /* the fh is part of nfsd4_pnfs_layoutget struct */
if (item->fhp)
kfree(item->fhp);
Index: nfs4proc.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4proc.c,v
retrieving revision 1.18
diff -u -r1.18 nfs4proc.c
--- nfs4proc.c 13 Jul 2006 17:18:41 -0000 1.18
+++ nfs4proc.c 22 Aug 2006 22:12:16 -0000
@@ -970,7 +970,6 @@
/* set the ops for encoding the devaddr */
gdp->gd_ops = sb->s_export_op;
-
if (sb && sb->s_export_op->get_deviceinfo) {
status = sb->s_export_op->get_deviceinfo(sb, (void *)gdp);
Index: nfs4xdr.c
===================================================================
RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4xdr.c,v
retrieving revision 1.23
diff -u -r1.23 nfs4xdr.c
--- nfs4xdr.c 13 Jul 2006 17:18:41 -0000 1.23
+++ nfs4xdr.c 22 Aug 2006 22:12:16 -0000
@@ -1108,13 +1108,16 @@
{
DECODE_HEAD;
- READ_BUF(36);
+ READ_BUF(40);
READ64(lrp->lr_clientid);
- READ64(lrp->lr_offset);
- READ64(lrp->lr_length);
- READ32(lrp->lr_iomode);
READ32(lrp->lr_reclaim);
READ32(lrp->lr_type);
+ READ32(lrp->lr_iomode);
+ if (lrp->lr_type == LAYOUT_NFSV4_FILES)
+ {
+ READ64(lrp->lr_offset);
+ READ64(lrp->lr_length);
+ }
DECODE_TAIL;
}
@@ -1606,6 +1609,7 @@
BUG_ON(bmval0 & ~NFSD_SUPPORTED_ATTRS_WORD0);
BUG_ON(bmval1 & ~NFSD_SUPPORTED_ATTRS_WORD1);
+
if (exp->ex_fslocs.migrated) {
status = fattr_handle_absent_fs(&bmval0, &bmval1, &rdattr_err);
if (status)
@@ -2668,16 +2672,15 @@
}
static void
-nfsd4_encode_devlist_item(struct nfsd4_compoundres *resp, struct nfsd4_pnfs_devlist *dlist, struct export_operations *ex_ops)
+nfsd4_encode_devlist_item(struct nfsd4_compoundres *resp, struct nfsd4_pnfs_devlist *dlist, struct export_operations *ex_ops, int lotype)
{
ENCODE_HEAD;
RESERVE_SPACE(8);
WRITE32(dlist->dev_id);
- WRITE32(dlist->dev_lotype);
+ WRITE32(dlist->dev_type);
ADJUST_ARGS();
- if (ex_ops->devaddr_encode == NULL &&
- dlist->dev_lotype == LAYOUT_NFSV4_FILES)
+ if (ex_ops->devaddr_encode == NULL && lotype == LAYOUT_NFSV4_FILES)
{
filelayout_encode_devaddr(resp, dlist->dev_addr);
filelayout_free_devaddr(dlist->dev_addr);
@@ -2716,9 +2719,13 @@
item = gdevl->gd_devlist;
for (i = 0; i < gdevl->gd_devlist_len; i++) {
dprintk("%s: i %d item %p\n",__FUNCTION__, i, item);
- nfsd4_encode_devlist_item (resp, item, gdevl->gd_ops);
+ nfsd4_encode_devlist_item (resp, item, gdevl->gd_ops,
+ gdevl->gd_type);
item++;
}
+ RESERVE_SPACE(4);
+ WRITE32(gdevl->gd_eof);
+ ADJUST_ARGS();
kfree(gdevl->gd_devlist);
}
}
@@ -2736,9 +2743,13 @@
printk("%s: err %d\n",__FUNCTION__, nfserr);
if (!nfserr) {
- RESERVE_SPACE(8);
+ RESERVE_SPACE(12);
WRITE32(gdev->gd_dev_id);
- WRITE32(gdev->gd_type);
+ WRITE32(gdev->gd_dev_type);
+ WRITE32(gdev->gd_devlist_len);
+ if (gdev->gd_devlist_len > 1) { //??? if>1 must build list
+ printk("nfsd4_encode_getdevinfo: XXX add loop list");
+ }
ADJUST_ARGS();
if (gdev->gd_ops->devaddr_encode == NULL &&
gdev->gd_type == LAYOUT_NFSV4_FILES)
More information about the pNFS
mailing list