diff mbox

[v3,03/25] NFS41: Let layoutcommit handle multiple segments

Message ID 20110727234041.GC14319@merit.edu (mailing list archive)
State New, archived
Headers show

Commit Message

Jim Rees July 27, 2011, 11:40 p.m. UTC
Boaz Harrosh wrote:

  On 07/27/2011 01:58 PM, Jim Rees wrote:
  >   But I thought for simplicity since this patchset was reviewed then, I've
  >   tested with this patch and it works good as well. If you are going to
  >   break things up, I can test with the minimal patches and report what is
  >   need in Stable. (Is anyone working on it?)
  > 
  > We may have over-squashed that one for block layout.  I can dig up the
  > original patches if necessary, but I'm guessing you probably have them.
  
  Please do. Because by now I'm confused. the first I discovered it was
  by git diff of a branch that worked. I lost tracked of where the code
  was originated from.

Here is just the original multiple segments patch.  This is from the
88-patch set I sent out before Bakeathon.  I don't know if this would still
apply separately.

From fc3381fa66adfcee4203b5a55ca6605bcfc8dafb Mon Sep 17 00:00:00 2001
From: Peng Tao <bergwolf@gmail.com>
Date: Tue, 31 May 2011 00:42:56 -0400
Subject: [PATCH 03/89] pnfs: let layoutcommit code handle multiple segments

Some layout driver like block will have multiple segments.
Generic code should be able to handle it.
---
 fs/nfs/pnfs.c |   15 ++++++++++++---
 fs/nfs/pnfs.h |    1 +
 2 files changed, 13 insertions(+), 3 deletions(-)

Comments

Boaz Harrosh July 28, 2011, 12:12 a.m. UTC | #1
On 07/27/2011 04:40 PM, Jim Rees wrote:
> Boaz Harrosh wrote:
> 
>   On 07/27/2011 01:58 PM, Jim Rees wrote:
>   >   But I thought for simplicity since this patchset was reviewed then, I've
>   >   tested with this patch and it works good as well. If you are going to
>   >   break things up, I can test with the minimal patches and report what is
>   >   need in Stable. (Is anyone working on it?)
>   > 
>   > We may have over-squashed that one for block layout.  I can dig up the
>   > original patches if necessary, but I'm guessing you probably have them.
>   
>   Please do. Because by now I'm confused. the first I discovered it was
>   by git diff of a branch that worked. I lost tracked of where the code
>   was originated from.
> 
> Here is just the original multiple segments patch.  This is from the
> 88-patch set I sent out before Bakeathon.  I don't know if this would still
> apply separately.
> 

OK Thanks that one looks familiar enough. I'll test just with this one.

Where did the other changes come from? Is there a Benny's branch that
have them separated so I can have a look. I suspect I also need the one
that encodes the last_byte_written.

Thanks
Boaz

> From fc3381fa66adfcee4203b5a55ca6605bcfc8dafb Mon Sep 17 00:00:00 2001
> From: Peng Tao <bergwolf@gmail.com>
> Date: Tue, 31 May 2011 00:42:56 -0400
> Subject: [PATCH 03/89] pnfs: let layoutcommit code handle multiple segments
> 
> Some layout driver like block will have multiple segments.
> Generic code should be able to handle it.
> ---
>  fs/nfs/pnfs.c |   15 ++++++++++++---
>  fs/nfs/pnfs.h |    1 +
>  2 files changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index e3d618b..c18cda0 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1193,10 +1193,18 @@ pnfs_try_to_read_data(struct nfs_read_data *rdata,
>  static struct pnfs_layout_segment *pnfs_list_write_lseg(struct inode *inode)
>  {
>  	struct pnfs_layout_segment *lseg, *rv = NULL;
> +	loff_t max_pos = 0;
> +
> +	list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
> +		if (lseg->pls_range.iomode == IOMODE_RW) {
> +			if (max_pos < lseg->pls_end_pos)
> +				max_pos = lseg->pls_end_pos;
> +			if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
> +				rv = lseg;
> +		}
> +	}
> +	rv->pls_end_pos = max_pos;
>  
> -	list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list)
> -		if (lseg->pls_range.iomode == IOMODE_RW)
> -			rv = lseg;
>  	return rv;
>  }
>  
> @@ -1211,6 +1219,7 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata)
>  	if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
>  		/* references matched in nfs4_layoutcommit_release */
>  		get_lseg(wdata->lseg);
> +		set_bit(NFS_LSEG_LAYOUTCOMMIT, &wdata->lseg->pls_flags);
>  		wdata->lseg->pls_lc_cred =
>  			get_rpccred(wdata->args.context->state->owner->so_cred);
>  		mark_as_dirty = true;
> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
> index 53819d0..c6a9af2 100644
> --- a/fs/nfs/pnfs.h
> +++ b/fs/nfs/pnfs.h
> @@ -36,6 +36,7 @@
>  enum {
>  	NFS_LSEG_VALID = 0,	/* cleared when lseg is recalled/returned */
>  	NFS_LSEG_ROC,		/* roc bit received from server */
> +	NFS_LSEG_LAYOUTCOMMIT,	/* layoutcommit bit set for layoutcommit */
>  };
>  
>  struct pnfs_layout_segment {

--
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
Jim Rees July 28, 2011, 3:19 a.m. UTC | #2
Boaz Harrosh wrote:

  Where did the other changes come from? Is there a Benny's branch that
  have them separated so I can have a look. I suspect I also need the one
  that encodes the last_byte_written.

I have pushed this series to the pnfs-88 branch in my repo:
git://citi.umich.edu/projects/linux-pnfs-blk.git
--
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/pnfs.c b/fs/nfs/pnfs.c
index e3d618b..c18cda0 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1193,10 +1193,18 @@  pnfs_try_to_read_data(struct nfs_read_data *rdata,
 static struct pnfs_layout_segment *pnfs_list_write_lseg(struct inode *inode)
 {
 	struct pnfs_layout_segment *lseg, *rv = NULL;
+	loff_t max_pos = 0;
+
+	list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
+		if (lseg->pls_range.iomode == IOMODE_RW) {
+			if (max_pos < lseg->pls_end_pos)
+				max_pos = lseg->pls_end_pos;
+			if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
+				rv = lseg;
+		}
+	}
+	rv->pls_end_pos = max_pos;
 
-	list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list)
-		if (lseg->pls_range.iomode == IOMODE_RW)
-			rv = lseg;
 	return rv;
 }
 
@@ -1211,6 +1219,7 @@  pnfs_set_layoutcommit(struct nfs_write_data *wdata)
 	if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
 		/* references matched in nfs4_layoutcommit_release */
 		get_lseg(wdata->lseg);
+		set_bit(NFS_LSEG_LAYOUTCOMMIT, &wdata->lseg->pls_flags);
 		wdata->lseg->pls_lc_cred =
 			get_rpccred(wdata->args.context->state->owner->so_cred);
 		mark_as_dirty = true;
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 53819d0..c6a9af2 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -36,6 +36,7 @@ 
 enum {
 	NFS_LSEG_VALID = 0,	/* cleared when lseg is recalled/returned */
 	NFS_LSEG_ROC,		/* roc bit received from server */
+	NFS_LSEG_LAYOUTCOMMIT,	/* layoutcommit bit set for layoutcommit */
 };
 
 struct pnfs_layout_segment {