Whamcloud - gitweb
libext2fs: fix alloc_allocate_group_table() if the flexbg_offset wraps
authorTheodore Ts'o <tytso@mit.edu>
Mon, 28 Apr 2014 14:03:12 +0000 (10:03 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 5 May 2014 03:15:49 +0000 (23:15 -0400)
If the previous block group's inode table ends at the very end of file
system, wrap around to the beginning of the flex_bg.

This fixes a bug was tickled by:

mke2fs.conf:
frontload = {
features = extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,^resize_inode,sparse_super2
hash_alg = half_md4
num_backup_sb = 0
packed_meta_blocks = 1
inode_ratio = 4194304
flex_bg_size = 262144
}

mke2fs -T frontload /tmp/foo.img 2T
resize2fs -M /tmp/foo.img
resize2fs -M /tmp/foo.img

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/alloc_tables.c

index fec9003..bc99943 100644 (file)
@@ -54,8 +54,8 @@ static blk64_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk64_t start_blk,
         * Don't do a long search if the previous block
         * search is still valid.
         */
-       if (start_blk && ext2fs_test_block_bitmap_range2(bmap, start_blk,
-                                                        elem_size))
+       if (start_blk && start_blk < ext2fs_blocks_count(fs->super) &&
+           ext2fs_test_block_bitmap_range2(bmap, start_blk, elem_size))
                return start_blk;
 
        start_blk = ext2fs_group_first_block2(fs, flexbg_size * flexbg);