All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: Mingming Cao <cmm@us.ibm.com>
Cc: Theodore Tso <tytso@mit.edu>, linux-ext4 <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH] Ext4: Fix delalloc enospace handling counter update race
Date: Mon, 14 Jul 2008 22:23:24 +0530	[thread overview]
Message-ID: <20080714165324.GA3545@skywalker> (raw)
In-Reply-To: <1216052897.7937.1.camel@mingming-laptop>

On Mon, Jul 14, 2008 at 09:28:17AM -0700, Mingming Cao wrote:
> 
> Ext4: Fix delalloc enospace handling counter update race
> 
> From: Mingming Cao <cmm@us.ibm.com>
> 
> Ext4 delalloc reserve meta blocks ahead of time so later when real block
> allocation fs will not short of free blocks for allocating meta blocks.
> It keeps track of the real number of new allocated meta data blocks, so
> after block allocation it will update how much meta data blocks still
> need to be reserved for that inode.
> 
> Both per inode reserved metadata blocks and per-allocation allocated metablocks
> are protected by the per inode delalloc reservation lock. The per-allocation
> allocated metablocks counter should be protected by the i_data_sem as well,
> so that it could avoid race with other block allocation to the same inode
> in parallel. The patch moves the code under the i_data_sem protection.
> 
> Also in the case of truncate, we should not clear the per-allocation allocated
> metablocks counter as that may be in-use by parallel allocation. The patch
> only clear the per-allocation allocated metablocks when allocation is successfully returned.
> 
> 
> Signed-off-by: Mingming Cao <cmm@us.ibm.com>

Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

> 
> ---
>  fs/ext4/inode.c |   19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> Index: linux-2.6.26-rc9/fs/ext4/inode.c
> ===================================================================
> --- linux-2.6.26-rc9.orig/fs/ext4/inode.c	2008-07-14 08:54:25.000000000 -0700
> +++ linux-2.6.26-rc9/fs/ext4/inode.c	2008-07-14 09:23:29.000000000 -0700
> @@ -1060,8 +1060,18 @@ int ext4_get_blocks_wrap(handle_t *handl
>  							~EXT4_EXT_MIGRATE;
>  		}
>  	}
> -	if (flag)
> +
> +	if (flag) {
>  		EXT4_I(inode)->i_delalloc_reserved_flag = 0;
> +		/*
> +		 * Update reserved blocks/metadata blocks
> +		 * after successful block allocation
> +		 * which were deferred till now
> +		 */
> +		if ((retval > 0) && buffer_delay(bh))
> +			ext4_da_release_space(inode, retval, 0);
> +	}
> +
>  	up_write((&EXT4_I(inode)->i_data_sem));
>  	return retval;
>  }
> @@ -1519,7 +1529,8 @@ void ext4_da_release_space(struct inode 
> 
>  	BUG_ON(mdb > EXT4_I(inode)->i_reserved_meta_blocks);
>  	EXT4_I(inode)->i_reserved_meta_blocks = mdb;
> -	EXT4_I(inode)->i_allocated_meta_blocks = 0;
> +	if (used)
> +		EXT4_I(inode)->i_allocated_meta_blocks = 0;
>  	spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
>  }
> 
> @@ -2005,10 +2016,6 @@ static int ext4_da_get_block_write(struc
>  	if (ret > 0) {
>  		bh_result->b_size = (ret << inode->i_blkbits);
> 
> -		/* release reserved-but-unused meta blocks */
> -		if (buffer_delay(bh_result))
> -			ext4_da_release_space(inode, ret, 0);
> -
>  		/*
>  		 * Update on-disk size along with block allocation
>  		 * we don't use 'extend_disksize' as size may change
> 
> 

  reply	other threads:[~2008-07-14 16:53 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-13  6:26 [patch 4/4] ext4: replace __FUNCTION__ occurrences akpm
2008-07-14  1:08 ` Theodore Tso
2008-07-14 16:28   ` [PATCH] Ext4: Fix delalloc enospace handling counter update race Mingming Cao
2008-07-14 16:53     ` Aneesh Kumar K.V [this message]
2008-07-14 17:54       ` Mingming Cao
2008-07-14 18:05         ` Theodore Tso
2008-07-14 18:34           ` Mingming Cao
2008-07-15  3:12         ` Aneesh Kumar K.V
2008-07-15 21:12           ` Mingming Cao

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=20080714165324.GA3545@skywalker \
    --to=aneesh.kumar@linux.vnet.ibm.com \
    --cc=cmm@us.ibm.com \
    --cc=linux-ext4@vger.kernel.org \
    --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.