f2fs系列文章fsck(五)

本文详细介绍了f2fs文件系统错误检查和修复的过程,包括硬链接、Nat条目、Sit区域位图的校验与修复,以及current segment的检查与调整。修复工作涉及fix_hard_links、fix_nat_entries等多个关键函数,确保元数据一致性。
摘要由CSDN通过智能技术生成

    fsck_verify通过前面的检查结果来修正元数据。

    首先是对nid的检查情况进行查看,f2fs_fsck中的nat_area_bitmap从开始的读取f2fs_nat_block中的所有的f2fs_nat_entry来记录所有有效的nid,但是在遍历的过程中在调用sanity_check_nid的时候已经将所有正常的nid都给clear掉了,所以在检查这个位图的时候,如果发现还有些位是有效的,那么证明有错误发生。然后是f2fs_fsck中记录硬链接链表的hard_link_list_head,正常情况下应该是NULL,如果不是,说明也是出错误了。接着f2fs_fsck的main_area_bitmap记录了在遍历过程中所访问到的所有的block,也就是记录了所有的有效块,所以这个理论上应该跟f2fs_fsck的sit_area_bitmap是一致的,所以不一致代表着错误的发生。还有就是f2fs_fsck的check_result的valid_blk_cnt、valid_node_cnt、valid_nat_entry_cnt、valid_inode_cnt、sit_free_segs也要跟发f2fs_checkpoint保持一致。然后是调用check_curseg_offset关于current segment进行检查,next_blkoff对应的block必须是空闲的。对于LFS写的,该segment剩下的block必须全部都是空闲的。另外在遍历过程中对seg_entry的type也是进行了一定的修改,这里也是要与原始的type进行比对。

for (i = 0; i < fsck->nr_nat_entries; i++) {
	if (f2fs_test_bit(i, fsck->nat_area_bitmap) != 0) {
		printf("NID[0x%x] is unreachable\n", i);
		nr_unref_nid++;
	}
}
	
if (fsck->hard_link_list_head != NULL) {
	node = fsck->hard_link_list_head;
	while (node) {
		printf("NID[0x%x] has [0x%x] more unreachable links\n", node->nid, node->links);
		node = node->next;
	}
	c.bug_on = 1;
}

printf("[FSCK] Unreachable nat entries                       ");
if (nr_unref_nid == 0x0) {
	printf(" [Ok..] [0x%x]\n", nr_unref_nid);
} else {
	printf(" [Fail] [0x%x]\n", nr_unref_nid);
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] SIT valid block bitmap checking                ");
if (memcmp(fsck->sit_area_bitmap, fsck->main_area_bitmap, fsck->sit_area_bitmap_sz) == 0x0) {
	printf("[Ok..]\n");
} else {
	printf("[Fail]\n");
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] Hard link checking for regular file           ");
if (fsck->hard_link_list_head == NULL) {
	printf(" [Ok..] [0x%x]\n", fsck->chk.multi_hard_link_files);
} else {
	printf(" [Fail] [0x%x]\n", fsck->chk.multi_hard_link_files);
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] valid_block_count matching with CP            ");
if (sbi->total_valid_block_count == fsck->chk.valid_blk_cnt) {
	printf(" [Ok..] [0x%x]\n", (u32)fsck->chk.valid_blk_cnt);
} else {
	printf(" [Fail] [0x%x]\n", (u32)fsck->chk.valid_blk_cnt);
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] valid_node_count matcing with CP (de lookup)  ");
if (sbi->total_valid_node_count == fsck->chk.valid_node_cnt) {
	printf(" [Ok..] [0x%x]\n", fsck->chk.valid_node_cnt);
} else {
	printf(" [Fail] [0x%x]\n", fsck->chk.valid_node_cnt);
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] valid_node_count matcing with CP (nat lookup) ");
if (sbi->total_valid_node_count == fsck->chk.valid_nat_entry_cnt) {
	printf(" [Ok..] [0x%x]\n", fsck->chk.valid_nat_entry_cnt);
} else {
	printf(" [Fail] [0x%x]\n", fsck->chk.valid_nat_entry_cnt);
	ret = EXIT_ERR_CODE;
	c.bug_on = 1;
}

printf("[FSCK] valid_inode_count matched with CP             ");
if (sbi->total_valid_inode_count == fsck->chk.valid_inode_cnt) {
	printf(" [Ok..] [0x%x]\n", fsck->chk.valid_inode_cnt);
} else {
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值