linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ext4: limit nrblocks properly with non extent format
@ 2008-08-19  6:48 Aneesh Kumar K.V
  2008-08-19  6:48 ` [PATCH] ext4: Code cleanups Aneesh Kumar K.V
  2008-08-19 18:07 ` [PATCH] ext4: limit nrblocks properly with non extent format Mingming Cao
  0 siblings, 2 replies; 4+ messages in thread
From: Aneesh Kumar K.V @ 2008-08-19  6:48 UTC (permalink / raw)
  To: cmm, tytso, sandeen; +Cc: linux-ext4, Aneesh Kumar K.V

We need to make sure adding new buffer_head to the
contiguous block extent doesn't result in nrblocks
greater than EXT4_MAX_TRANS_DATA. We only have
enought credit to insert EXT4_MAX_TRANS_DATA blocks.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 fs/ext4/inode.c |   38 +++++++++++++++++++++++++-------------
 1 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index dcd1337..a10f8e5 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1909,27 +1909,39 @@ static int  mpage_da_map_blocks(struct mpage_da_data *mpd)
 static void mpage_add_bh_to_extent(struct mpage_da_data *mpd,
 				   sector_t logical, struct buffer_head *bh)
 {
-	struct buffer_head *lbh = &mpd->lbh;
 	sector_t next;
+	size_t b_size = bh->b_size;
+	struct buffer_head *lbh = &mpd->lbh;
 	int nrblocks = lbh->b_size >> mpd->inode->i_blkbits;
 
 	/* check if thereserved journal credits might overflow */
-	if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL) &&
-	     (nrblocks >= EXT4_MAX_TRANS_DATA))
-		/*
-		 * With noextent format we are limited by the journal
-		 * credit available. Total credit needed to insert
-		 * nrblocks contiguous blocks is dependent on the
-		 * nrblocks. So limit nrblocks.
-		 */
-		goto flush_it;
-
+	if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) {
+		if (nrblocks >= EXT4_MAX_TRANS_DATA) {
+			/*
+			 * With noextent format we are limited by the journal
+			 * credit available. Total credit needed to insert
+			 * nrblocks contiguous blocks is dependent on the
+			 * nrblocks. So limit nrblocks.
+			 */
+			goto flush_it;
+		} else if ((nrblocks + (b_size >> mpd->inode->i_blkbits)) >
+				EXT4_MAX_TRANS_DATA) {
+			/*
+			 * Adding the new buffer_head would make it cross the
+			 * allowed limit for which we have journal credit
+			 * reserved. So limit the new bh->b_size
+			 */
+			b_size = (EXT4_MAX_TRANS_DATA - nrblocks) <<
+						mpd->inode->i_blkbits;
+			/* we will do mpage_da_submit_io in the next loop */
+		}
+	}
 	/*
 	 * First block in the extent
 	 */
 	if (lbh->b_size == 0) {
 		lbh->b_blocknr = logical;
-		lbh->b_size = bh->b_size;
+		lbh->b_size = b_size;
 		lbh->b_state = bh->b_state & BH_FLAGS;
 		return;
 	}
@@ -1939,7 +1951,7 @@ static void mpage_add_bh_to_extent(struct mpage_da_data *mpd,
 	 * Can we merge the block to our big extent?
 	 */
 	if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) {
-		lbh->b_size += bh->b_size;
+		lbh->b_size += b_size;
 		return;
 	}
 
-- 
1.6.0.2.g2ebc0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH] ext4: Code cleanups
  2008-08-19  6:48 [PATCH] ext4: limit nrblocks properly with non extent format Aneesh Kumar K.V
