• Azat Khuzhin's avatar
    ext4: initialize multi-block allocator before checking block descriptors · 00764937
    Azat Khuzhin authored
    With EXT4FS_DEBUG ext4_count_free_clusters() will call
    ext4_read_block_bitmap() without s_group_info initialized, so we need to
    initialize multi-block allocator before.
    
    And dependencies that must be solved, to allow this:
    - multi-block allocator needs in group descriptors
    - need to install s_op before initializing multi-block allocator,
      because in ext4_mb_init_backend() new inode is created.
    - initialize number of group desc blocks (s_gdb_count) otherwise
      number of clusters returned by ext4_free_clusters_after_init() is not correct.
      (see ext4_bg_num_gdb_nometa())
    
    Here is the stack backtrace:
    
    (gdb) bt
     #0  ext4_get_group_info (group=0, sb=0xffff880079a10000) at ext4.h:2430
     #1  ext4_validate_block_bitmap (sb=sb@entry=0xffff880079a10000,
         desc=desc@entry=0xffff880056510000, block_group=block_group@entry=0,
         bh=bh@entry=0xffff88007bf2b2d8) at balloc.c:358
     #2  0xffffffff81232202 in ext4_wait_block_bitmap (sb=sb@entry=0xffff880079a10000,
         block_group=block_group@entry=0,
         bh=bh@entry=0xffff88007bf2b2d8) at balloc.c:476
     #3  0xffffffff81232eaf in ext4_read_block_bitmap (sb=sb@entry=0xffff880079a10000,
         block_group=block_group@entry=0) at balloc.c:489
     #4  0xffffffff81232fc0 in ext4_count_free_clusters (sb=sb@entry=0xffff880079a10000) at balloc.c:665
     #5  0xffffffff81259ffa in ext4_check_descriptors (first_not_zeroed=<synthetic pointer>,
         sb=0xffff880079a10000) at super.c:2143
     #6  ext4_fill_super (sb=sb@entry=0xffff880079a10000, data=<optimized out>,
         data@entry=0x0 <irq_stack_union>, silent=silent@entry=0) at super.c:3851
         ...
    Signed-off-by: default avatarAzat Khuzhin <a3at.mail@gmail.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    00764937
super.c 158 KB