do_fsck首先调用fsck_init对f2fs_fsxk的一些字段进行初始化。
fsck_init首先对f2fs_fsck的nr_main_blks,main_area_bitmap_sz和main_area_bitmap进行一个初始化,nr_main_blks初始化为f2fs文件系统的main area的block的数量,然后是main_area_bitmap_sz初始化为记录nr_main_blks个block的位图所需的字节大小。最后是分配nr_main_blks个字节大小的空间给main_area_bitmap,并将其置位全部都是0,这个有效位图在后面检查的时候,每次检查到一个块地址时,将其置位为1,但是,如果检查到一个块地址的时候发现已经只为了,说明这个块地址被重复使用。所以,在结束的时候,这个位图会记录所有被用到的块。这个位图正常情况下应该是跟f2fs_sit_map中的位图合并起来是一致的。然后build_nat_area_bitmap对f2fs_fsck的nr_nat_entries、nat_area_bitmap_sz和 nat_area_bitmap以及entries进行初始化。最后build_sit_area_bitmap对f2fs_fsck中的sit_area_bitmap_sz、sit_area_bitmap和check_result中的 sit_valid_blocks、sit_free_segs的初始化。
void fsck_init(struct f2fs_sb_info *sbi)
{
struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
struct f2fs_sm_info *sm_i = SM_I(sbi);
fsck->nr_main_blks = sm_i->main_segments << sbi->log_blocks_per_seg;
fsck->main_area_bitmap_sz = (fsck->nr_main_blks + 7) / 8;
fsck->main_area_bitmap = calloc(fsck->main_area_bitmap_sz, 1);
ASSERT(fsck->main_area_bitmap != NULL);
build_nat_area_bitmap(sbi);
build_sit_area_bitmap(sbi);
ASSERT(tree_mark_size != 0);
tree_mark = calloc(tree_mark_size, 1);
ASSERT(tree_mark != NULL);
}
build_nat_area_bitmap首先对f2fs_fsck的nr_nat_entries、nat_area_bitmap_sz和 nat_area_bitmap进行初始化,nr_nat_entries初始化为f2fs文件系统的f2fs_nat_entry的数量,然后是nat_area_bitmap_sz初始化为记录nr_