[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