[pnfs] [PATCH 05/10] pnfsd: update server layout xdr for draft 19.
Dean Hildebrand
seattleplus at gmail.com
Thu Feb 7 21:58:52 EST 2008
Signed-off-by: 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 51e2825..66b668e 100644
--- a/fs/nfsd/nfs4filelayoutxdr.c
+++ b/fs/nfsd/nfs4filelayoutxdr.c
@@ -213,6 +213,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 c1e9b45..045bd20 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1264,7 +1264,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;
@@ -1279,19 +1279,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;
@@ -1315,10 +1317,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);
@@ -1335,16 +1339,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
@@ -1373,9 +1367,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;
@@ -3442,7 +3438,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;
@@ -3471,7 +3467,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);
@@ -3521,6 +3517,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);
@@ -3536,7 +3534,7 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp,
return nfs_ok;
}
-/* LAYOUTGET: minorversion1-01.txt
+/* LAYOUTCOMMIT: minorversion1-19.txt
struct LAYOUTCOMMIT4resok {
newsize4 newsize;
};
@@ -3559,6 +3557,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
@@ -3683,6 +3695,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 1590174..a9ae10a 100644
--- a/include/linux/nfsd/nfs4layoutxdr.h
+++ b/include/linux/nfsd/nfs4layoutxdr.h
@@ -73,6 +73,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 b24b4cf..c917cb7 100644
--- a/include/linux/nfsd/nfsd4_pnfs.h
+++ b/include/linux/nfsd/nfsd4_pnfs.h
@@ -67,6 +67,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 {
@@ -75,7 +77,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 */
@@ -92,6 +95,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 {
--
1.5.3.3
More information about the pNFS
mailing list