[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