summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-03-09 00:21:56 +0100
committerCarl Hetherington <cth@carlh.net>2021-03-09 00:25:39 +0100
commitb13cbdce2fe1c4790f0737a75ac49aa1b826eb66 (patch)
treef12275db7f6d81bf990808a36330576a517ca839 /src
parentc1fc6c7e573c644013bf65ae5ef474e235466dc0 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/ext4_mkfs.c59
1 files 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;