All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: Lukas Czerner <lczerner@redhat.com>
Cc: linux-ext4@vger.kernel.org, "Theodore Ts'o" <tytso@mit.edu>,
	Yongqiang Yang <xiaoqiangnk@gmail.com>,
	Milan Broz <mbroz@redhat.com>
Subject: Re: [PATCH] ext4: fix resize when resizing within single group
Date: Mon, 20 Feb 2012 18:20:29 -0600	[thread overview]
Message-ID: <4F42E34D.1070209@redhat.com> (raw)
In-Reply-To: <1328173555-26452-1-git-send-email-lczerner@redhat.com>

On 2/2/12 3:05 AM, Lukas Czerner wrote:
> When resizing file system in the way that the new size of the file
> system is still in the same group (no new groups are added), then we can
> hit a BUG_ON in ext4_alloc_group_tables()
> 
> BUG_ON(flex_gd->count == 0 || group_data == NULL);
> 
> because flex_gd->count is zero. The reason is the missing check for such
> case, so the code always extend the last group fully and then attempt to
> add more groups, but at that time n_blocks_count is actually smaller
> than o_blocks_count.
> 
> It can be easily reproduced like this:
> 
> mkfs.ext4 -b 4096 /dev/sda 30M
> mount /dev/sda /mnt/test
> resize2fs /dev/sda 50M
> 
> Fix this by checking whether the resize happens within the singe group
> and only add that many blocks into the last group to satisfy user
> request. Then o_blocks_count == n_blocks_count and the resize will exit
> successfully without and attempt to add more groups into the fs.
> 
> Also fix mixing together block number and blocks count which might be
> confusing and can easily lead to off-by-one errors (but it is actually
> not the case here since the two occurrence of this mix-up will cancel
> each other).
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
> Reported-by: Milan Broz <mbroz@redhat.com>

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

Ted, if this hits linux-next we can pull it into fedora and close a bug they're tracking.  :)

thanks,
-Eric

> ---
>  fs/ext4/resize.c |   14 ++++++++------
>  1 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
> index f9d948f..3fed79d 100644
> --- a/fs/ext4/resize.c
> +++ b/fs/ext4/resize.c
> @@ -1582,7 +1582,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
>  	ext4_fsblk_t o_blocks_count;
>  	ext4_group_t o_group;
>  	ext4_group_t n_group;
> -	ext4_grpblk_t offset;
> +	ext4_grpblk_t offset, add;
>  	unsigned long n_desc_blocks;
>  	unsigned long o_desc_blocks;
>  	unsigned long desc_blocks;
> @@ -1605,7 +1605,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
>  		return 0;
>  
>  	ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &offset);
> -	ext4_get_group_no_and_offset(sb, o_blocks_count, &o_group, &offset);
> +	ext4_get_group_no_and_offset(sb, o_blocks_count - 1, &o_group, &offset);
>  
>  	n_desc_blocks = (n_group + EXT4_DESC_PER_BLOCK(sb)) /
>  			EXT4_DESC_PER_BLOCK(sb);
> @@ -1634,10 +1634,12 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
>  	}
>  	brelse(bh);
>  
> -	if (offset != 0) {
> -		/* extend the last group */
> -		ext4_grpblk_t add;
> -		add = EXT4_BLOCKS_PER_GROUP(sb) - offset;
> +	/* extend the last group */
> +	if (n_group == o_group)
> +		add = n_blocks_count - o_blocks_count;
> +	else
> +		add = EXT4_BLOCKS_PER_GROUP(sb) - (offset + 1);
> +	if (add > 0) {
>  		err = ext4_group_extend_no_check(sb, o_blocks_count, add);
>  		if (err)
>  			goto out;


  parent reply	other threads:[~2012-02-21  0:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-02  9:05 [PATCH] ext4: fix resize when resizing within single group Lukas Czerner
2012-02-03 11:13 ` Yongqiang Yang
2012-02-21  0:20 ` Eric Sandeen [this message]
2012-02-21  4:03 ` Ted Ts'o

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=4F42E34D.1070209@redhat.com \
    --to=sandeen@redhat.com \
    --cc=lczerner@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=mbroz@redhat.com \
    --cc=tytso@mit.edu \
    --cc=xiaoqiangnk@gmail.com \
    /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.