[pnfs] [PATCH 05/10] pnfsd: update server layout xdr for draft 19.

Marc Eshel eshel at almaden.ibm.com
Sat Feb 9 03:26:12 EST 2008


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


---

 fs/nfsd/nfs4filelayoutxdr.c        |    4 +++
 fs/nfsd/nfs4xdr.c                  |   49 +++++++++++++++++++++++-------------
 include/linux/nfsd/nfs4layoutxdr.h |    1 +
 include/linux/nfsd/nfsd4_pnfs.h    |    7 ++++-
 4 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/fs/nfsd/nfs4filelayoutxdr.c b/fs/nfsd/nfs4filelayoutxdr.c
index 7084c70..56ac046 100644
--- a/fs/nfsd/nfs4filelayoutxdr.c
+++ b/fs/nfsd/nfs4filelayoutxdr.c
@@ -200,6 +200,10 @@ filelayout_encode_layout(struct pnfs_xdr_info *resp, void *layout)
 	WRITE32(flp->lg_first_stripe_index);
 	len += 4;
 
+	/* encode striping pattern start */
+	WRITE64(flp->lg_pattern_offset);
+	len += 8;
+
 	/* Ensure file system added at least one file handle */
 	if (flp->lg_fh_length <= 0) {
 		printk("%s: File Layout has no file handles!!\n", __FUNCTION__);
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 0dcc581..10fdb0c 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1265,7 +1265,7 @@ nfsd4_decode_getdevinfo(struct nfsd4_compoundargs *argp,
 	DECODE_TAIL;
 }
 
-/* LAYOUTGET: minorversion1-01.txt
+/* LAYOUTGET: minorversion1-19.txt
 u32     int32                   signal_layout_available;
 u32     pnfs_layouttype4        layout_type;
 u32     pnfs_layoutiomode4      iomode;
@@ -1280,19 +1280,21 @@ nfsd4_decode_layoutget(struct nfsd4_compoundargs *argp,
 {
 	DECODE_HEAD;
 
-	READ_BUF(40);
+	READ_BUF(44 + sizeof(stateid_opaque_t));
 	READ32(lgp->lg_signal);
 	READ32(lgp->lg_seg.layout_type);
 	READ32(lgp->lg_seg.iomode);
 	READ64(lgp->lg_seg.offset);
 	READ64(lgp->lg_seg.length);
 	READ64(lgp->lg_minlength);
+	READ32(lgp->lg_generation);
+	COPYMEM(&lgp->lg_opaque, sizeof(stateid_opaque_t));
 	READ32(lgp->lg_maxcount);
 
 	DECODE_TAIL;
 }
 
-/* LAYOUTCOMMIT: minorversion1-01.txt
+/* LAYOUTCOMMIT: minorversion1-19.txt
 
      struct pnfs_layoutupdate4 {
             pnfs_layouttype4        type;
@@ -1316,10 +1318,12 @@ nfsd4_decode_layoutcommit(struct nfsd4_compoundargs *argp,
 	DECODE_HEAD;
 	u32 timechange;
 
-	READ_BUF(24);
+	READ_BUF(28 + sizeof(stateid_opaque_t));
 	READ64(lcp->lc_seg.offset);
 	READ64(lcp->lc_seg.length);
 	READ32(lcp->lc_reclaim);
+	READ32(lcp->lc_generation);
+	COPYMEM(&lcp->lc_opaque, sizeof(stateid_opaque_t));
 	READ32(lcp->lc_newoffset);
 	if (lcp->lc_newoffset) {
 		READ_BUF(8);
@@ -1336,16 +1340,6 @@ nfsd4_decode_layoutcommit(struct nfsd4_compoundargs *argp,
 		lcp->lc_mtime.seconds = 0;
 		lcp->lc_mtime.nseconds = 0;
 	}
-	READ_BUF(4);
-	READ32(timechange);
-	if (timechange) {
-		READ_BUF(12);
-		READ64(lcp->lc_atime.seconds);
-		READ32(lcp->lc_atime.nseconds);
-	} else {
-		lcp->lc_atime.seconds = 0;
-		lcp->lc_atime.nseconds = 0;
-	}
 	READ_BUF(8);
 	READ32(lcp->lc_seg.layout_type);
 	/* XXX: saving XDR'ed layout update. Since we don't have the
@@ -1374,9 +1368,11 @@ nfsd4_decode_layoutreturn(struct nfsd4_compoundargs *argp,
 	READ32(lrp->lr_seg.iomode);
 	READ32(lrp->lr_return_type);
 	if (lrp->lr_return_type == RETURN_FILE) {
-		READ_BUF(16);
+		READ_BUF(20 + sizeof(stateid_opaque_t));
 		READ64(lrp->lr_seg.offset);
 		READ64(lrp->lr_seg.length);
+		READ32(lrp->lr_generation);
+		COPYMEM(&lrp->lr_opaque, sizeof(stateid_opaque_t));
 	}
 
 	DECODE_TAIL;
@@ -3443,7 +3439,7 @@ nfsd4_encode_getdevinfo(struct nfsd4_compoundres *resp,
 	return nfs_ok;
 }
 
-/* LAYOUTGET: minorversion1-13.txt
+/* LAYOUTGET: minorversion1-19.txt
 u32            bool                    logr_return_on_close;
 u64            offset4                 offset;
 u64            length4                 length;
@@ -3472,7 +3468,7 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp,
 		maxcount = lgp->lg_maxcount;
 
 	/* Check for space on xdr stream */
-	leadcount = 28;
+	leadcount = 32 + sizeof(stateid_opaque_t);
 	RESERVE_SPACE(leadcount);
 	/* encode layout metadata after file system encodes layout */
 	p += XDR_QUADLEN(leadcount);
@@ -3522,6 +3518,8 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp,
 	/* Rewind to beginning and encode attrs */
 	p = p_start;
 	WRITE32(args.return_on_close);
+	WRITE32(lgp->lg_generation);
+	WRITEMEM(&lgp->lg_opaque, sizeof(stateid_opaque_t));
 	WRITE64(args.seg.offset);
 	WRITE64(args.seg.length);
 	WRITE32(args.seg.iomode);
@@ -3537,7 +3535,7 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp,
 	return nfs_ok;
 }
 
