diff mbox

[v3,42/49] nfs41: add range to layoutreturn args

Message ID 1420590534-84063-43-git-send-email-loghyr@primarydata.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Haynes Jan. 7, 2015, 12:28 a.m. UTC
From: Peng Tao <tao.peng@primarydata.com>

So that callers can specify which range to return.

Signed-off-by: Peng Tao <tao.peng@primarydata.com>
Signed-off-by: Tom Haynes <loghyr@primarydata.com>
---
 fs/nfs/nfs4xdr.c        |  6 +++---
 fs/nfs/pnfs.c           | 14 +++++++++-----
 include/linux/nfs_xdr.h |  2 +-
 3 files changed, 13 insertions(+), 9 deletions(-)

Comments

Schumaker, Anna Jan. 13, 2015, 7:15 p.m. UTC | #1
Hi Tao,

On 01/06/2015 07:28 PM, Tom Haynes wrote:
> From: Peng Tao <tao.peng@primarydata.com>
> 
> So that callers can specify which range to return.
> 
> Signed-off-by: Peng Tao <tao.peng@primarydata.com>
> Signed-off-by: Tom Haynes <loghyr@primarydata.com>
> ---
>  fs/nfs/nfs4xdr.c        |  6 +++---
>  fs/nfs/pnfs.c           | 14 +++++++++-----
>  include/linux/nfs_xdr.h |  2 +-
>  3 files changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
> index 3c3ff63..56d4c91 100644
> --- a/fs/nfs/nfs4xdr.c
> +++ b/fs/nfs/nfs4xdr.c
> @@ -2012,11 +2012,11 @@ encode_layoutreturn(struct xdr_stream *xdr,
>  	p = reserve_space(xdr, 16);
>  	*p++ = cpu_to_be32(0);		/* reclaim. always 0 for now */
>  	*p++ = cpu_to_be32(args->layout_type);
> -	*p++ = cpu_to_be32(args->iomode);
> +	*p++ = cpu_to_be32(args->range.iomode);
>  	*p = cpu_to_be32(RETURN_FILE);
>  	p = reserve_space(xdr, 16);
> -	p = xdr_encode_hyper(p, 0);
> -	p = xdr_encode_hyper(p, NFS4_MAX_UINT64);
> +	p = xdr_encode_hyper(p, args->range.offset);
> +	p = xdr_encode_hyper(p, args->range.length);
>  	spin_lock(&args->inode->i_lock);
>  	encode_nfs4_stateid(xdr, &args->stateid);
>  	spin_unlock(&args->inode->i_lock);
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 685af4f..63beace 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -52,7 +52,7 @@ static LIST_HEAD(pnfs_modules_tbl);
>  
>  static int
>  pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
> -		       enum pnfs_iomode iomode);
> +		       enum pnfs_iomode iomode, u64 offset, u64 length);
>  
>  /* Return the registered pnfs layout driver module matching given id */
>  static struct pnfs_layoutdriver_type *
> @@ -392,7 +392,8 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg)
>  		spin_unlock(&inode->i_lock);
>  		pnfs_free_lseg(lseg);
>  		if (need_return)
> -			pnfs_send_layoutreturn(lo, stateid, iomode);
> +			pnfs_send_layoutreturn(lo, stateid, iomode, 0,
> +					       NFS4_MAX_UINT64);
>  		else
>  			pnfs_put_layout_hdr(lo);
>  	}
> @@ -897,7 +898,7 @@ static void pnfs_clear_layoutcommit(struct inode *inode,
>  
>  static int
>  pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
> -		       enum pnfs_iomode iomode)
> +		       enum pnfs_iomode iomode, u64 offset, u64 length)
>  {
>  	struct inode *ino = lo->plh_inode;
>  	struct nfs4_layoutreturn *lrp;
> @@ -916,7 +917,9 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
>  	lrp->args.stateid = stateid;
>  	lrp->args.layout_type = NFS_SERVER(ino)->pnfs_curr_ld->id;
>  	lrp->args.inode = ino;
> -	lrp->args.iomode = iomode;
> +	lrp->args.range.iomode = iomode;
> +	lrp->args.range.offset = offset;
> +	lrp->args.range.length = length;

Callers of pnfs_send_layoutreturn() are always passing offset = 0 and length = NFS4_MAX_UINT64.  Can we have pnfs_send_layoutreturn() always set these values, rather than passing them as function parameters?

Thanks,
Anna

>  	lrp->args.layout = lo;
>  	lrp->clp = NFS_SERVER(ino)->nfs_client;
>  	lrp->cred = lo->plh_lc_cred;
> @@ -987,7 +990,8 @@ _pnfs_return_layout(struct inode *ino)
>  	spin_unlock(&ino->i_lock);
>  	pnfs_free_lseg_list(&tmp_list);
>  
> -	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY);
> +	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY, 0,
> +					NFS4_MAX_UINT64);
>  out:
>  	dprintk("<-- %s status: %d\n", __func__, status);
>  	return status;
> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
> index 6400a1e..3637923 100644
> --- a/include/linux/nfs_xdr.h
> +++ b/include/linux/nfs_xdr.h
> @@ -293,7 +293,7 @@ struct nfs4_layoutreturn_args {
>  	struct nfs4_sequence_args seq_args;
>  	struct pnfs_layout_hdr *layout;
>  	struct inode *inode;
> -	enum pnfs_iomode iomode;
> +	struct pnfs_layout_range range;
>  	nfs4_stateid stateid;
>  	__u32   layout_type;
>  };
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Haynes Jan. 13, 2015, 7:42 p.m. UTC | #2
On Tue, Jan 13, 2015 at 02:15:04PM -0500, Anna Schumaker wrote:
> Hi Tao,
> 
> On 01/06/2015 07:28 PM, Tom Haynes wrote:
> > From: Peng Tao <tao.peng@primarydata.com>
> > 
> > -	lrp->args.iomode = iomode;
> > +	lrp->args.range.iomode = iomode;
> > +	lrp->args.range.offset = offset;
> > +	lrp->args.range.length = length;
> 
> Callers of pnfs_send_layoutreturn() are always passing offset = 0 and length = NFS4_MAX_UINT64.  Can we have pnfs_send_layoutreturn() always set these values, rather than passing them as function parameters?
> 

