struct ext4_group_desc *gdp);
 extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group,
                                     struct ext4_group_desc *gdp);
+extern int ext4_register_li_request(struct super_block *sb,
+                                   ext4_group_t first_not_zeroed);
 
 static inline int ext4_has_group_desc_csum(struct super_block *sb)
 {
 
                if (err == 0)
                        err = err2;
                mnt_drop_write_file(filp);
+               if (!err && ext4_has_group_desc_csum(sb) &&
+                   test_opt(sb, INIT_INODE_TABLE))
+                       err = ext4_register_li_request(sb, input.group);
 group_add_out:
                ext4_resize_end(sb);
                return err;
                ext4_fsblk_t n_blocks_count;
                struct super_block *sb = inode->i_sb;
                int err = 0, err2 = 0;
+               ext4_group_t o_group = EXT4_SB(sb)->s_groups_count;
 
                if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
                               EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
                if (err == 0)
                        err = err2;
                mnt_drop_write_file(filp);
+               if (!err && (o_group > EXT4_SB(sb)->s_groups_count) &&
+                   ext4_has_group_desc_csum(sb) &&
+                   test_opt(sb, INIT_INODE_TABLE))
+                       err = ext4_register_li_request(sb, o_group);
+
 resizefs_out:
                ext4_resize_end(sb);
                return err;
 
                group_data[i].blocks_count = blocks_per_group;
                overhead = ext4_group_overhead_blocks(sb, group + i);
                group_data[i].free_blocks_count = blocks_per_group - overhead;
-               if (ext4_has_group_desc_csum(sb))
+               if (ext4_has_group_desc_csum(sb)) {
                        flex_gd->bg_flags[i] = EXT4_BG_BLOCK_UNINIT |
                                               EXT4_BG_INODE_UNINIT;
-               else
+                       if (!test_opt(sb, INIT_INODE_TABLE))
+                               flex_gd->bg_flags[i] |= EXT4_BG_INODE_ZEROED;
+               } else
                        flex_gd->bg_flags[i] = EXT4_BG_INODE_ZEROED;
        }
 
 
        err = ext4_alloc_flex_bg_array(sb, input->group + 1);
        if (err)
-               return err;
+               goto out;
 
        err = ext4_mb_alloc_groupinfo(sb, input->group + 1);
        if (err)
 
                        break;
        }
 
-       if (group == ngroups)
+       if (group >= ngroups)
                ret = 1;
 
        if (!ret) {
        return elr;
 }
 
-static int ext4_register_li_request(struct super_block *sb,
-                                   ext4_group_t first_not_zeroed)
+int ext4_register_li_request(struct super_block *sb,
+                            ext4_group_t first_not_zeroed)
 {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
-       struct ext4_li_request *elr;
+       struct ext4_li_request *elr = NULL;
        ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
        int ret = 0;
 
+       mutex_lock(&ext4_li_mtx);
        if (sbi->s_li_request != NULL) {
                /*
                 * Reset timeout so it can be computed again, because
                 * s_li_wait_mult might have changed.
                 */
                sbi->s_li_request->lr_timeout = 0;
-               return 0;
+               goto out;
        }
 
        if (first_not_zeroed == ngroups ||
            (sb->s_flags & MS_RDONLY) ||
            !test_opt(sb, INIT_INODE_TABLE))
-               return 0;
+               goto out;
 
        elr = ext4_li_request_new(sb, first_not_zeroed);
-       if (!elr)
-               return -ENOMEM;
-
-       mutex_lock(&ext4_li_mtx);
+       if (!elr) {
+               ret = -ENOMEM;
+               goto out;
+       }
 
        if (NULL == ext4_li_info) {
                ret = ext4_li_info_new();