ext4: fix resize when resizing within single group
authorLukas Czerner <lczerner@redhat.com>
Tue, 21 Feb 2012 04:02:06 +0000 (23:02 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 21 Feb 2012 04:02:06 +0000 (23:02 -0500)
commita0ade1deb86d2325aecc36272bb4505a6eec9235
tree863f896ae46280dbcbbe5c31e9a3d2988c14c1fb
parent266991b13890049ee1a6bb95b9817f06339ee3d7
ext4: fix resize when resizing within single group

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>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/resize.c