[pnfs] [PATCH 05/10] pnfsd: update server layout xdr for draft 19.
Benny Halevy
bhalevy at panasas.com
Sun Feb 10 04:45:17 EST 2008
On Feb. 09, 2008, 10:26 +0200, Marc Eshel <eshel at almaden.ibm.com> wrote:
> 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 */
Eh? why not just use stateid_t rather than quoting its members?
> };
>
> 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 */
ditto
> 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;
ditto
> };
>
> struct nfsd4_pnfs_cb_layout {
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
More information about the pNFS
mailing list