-/* LAYOUTGET: minorversion1-01.txt
+/* LAYOUTCOMMIT: minorversion1-19.txt
      struct LAYOUTCOMMIT4resok {
             newsize4                 newsize;
      };
@@ -3560,6 +3558,20 @@ nfsd4_encode_layoutcommit(struct nfsd4_compoundres *resp, int nfserr,
 		}
 	}
 }
+
+static void
+nfsd4_encode_layoutreturn(struct nfsd4_compoundres *resp, int nfserr,
+			  struct nfsd4_pnfs_layoutreturn *lrp)
+{
+	ENCODE_HEAD;
+
+	if (!nfserr) {
+		RESERVE_SPACE(8 + sizeof(stateid_t));
+		WRITE32(1);    /* got stateid */
+		WRITE32(lrp->lr_generation);
+		WRITEMEM(&lrp->lr_opaque, sizeof(stateid_opaque_t));
+	}
+}
 #endif /* CONFIG_PNFSD */
 
 void
@@ -3684,6 +3696,7 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
 		nfsd4_encode_layoutcommit(resp, op->status, &op->u.pnfs_layoutcommit);
 		break;
 	case OP_LAYOUTRETURN:
+		nfsd4_encode_layoutreturn(resp, op->status, &op->u.pnfs_layoutreturn);
 		break;
 #endif /* CONFIG_PNFSD */
 #if defined(CONFIG_NFSD_V4_1)
diff --git a/include/linux/nfsd/nfs4layoutxdr.h b/include/linux/nfsd/nfs4layoutxdr.h
index 3a152e5..7b36c7c 100644
--- a/include/linux/nfsd/nfs4layoutxdr.h
+++ b/include/linux/nfsd/nfs4layoutxdr.h
@@ -80,6 +80,7 @@ struct pnfs_filelayout_layout {
 	u32                             lg_stripe_type; /* response */
 	u32                             lg_commit_through_mds; /* response */
 	u64                             lg_stripe_unit; /* response */
+	u64                             lg_pattern_offset; /* response */
 	u32                             lg_first_stripe_index;	/* response */
 	deviceid_t			device_id;		/* response */
 	u32                             lg_fh_length;		/* response */
diff --git a/include/linux/nfsd/nfsd4_pnfs.h b/include/linux/nfsd/nfsd4_pnfs.h
index 94afcb6..0cb584a 100644
--- a/include/linux/nfsd/nfsd4_pnfs.h
+++ b/include/linux/nfsd/nfsd4_pnfs.h
@@ -66,6 +66,8 @@ struct nfsd4_pnfs_layoutget {
 	u64			lg_minlength;	/* request */
 	u32			lg_maxcount;	/* request */
 	struct svc_fh		*lg_fhp;	/* response */
+	u32			lg_generation;  /* request/response */
+	stateid_opaque_t	lg_opaque;	/* request/response */
 };
 
 struct nfsd4_pnfs_layoutcommit {
@@ -74,7 +76,8 @@ struct nfsd4_pnfs_layoutcommit {
 	u32			lc_newoffset;	/* request */
 	u64			lc_last_wr;	/* request */
 	struct nfstime4		lc_mtime;	/* request */
-	struct nfstime4		lc_atime;	/* request */
+	u32			lc_generation;	/* request */
+	stateid_opaque_t	lc_opaque;	/* request */
 	u32			lc_up_len;	/* layout length */
 	void			*lc_up_layout;	/* decoded by callback */
 	u32			lc_size_chg;	/* boolean for response */
@@ -91,6 +94,8 @@ struct nfsd4_pnfs_layoutreturn {
 	struct nfsd4_layout_seg	lr_seg;		/* request */
 	u32			lr_reclaim;	/* request */
 	u32			lr_flags;
+	u32			lr_generation;
+	stateid_opaque_t	lr_opaque;
 };
 
 struct nfsd4_pnfs_cb_layout {


More information about the pNFS mailing list