- // N.B. a block group can have no more than nblocks_per_group blocks
- ngroups = div_roundup(nblocks - first_data_block, nblocks_per_group);
- if (0 == ngroups)
- bb_error_msg_and_die("ngroups");
- gdtsz = div_roundup(ngroups, EXT2_DESC_PER_BLOCK(sb));
- /*
- * From e2fsprogs: Calculate the number of GDT blocks to reserve for online
- * filesystem growth.
- * The absolute maximum number of GDT blocks we can reserve is determined by
- * the number of block pointers that can fit into a single block.
- */
- /* We set it at 1024x the current filesystem size, or
- * the upper block count limit (2^32), whichever is lower.
- */
-#if ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT
- rgdtsz = 0xFFFFFFFF; // maximum block number
- if (nblocks < rgdtsz / 1024)
- rgdtsz = nblocks * 1024;
- rgdtsz = div_roundup(rgdtsz - first_data_block, nblocks_per_group);
- rgdtsz = div_roundup(rgdtsz, EXT2_DESC_PER_BLOCK(sb)) - gdtsz;
- if (rgdtsz > EXT2_ADDR_PER_BLOCK(sb))
- rgdtsz = EXT2_ADDR_PER_BLOCK(sb);
- sb->s_reserved_gdt_blocks = rgdtsz;
- //bb_info_msg("RSRVD[%u]", n);
-#else
- rgdtsz = 0;
-#endif
-
- // ninodes is the total number of inodes (files) in the file system
- if (!(opts & OPT_i)) {
- bytes_per_inode = 16384;
- if (nblocks < 512*1024)
- bytes_per_inode = 4096;
- if (nblocks < 3*1024)
- bytes_per_inode = 8192;
- }
- ninodes = nblocks / (bytes_per_inode / blocksize);
- if (ninodes < EXT2_GOOD_OLD_FIRST_INO+1)
- ninodes = EXT2_GOOD_OLD_FIRST_INO+1;
- ninodes_per_group = div_roundup(ninodes, ngroups);
- if (ninodes_per_group < 16)
- ninodes_per_group = 16; // minimum number because the first 10 are reserved
- // N.B. a block group can have no more than 8*blocksize = sb->s_inodes_per_group inodes
- if (ninodes_per_group > sb->s_inodes_per_group)
- ninodes_per_group = sb->s_inodes_per_group;
- // adjust inodes per group so they completely fill the inode table blocks in the descriptor
- ninodes_per_group = ((div_roundup(ninodes_per_group * EXT2_INODE_SIZE(sb), blocksize) * blocksize) / EXT2_INODE_SIZE(sb));
- // make sure the number of inodes per group is a multiple of 8
- ninodes_per_group &= ~7;
- sb->s_inodes_per_group = ninodes_per_group;// = div_roundup(ninodes_per_group * sb->s_inode_size, blocksize);
- // total ninodes
- ninodes = sb->s_inodes_count = ninodes_per_group * ngroups;
-
- itsz = ninodes_per_group * sb->s_inode_size / blocksize;
- sb->s_free_inodes_count = sb->s_inodes_count - EXT2_GOOD_OLD_FIRST_INO;
-
- // write the label, if any
- if (opts & OPT_L)
- safe_strncpy((char *)sb->s_volume_name, label, sizeof(sb->s_volume_name));
-
- // fill group descriptors
- gd = xzalloc((gdtsz + rgdtsz) * blocksize);