From b13cbdce2fe1c4790f0737a75ac49aa1b826eb66 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 9 Mar 2021 00:21:56 +0100 Subject: [PATCH] Write block/inode bitmaps and inode tables earlier. Before we would write blank block/inode bitmap tables then fill them in later. This is a bit of a hack to set up enough of the data structures (I think) to allow the correct block/inode bitmaps to be written first time. This may not be worth the hack/risk - I haven't tested the speed improvement carefully. --- src/ext4_mkfs.c | 59 +++++++++++-------------------------------------- 1 file changed, 13 insertions(+), 46 deletions(-) diff --git a/src/ext4_mkfs.c b/src/ext4_mkfs.c index b792eb5..123a38d 100644 --- a/src/ext4_mkfs.c +++ b/src/ext4_mkfs.c @@ -298,7 +298,7 @@ static void fill_sb(struct fs_aux_info *aux_info, struct ext4_mkfs_info *info) } -static int write_bgroups(struct ext4_blockdev *bd, struct fs_aux_info *aux_info, +static int write_bgroups(struct ext4_fs *fs, struct ext4_blockdev *bd, struct fs_aux_info *aux_info, struct ext4_mkfs_info *info) { /* size of the group descriptor */ @@ -402,32 +402,17 @@ static int write_bgroups(struct ext4_blockdev *bd, struct fs_aux_info *aux_info, blk_off += aux_info->bg_desc_blocks; - /* Empty block bitmap */ - r = ext4_block_get_noread(bd, &b, bg_start_block + blk_off + 1); - if (r != EOK) { - free(all_bg_desc); - return r; - } - memset(b.data, 0, block_size); - ext4_bcache_set_dirty(b.buf); - r = ext4_block_set(bd, &b); + struct ext4_block_group_ref ref; + r = ext4_fs_get_block_group_ref(fs, i, &ref); if (r != EOK) { free(all_bg_desc); - return r; + break; } - /* Empty inode bitmap */ - r = ext4_block_get_noread(bd, &b, bg_start_block + blk_off + 2); - if (r != EOK) { - free(all_bg_desc); - return r; - } - memset(b.data, 0, block_size); - ext4_bcache_set_dirty(b.buf); - r = ext4_block_set(bd, &b); + r = ext4_fs_put_block_group_ref(&ref); if (r != EOK) { free(all_bg_desc); - return r; + break; } } @@ -491,7 +476,7 @@ Finish: return r; } -static int mkfs_init(struct ext4_blockdev *bd, struct ext4_mkfs_info *info) +static int mkfs_init(struct ext4_fs *fs, struct ext4_blockdev *bd, struct ext4_mkfs_info *info) { int r; struct fs_aux_info aux_info; @@ -502,8 +487,9 @@ static int mkfs_init(struct ext4_blockdev *bd, struct ext4_mkfs_info *info) goto Finish; fill_sb(&aux_info, info); + memcpy(&fs->sb, aux_info.sb, sizeof(struct ext4_sblock)); - r = write_bgroups(bd, &aux_info, info); + r = write_bgroups(fs, bd, &aux_info, info); if (r != EOK) goto Finish; @@ -516,24 +502,6 @@ static int mkfs_init(struct ext4_blockdev *bd, struct ext4_mkfs_info *info) return r; } -static int init_bgs(struct ext4_fs *fs) -{ - int r = EOK; - struct ext4_block_group_ref ref; - uint32_t i; - uint32_t bg_count = ext4_block_group_cnt(&fs->sb); - for (i = 0; i < bg_count; ++i) { - r = ext4_fs_get_block_group_ref(fs, i, &ref); - if (r != EOK) - break; - - r = ext4_fs_put_block_group_ref(&ref); - if (r != EOK) - break; - } - return r; -} - static int alloc_inodes(struct ext4_fs *fs) { int r = EOK; @@ -826,7 +794,10 @@ int ext4_mkfs(struct ext4_fs *fs, struct ext4_blockdev *bd, if (r != EOK) goto cache_fini; - r = mkfs_init(bd, info); + fs->bdev = bd; + fs->read_only = false; + + r = mkfs_init(fs, bd, info); if (r != EOK) goto cache_fini; @@ -834,10 +805,6 @@ int ext4_mkfs(struct ext4_fs *fs, struct ext4_blockdev *bd, if (r != EOK) goto cache_fini; - r = init_bgs(fs); - if (r != EOK) - goto fs_fini; - r = alloc_inodes(fs); if (r != EOK) goto fs_fini; -- 2.30.2