Centeralize calculation of which blocks are reserved/used for
the superblock and block group descriptors into two functions:
ext2fs_reserve_super_and_bgd, found in lib/ext2fs/alloc_sb.c, and
ext2fs_super_and_bgd_lock, found in lib/ext2fs/close.c.
Change e2fsck/pass1.c (mark_table_blocks), lib/ext2fs/closefs.c
(ext2fs_flush), lib/ext2fs/initialize.c (ext2fs_initialize),
and misc/dumpe2fs.c (list_desc) to use these functions.
e2fsck/ChangeLog
pass1.c (mark_table_blocks): Use the new function
ext2fs_reserve_super_and_bgd to calculate the blocks to be
reserved.
lib/ext2fs/ChangeLog
closefs.c (ext2fs_super_and_bgd_loc): New function which
centralizes the calculation of the superblock and block
group descriptors.
(ext2fs_flush): Use ext2fs_super_and_bgd_lock to figure
out where to write the superblock and block group
descriptors.
alloc_sb.c (ext2fs_reserve_super_and_bgd): New function which
reserves space in the block bitmap using
ext2fs_super_and_bgd_loc.
initialize.c (ext2fs_initialize): Use
ext2fs_reserve_super_and_bgd to initialize the block bitmap.
misc/ChangeLog
dumpe2fs.c (list_desc): Use ext2fs_super_and_bgd_loc to
determine the locations of the superblock and block group
descriptors.
diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c
index 843afff..d1cb750 100644
--- a/lib/ext2fs/initialize.c
+++ b/lib/ext2fs/initialize.c
@@ -73,7 +73,6 @@
int i, j;
blk_t numblocks;
char *buf;
- int meta_bg_size, meta_bg, has_super, old_desc_blocks;
if (!param || !param->s_blocks_count)
return EXT2_ET_INVALID_ARGUMENT;
@@ -310,53 +309,9 @@
*/
group_block = super->s_first_data_block;
super->s_free_blocks_count = 0;
- if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG)
- old_desc_blocks = fs->super->s_first_meta_bg;
- else
- old_desc_blocks = fs->desc_blocks;
for (i = 0; i < fs->group_desc_count; i++) {
- if (i == fs->group_desc_count-1) {
- numblocks = (fs->super->s_blocks_count -
- fs->super->s_first_data_block) %
- fs->super->s_blocks_per_group;
- if (!numblocks)
- numblocks = fs->super->s_blocks_per_group;
- } else
- numblocks = fs->super->s_blocks_per_group;
+ numblocks = ext2fs_reserve_super_and_bgd(fs, i, fs->block_map);
- has_super = ext2fs_bg_has_super(fs, i);
-
- if (has_super) {
- ext2fs_mark_block_bitmap(fs->block_map, group_block);
- numblocks--;
- }
- meta_bg_size = (fs->blocksize /
- sizeof (struct ext2_group_desc));
- meta_bg = i / meta_bg_size;
-
- if (!(fs->super->s_feature_incompat &
- EXT2_FEATURE_INCOMPAT_META_BG) ||
- (meta_bg < fs->super->s_first_meta_bg)) {
- if (has_super) {
- for (j=0; j < old_desc_blocks; j++)
- ext2fs_mark_block_bitmap(fs->block_map,
- group_block + j + 1);
- numblocks -= old_desc_blocks;
- }
- } else {
- if (has_super)
- has_super = 1;
- if (((i % meta_bg_size) == 0) ||
- ((i % meta_bg_size) == 1) ||
- ((i % meta_bg_size) == (meta_bg_size-1))) {
- ext2fs_mark_block_bitmap(fs->block_map,
- group_block + has_super);
- numblocks--;
- }
- }
-
- numblocks -= 2 + fs->inode_blocks_per_group;
-
super->s_free_blocks_count += numblocks;
fs->group_desc[i].bg_free_blocks_count = numblocks;
fs->group_desc[i].bg_free_inodes_count =