All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mingming Cao <cmm@us.ibm.com>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: tytso@mit.edu, sandeen@redhat.com, linux-ext4@vger.kernel.org
Subject: Re: [PATCH -V3 06/11] ext4: Update meta-data reservation with delalloc.
Date: Thu, 28 Aug 2008 14:03:16 -0700	[thread overview]
Message-ID: <1219957396.6384.25.camel@mingming-laptop> (raw)
In-Reply-To: <1219850916-8986-6-git-send-email-aneesh.kumar@linux.vnet.ibm.com>


在 2008-08-27三的 20:58 +0530,Aneesh Kumar K.V写道:
> This makes the meta-data reservation simpler. The logic
> followed is simpler. After each block allocation request
> if we have allocated some meta-data blocks subtract the
> same from the reserved meta-data blocks. If the total
> reserved data blocks after allocation is zero, free the
> remaining meta-data blocks reserved. 

With this change ext4 keeps unnecessary blocks reserved for metadata
blocks for a longer time (untilall dirty data have been flushed), I am
concerned this will leads to early ENOSPC.

The current metadata reservation logic is a little complex, but it's not
that bad. It's there to make sure we don't over-reserve the metadata.
I'd say it worth the effort. 

> During reservation
> if the total reserved blocks need more meta-data blocks
> add the extra meta-data blocks needed to the reserve_meta_blocks
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
>  fs/ext4/inode.c |   75 +++++++++++++++++++++++++++----------------------------
>  1 files changed, 37 insertions(+), 38 deletions(-)
> 
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index a45121f..3ef0822 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -1019,31 +1019,34 @@ static int ext4_calc_metadata_amount(struct inode *inode, int blocks)
>  static void ext4_da_update_reserve_space(struct inode *inode, int used)
>  {
>  	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
> -	int total, mdb, mdb_free;
> 
>  	spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
> -	/* recalculate the number of metablocks still need to be reserved */
> -	total = EXT4_I(inode)->i_reserved_data_blocks - used;
> -	mdb = ext4_calc_metadata_amount(inode, total);
> -
> -	/* figure out how many metablocks to release */
> -	BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
> -	mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb;
> -
> -	if (mdb_free) {
> -		/* Account for allocated meta_blocks */
> -		mdb_free -= EXT4_I(inode)->i_allocated_meta_blocks;
> -
> -		/* update fs dirty blocks counter */
> -		percpu_counter_sub(&sbi->s_dirtyblocks_counter, mdb_free);
> +	if (EXT4_I(inode)->i_allocated_meta_blocks) {
> +		/* update the reseved meta- blocks */
> +		BUG_ON(EXT4_I(inode)->i_allocated_meta_blocks >
> +			EXT4_I(inode)->i_reserved_meta_blocks);
> +		EXT4_I(inode)->i_reserved_meta_blocks -=
> +			EXT4_I(inode)->i_allocated_meta_blocks;
>  		EXT4_I(inode)->i_allocated_meta_blocks = 0;
> -		EXT4_I(inode)->i_reserved_meta_blocks = mdb;
> +		/*
> +		 * We already updated the percpu dirty
> +		 * block counter in the block allocation path.
> +		 */
>  	}
> -
>  	/* update per-inode reservations */
>  	BUG_ON(used  > EXT4_I(inode)->i_reserved_data_blocks);
>  	EXT4_I(inode)->i_reserved_data_blocks -= used;
> +	if (!EXT4_I(inode)->i_reserved_data_blocks) {
> +		/*
> +		 * If we don't have any reserved data blocks
> +		 * release all the resered meta data blocks
> +		 * update percpu dirty block counter also.
> +		 */
> +		percpu_counter_sub(&sbi->s_dirtyblocks_counter,
> +				EXT4_I(inode)->i_reserved_meta_blocks);
> +		EXT4_I(inode)->i_reserved_meta_blocks = 0;
> 
> +	}
>  	spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
>  }
> 
> @@ -1524,7 +1527,7 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
>  {
>  	int retries = 0;
>         struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
> -       unsigned long md_needed, mdblocks, total = 0;
> +       unsigned long md_needed = 0, mdblocks, total = 0;
> 
>  	/*
>  	 * recalculate the amount of metadata blocks to reserve
> @@ -1535,9 +1538,9 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
>  	spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
>  	total = EXT4_I(inode)->i_reserved_data_blocks + nrblocks;
>  	mdblocks = ext4_calc_metadata_amount(inode, total);
> -	BUG_ON(mdblocks < EXT4_I(inode)->i_reserved_meta_blocks);
> +	if (mdblocks > EXT4_I(inode)->i_reserved_meta_blocks)
> +		md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks;
> 
> -	md_needed = mdblocks - EXT4_I(inode)->i_reserved_meta_blocks;
>  	total = md_needed + nrblocks;
> 
>  	if (ext4_claim_free_blocks(sbi, total)) {
> @@ -1549,7 +1552,7 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
>  		return -ENOSPC;
>  	}
>  	EXT4_I(inode)->i_reserved_data_blocks += nrblocks;
> -	EXT4_I(inode)->i_reserved_meta_blocks = mdblocks;
> +	EXT4_I(inode)->i_reserved_meta_blocks += md_needed;
> 
>  	spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
>  	return 0;       /* success */
> @@ -1558,13 +1561,12 @@ static int ext4_da_reserve_space(struct inode *inode, int nrblocks)
>  static void ext4_da_release_space(struct inode *inode, int to_free)
>  {
>  	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
> -	int total, mdb, mdb_free, release;
> +	int release, mdb_free = 0;
> 
>  	if (!to_free)
>  		return;		/* Nothing to release, exit */
> 
>  	spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
> -
>  	if (!EXT4_I(inode)->i_reserved_data_blocks) {
>  		/*
>  		 * if there is no reserved blocks, but we try to free some
> @@ -1578,26 +1580,23 @@ static void ext4_da_release_space(struct inode *inode, int to_free)
>  		spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
>  		return;
>  	}
> +	/* update per-inode reservations */
> +	BUG_ON(to_free > EXT4_I(inode)->i_reserved_data_blocks);
> +	EXT4_I(inode)->i_reserved_data_blocks -= to_free;
> +	if (!EXT4_I(inode)->i_reserved_data_blocks) {
> +		/*
> +		 * If we don't have any reserved data blocks
> +		 * release all the resered meta data blocks
> +		 * update percpu dirty block counter also.
> +		 */
> +		mdb_free = EXT4_I(inode)->i_reserved_meta_blocks;
> +		EXT4_I(inode)->i_reserved_meta_blocks = 0;
> 
> -	/* recalculate the number of metablocks still need to be reserved */
> -	total = EXT4_I(inode)->i_reserved_data_blocks - to_free;
> -	mdb = ext4_calc_metadata_amount(inode, total);
> -
> -	/* figure out how many metablocks to release */
> -	BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
> -	mdb_free = EXT4_I(inode)->i_reserved_meta_blocks - mdb;
> -
> +	}
>  	release = to_free + mdb_free;
> 
>  	/* update fs dirty blocks counter for truncate case */
>  	percpu_counter_sub(&sbi->s_dirtyblocks_counter, release);
> -
> -	/* update per-inode reservations */
> -	BUG_ON(to_free > EXT4_I(inode)->i_reserved_data_blocks);
> -	EXT4_I(inode)->i_reserved_data_blocks -= to_free;
> -
> -	BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
> -	EXT4_I(inode)->i_reserved_meta_blocks = mdb;
>  	spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
>  }
> 

--
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

  parent reply	other threads:[~2008-08-28 21:03 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-27 15:28 [PATCH -V3 01/11] percpu_counters: make fbc->count read atomic on 32 bit architecture Aneesh Kumar K.V
2008-08-27 15:28 ` [PATCH -V3 02/11] ext4: Make sure all the block allocation paths reserve blocks Aneesh Kumar K.V
2008-08-27 15:28   ` [PATCH -V3 03/11] ext4: Retry block reservation Aneesh Kumar K.V
2008-08-27 15:28     ` [PATCH -V3 04/11] ext4: Add percpu dirty block accounting Aneesh Kumar K.V
2008-08-27 15:28       ` [PATCH -V3 05/11] ext4: Switch to non delalloc mode when we are low on free blocks count Aneesh Kumar K.V
2008-08-27 15:28         ` [PATCH -V3 06/11] ext4: Update meta-data reservation with delalloc Aneesh Kumar K.V
2008-08-27 15:28           ` [PATCH -V3 07/11] ext4: request for blocks with ar.excepted_group = -1 Aneesh Kumar K.V
2008-08-27 15:28             ` [PATCH -V3 08/11] ext4: Signed arithematic fix Aneesh Kumar K.V
2008-08-27 15:28               ` [PATCH -V3 09/11] ext4: Fix ext4 nomballoc allocator for ENOSPC Aneesh Kumar K.V
2008-08-27 15:28                 ` [PATCH -V3 10/11] ext4: Add inode to journal handle after block allocation for ordered mode Aneesh Kumar K.V
2008-08-27 15:28                   ` [PATCH -V3 11/11] ext4: Retry block allocation if we have free blocks left Aneesh Kumar K.V
2008-08-28 21:57                 ` [PATCH -V3 09/11] ext4: Fix ext4 nomballoc allocator for ENOSPC Mingming Cao
2008-08-29  3:44                   ` Aneesh Kumar K.V
2008-08-29  4:14                     ` Aneesh Kumar K.V
2008-08-29  5:02                       ` Mingming Cao
2008-08-29  5:06                     ` Mingming Cao
2008-08-29  8:25                       ` Aneesh Kumar K.V
2008-08-28 21:04               ` [PATCH -V3 08/11] ext4: Signed arithematic fix Mingming Cao
2008-08-28 21:03             ` [PATCH -V3 07/11] ext4: request for blocks with ar.excepted_group = -1 Mingming Cao
2008-08-28 21:03           ` Mingming Cao [this message]
2008-08-28 20:57         ` [PATCH -V3 05/11] ext4: Switch to non delalloc mode when we are low on free blocks count Mingming Cao
2008-08-28 20:56       ` [PATCH -V3 04/11] ext4: Add percpu dirty block accounting Mingming Cao
2008-10-09 20:44       ` Eric Sandeen
2008-10-10  4:52         ` Aneesh Kumar K.V
2008-10-10  4:58           ` Eric Sandeen
2008-10-11 21:10         ` Andreas Dilger
2008-08-28 20:42     ` [PATCH -V3 03/11] ext4: Retry block reservation Mingming Cao
2008-08-28 20:41   ` [PATCH -V3 02/11] ext4: Make sure all the block allocation paths reserve blocks Mingming Cao
2008-08-27 19:05 ` [PATCH -V3 01/11] percpu_counters: make fbc->count read atomic on 32 bit architecture Andrew Morton
2008-08-27 21:01   ` Peter Zijlstra
2008-08-27 21:22     ` Andrew Morton
2008-08-28  3:52       ` Aneesh Kumar K.V
2008-08-28  4:09         ` Andrew Morton
2008-08-28 22:59           ` Mingming Cao
2008-08-28 22:59             ` Mingming Cao
2008-08-28  7:57       ` Peter Zijlstra
2008-08-28  3:48   ` Aneesh Kumar K.V
2008-08-28  4:06     ` Andrew Morton
2008-08-28 14:19       ` Nick Piggin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1219957396.6384.25.camel@mingming-laptop \
    --to=cmm@us.ibm.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=sandeen@redhat.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.