Hi Anna,

This is future-proofing - i.e., add the parameters such
that when we allow only returning part of the file we
already have the support in place.

Thanks,
Tom
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Schumaker, Anna Jan. 13, 2015, 7:51 p.m. UTC | #3
On 01/13/2015 02:42 PM, Tom Haynes wrote:
> On Tue, Jan 13, 2015 at 02:15:04PM -0500, Anna Schumaker wrote:
>> Hi Tao,
>>
>> On 01/06/2015 07:28 PM, Tom Haynes wrote:
>>> From: Peng Tao <tao.peng@primarydata.com>
>>>
>>> -	lrp->args.iomode = iomode;
>>> +	lrp->args.range.iomode = iomode;
>>> +	lrp->args.range.offset = offset;
>>> +	lrp->args.range.length = length;
>>
>> Callers of pnfs_send_layoutreturn() are always passing offset = 0 and length = NFS4_MAX_UINT64.  Can we have pnfs_send_layoutreturn() always set these values, rather than passing them as function parameters?
>>
> 
> Hi Anna,
> 
> This is future-proofing - i.e., add the parameters such
> that when we allow only returning part of the file we
> already have the support in place.

I still think we should hold off until partial file returns are added, making it less likely that somebody will introduce a bug in the meantime.

Anna

> 
> Thanks,
> Tom
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 3c3ff63..56d4c91 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -2012,11 +2012,11 @@  encode_layoutreturn(struct xdr_stream *xdr,
 	p = reserve_space(xdr, 16);
 	*p++ = cpu_to_be32(0);		/* reclaim. always 0 for now */
 	*p++ = cpu_to_be32(args->layout_type);
-	*p++ = cpu_to_be32(args->iomode);
+	*p++ = cpu_to_be32(args->range.iomode);
 	*p = cpu_to_be32(RETURN_FILE);
 	p = reserve_space(xdr, 16);
-	p = xdr_encode_hyper(p, 0);
-	p = xdr_encode_hyper(p, NFS4_MAX_UINT64);
+	p = xdr_encode_hyper(p, args->range.offset);
+	p = xdr_encode_hyper(p, args->range.length);
 	spin_lock(&args->inode->i_lock);
 	encode_nfs4_stateid(xdr, &args->stateid);
 	spin_unlock(&args->inode->i_lock);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 685af4f..63beace 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -52,7 +52,7 @@  static LIST_HEAD(pnfs_modules_tbl);
 
 static int
 pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
-		       enum pnfs_iomode iomode);
+		       enum pnfs_iomode iomode, u64 offset, u64 length);
 
 /* Return the registered pnfs layout driver module matching given id */
 static struct pnfs_layoutdriver_type *
@@ -392,7 +392,8 @@  pnfs_put_lseg(struct pnfs_layout_segment *lseg)
 		spin_unlock(&inode->i_lock);
 		pnfs_free_lseg(lseg);
 		if (need_return)
-			pnfs_send_layoutreturn(lo, stateid, iomode);
+			pnfs_send_layoutreturn(lo, stateid, iomode, 0,
+					       NFS4_MAX_UINT64);
 		else
 			pnfs_put_layout_hdr(lo);
 	}
@@ -897,7 +898,7 @@  static void pnfs_clear_layoutcommit(struct inode *inode,
 
 static int
 pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
-		       enum pnfs_iomode iomode)
+		       enum pnfs_iomode iomode, u64 offset, u64 length)
 {
 	struct inode *ino = lo->plh_inode;
 	struct nfs4_layoutreturn *lrp;
@@ -916,7 +917,9 @@  pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, nfs4_stateid stateid,
 	lrp->args.stateid = stateid;
 	lrp->args.layout_type = NFS_SERVER(ino)->pnfs_curr_ld->id;
 	lrp->args.inode = ino;
-	lrp->args.iomode = iomode;
+	lrp->args.range.iomode = iomode;
+	lrp->args.range.offset = offset;
+	lrp->args.range.length = length;
 	lrp->args.layout = lo;
 	lrp->clp = NFS_SERVER(ino)->nfs_client;
 	lrp->cred = lo->plh_lc_cred;
@@ -987,7 +990,8 @@  _pnfs_return_layout(struct inode *ino)
 	spin_unlock(&ino->i_lock);
 	pnfs_free_lseg_list(&tmp_list);
 
-	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY);
+	status = pnfs_send_layoutreturn(lo, stateid, IOMODE_ANY, 0,
+					NFS4_MAX_UINT64);
 out:
 	dprintk("<-- %s status: %d\n", __func__, status);
 	return status;
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index 6400a1e..3637923 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -293,7 +293,7 @@  struct nfs4_layoutreturn_args {
 	struct nfs4_sequence_args seq_args;
 	struct pnfs_layout_hdr *layout;
 	struct inode *inode;
-	enum pnfs_iomode iomode;
+	struct pnfs_layout_range range;
 	nfs4_stateid stateid;
 	__u32   layout_type;
 };