@ 2008-08-19  6:48 ` Aneesh Kumar K.V
  2008-08-19 18:29   ` Mingming Cao
  2008-08-19 18:07 ` [PATCH] ext4: limit nrblocks properly with non extent format Mingming Cao
  1 sibling, 1 reply; 4+ messages in thread
From: Aneesh Kumar K.V @ 2008-08-19  6:48 UTC (permalink / raw)
  To: cmm, tytso, sandeen; +Cc: linux-ext4, Aneesh Kumar K.V

a) rename num to nrblocks to clearly indicate we expecting block count as argument.
b) renmae ext4_writepages_trans_blocks to ext4_da_writepages_trans_blocks to
indicate it is the delayed allocation writepages transaction credit.
c) Add some comments. remove some stale comments.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 fs/ext4/extents.c |    8 ++++----
 fs/ext4/inode.c   |   14 ++++++++------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 73bb308..bf612a7 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -1893,7 +1893,7 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
  * When pass the actual path, the caller should calculate credits
  * under i_data_sem.
  */
-int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
+int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks,
 						struct ext4_ext_path *path)
 {
 	if (path) {
@@ -1912,12 +1912,12 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
 			 *  and other metadat blocks still need to be
 			 *  accounted.
 			 */
-			/* 1 one bitmap, 1 block group descriptor */
+			/* 1 bitmap, 1 block group descriptor */
 			ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb);
 		}
 	}
 
-	return ext4_chunk_trans_blocks(inode, num);
+	return ext4_chunk_trans_blocks(inode, nrblocks);
 }
 
 /*
@@ -1931,7 +1931,7 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
  * If the nrblocks are discontiguous, they could cause
  * the whole tree split more than once, but this is really rare.
  */
-int ext4_ext_index_trans_blocks(struct inode *inode, int num, int chunk)
+int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, int chunk)
 {
 	int index;
 	int depth = ext_depth(inode);
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index a10f8e5..b32a723 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2321,16 +2321,18 @@ static int ext4_da_writepage(struct page *page,
  * a single extent allocation into a single transaction,
  * ext4_da_writpeages() will loop calling this before
  * the block allocation.
- *
- * The page vector size limited the max number of pages could
- * be writeout at a time. Based on this, the max blocks to pass to
- * get_block is calculated
  */
 
-static int ext4_writepages_trans_blocks(struct inode *inode)
+static int ext4_da_writepages_trans_blocks(struct inode *inode)
 {
 	int max_blocks = EXT4_I(inode)->i_reserved_data_blocks;
 
+	/*
+	 * With noextent format the journal credit needed to
+	 * insert nrblocks contiguous block is dependent on
+	 * number of contiguous block. So we will limit
+	 * number of contiguous block to a sane value
+	 */
 	if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
 	    (max_blocks > EXT4_MAX_TRANS_DATA))
 		max_blocks = EXT4_MAX_TRANS_DATA;
@@ -2387,7 +2389,7 @@ static int ext4_da_writepages(struct address_space *mapping,
 		 * by delalloc
 		 */
 		BUG_ON(ext4_should_journal_data(inode));
-		needed_blocks = ext4_writepages_trans_blocks(inode);
+		needed_blocks = ext4_da_writepages_trans_blocks(inode);
 
 		/* start a new transaction*/
 		handle = ext4_journal_start(inode, needed_blocks);
-- 
1.6.0.2.g2ebc0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] ext4: limit nrblocks properly with non extent format
  2008-08-19  6:48 [PATCH] ext4: limit nrblocks properly with non extent format Aneesh Kumar K.V
  2008-08-19  6:48 ` [PATCH] ext4: Code cleanups Aneesh Kumar K.V
@ 2008-08-19 18:07 ` Mingming Cao
  1 sibling, 0 replies; 4+ messages in thread
From: Mingming Cao @ 2008-08-19 18:07 UTC (permalink / raw)
  To: Aneesh Kumar K.V; +Cc: tytso, sandeen, linux-ext4


在 2008-08-19二的 12:18 +0530,Aneesh Kumar K.V写道:
> We need to make sure adding new buffer_head to the
> contiguous block extent doesn't result in nrblocks
> greater than EXT4_MAX_TRANS_DATA. We only have
> enought credit to insert EXT4_MAX_TRANS_DATA blocks.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Reviewed-by: Mingming Cao <cmm@us.ibm.com>
> ---
>  fs/ext4/inode.c |   38 +++++++++++++++++++++++++-------------
>  1 files changed, 25 insertions(+), 13 deletions(-)
> 
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index dcd1337..a10f8e5 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -1909,27 +1909,39 @@ static int  mpage_da_map_blocks(struct mpage_da_data *mpd)
>  static void mpage_add_bh_to_extent(struct mpage_da_data *mpd,
>  				   sector_t logical, struct buffer_head *bh)
>  {
> -	struct buffer_head *lbh = &mpd->lbh;
>  	sector_t next;
> +	size_t b_size = bh->b_size;
> +	struct buffer_head *lbh = &mpd->lbh;
>  	int nrblocks = lbh->b_size >> mpd->inode->i_blkbits;
> 
>  	/* check if thereserved journal credits might overflow */
> -	if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL) &&
> -	     (nrblocks >= EXT4_MAX_TRANS_DATA))
> -		/*
> -		 * With noextent format we are limited by the journal
> -		 * credit available. Total credit needed to insert
> -		 * nrblocks contiguous blocks is dependent on the
> -		 * nrblocks. So limit nrblocks.
> -		 */
> -		goto flush_it;
> -
> +	if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) {
> +		if (nrblocks >= EXT4_MAX_TRANS_DATA) {
> +			/*
> +			 * With noextent format we are limited by the journal
> +			 * credit available. Total credit needed to insert
> +			 * nrblocks contiguous blocks is dependent on the
> +			 * nrblocks. So limit nrblocks.
> +			 */
> +			goto flush_it;
> +		} else if ((nrblocks + (b_size >> mpd->inode->i_blkbits)) >
> +				EXT4_MAX_TRANS_DATA) {
> +			/*
> +			 * Adding the new buffer_head would make it cross the
> +			 * allowed limit for which we have journal credit
> +			 * reserved. So limit the new bh->b_size
> +			 */
> +			b_size = (EXT4_MAX_TRANS_DATA - nrblocks) <<
> +						mpd->inode->i_blkbits;
> +			/* we will do mpage_da_submit_io in the next loop */
> +		}
> +	}
>  	/*
>  	 * First block in the extent
>  	 */
>  	if (lbh->b_size == 0) {
>  		lbh->b_blocknr = logical;
> -		lbh->b_size = bh->b_size;
> +		lbh->b_size = b_size;
>  		lbh->b_state = bh->b_state & BH_FLAGS;
>  		return;
>  	}
> @@ -1939,7 +1951,7 @@ static void mpage_add_bh_to_extent(struct mpage_da_data *mpd,
>  	 * Can we merge the block to our big extent?
>  	 */
>  	if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) {
> -		lbh->b_size += bh->b_size;
> +		lbh->b_size += b_size;
>  		return;
>  	}
> 

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] ext4: Code cleanups
  2008-08-19  6:48 ` [PATCH] ext4: Code cleanups Aneesh Kumar K.V
@ 2008-08-19 18:29   ` Mingming Cao
  0 siblings, 0 replies; 4+ messages in thread
From: Mingming Cao @ 2008-08-19 18:29 UTC (permalink / raw)
  To: Aneesh Kumar K.V; +Cc: tytso, sandeen, linux-ext4


在 2008-08-19二的 12:18 +0530,Aneesh Kumar K.V写道:
> a) rename num to nrblocks to clearly indicate we expecting block count as argument.
> b) renmae ext4_writepages_trans_blocks to ext4_da_writepages_trans_blocks to
> indicate it is the delayed allocation writepages transaction credit.
> c) Add some comments. remove some stale comments.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Acked-by: Mingming Cao <cmm@us.ibm.com>
> ---
>  fs/ext4/extents.c |    8 ++++----
>  fs/ext4/inode.c   |   14 ++++++++------
>  2 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index 73bb308..bf612a7 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -1893,7 +1893,7 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
>   * When pass the actual path, the caller should calculate credits
>   * under i_data_sem.
>   */
> -int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
> +int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks,
>  						struct ext4_ext_path *path)
>  {
>  	if (path) {
> @@ -1912,12 +1912,12 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
>  			 *  and other metadat blocks still need to be
>  			 *  accounted.
>  			 */
> -			/* 1 one bitmap, 1 block group descriptor */
> +			/* 1 bitmap, 1 block group descriptor */
>  			ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb);
>  		}
>  	}
> 
> -	return ext4_chunk_trans_blocks(inode, num);
> +	return ext4_chunk_trans_blocks(inode, nrblocks);
>  }
> 
>  /*
> @@ -1931,7 +1931,7 @@ int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num,
>   * If the nrblocks are discontiguous, they could cause
>   * the whole tree split more than once, but this is really rare.
>   */
> -int ext4_ext_index_trans_blocks(struct inode *inode, int num, int chunk)
> +int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, int chunk)
>  {
>  	int index;
>  	int depth = ext_depth(inode);
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index a10f8e5..b32a723 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -2321,16 +2321,18 @@ static int ext4_da_writepage(struct page *page,
>   * a single extent allocation into a single transaction,
>   * ext4_da_writpeages() will loop calling this before
>   * the block allocation.
> - *
> - * The page vector size limited the max number of pages could
> - * be writeout at a time. Based on this, the max blocks to pass to
> - * get_block is calculated
>   */
> 
> -static int ext4_writepages_trans_blocks(struct inode *inode)
> +static int ext4_da_writepages_trans_blocks(struct inode *inode)
>  {
>  	int max_blocks = EXT4_I(inode)->i_reserved_data_blocks;
> 
> +	/*
> +	 * With noextent format the journal credit needed to
> +	 * insert nrblocks contiguous block is dependent on
> +	 * number of contiguous block. So we will limit
> +	 * number of contiguous block to a sane value
> +	 */
>  	if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
>  	    (max_blocks > EXT4_MAX_TRANS_DATA))
>  		max_blocks = EXT4_MAX_TRANS_DATA;
> @@ -2387,7 +2389,7 @@ static int ext4_da_writepages(struct address_space *mapping,
>  		 * by delalloc
>  		 */
>  		BUG_ON(ext4_should_journal_data(inode));
> -		needed_blocks = ext4_writepages_trans_blocks(inode);
> +		needed_blocks = ext4_da_writepages_trans_blocks(inode);
> 
>  		/* start a new transaction*/
>  		handle = ext4_journal_start(inode, needed_blocks);

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-08-19 18:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-19  6:48 [PATCH] ext4: limit nrblocks properly with non extent format Aneesh Kumar K.V
2008-08-19  6:48 ` [PATCH] ext4: Code cleanups Aneesh Kumar K.V
2008-08-19 18:29   ` Mingming Cao
2008-08-19 18:07 ` [PATCH] ext4: limit nrblocks properly with non extent format Mingming Cao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).