|
@@ -3631,6 +3631,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
unsigned int i, start, end;
|
|
|
unsigned int readed, start_blk = 0;
|
|
|
int err = 0;
|
|
|
+ block_t total_node_blocks = 0;
|
|
|
|
|
|
do {
|
|
|
readed = ra_meta_pages(sbi, start_blk, BIO_MAX_PAGES,
|
|
@@ -3653,6 +3654,8 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
if (err)
|
|
|
return err;
|
|
|
seg_info_from_raw_sit(se, &sit);
|
|
|
+ if (IS_NODESEG(se->type))
|
|
|
+ total_node_blocks += se->valid_blocks;
|
|
|
|
|
|
/* build discard map only one time */
|
|
|
if (f2fs_discard_en(sbi)) {
|
|
@@ -3694,11 +3697,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
sit = sit_in_journal(journal, i);
|
|
|
|
|
|
old_valid_blocks = se->valid_blocks;
|
|
|
+ if (IS_NODESEG(se->type))
|
|
|
+ total_node_blocks -= old_valid_blocks;
|
|
|
|
|
|
err = check_block_count(sbi, start, &sit);
|
|
|
if (err)
|
|
|
break;
|
|
|
seg_info_from_raw_sit(se, &sit);
|
|
|
+ if (IS_NODESEG(se->type))
|
|
|
+ total_node_blocks += se->valid_blocks;
|
|
|
|
|
|
if (f2fs_discard_en(sbi)) {
|
|
|
if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) {
|
|
@@ -3717,6 +3724,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
se->valid_blocks - old_valid_blocks;
|
|
|
}
|
|
|
up_read(&curseg->journal_rwsem);
|
|
|
+
|
|
|
+ if (!err && total_node_blocks != valid_node_count(sbi)) {
|
|
|
+ f2fs_msg(sbi->sb, KERN_ERR,
|
|
|
+ "SIT is corrupted node# %u vs %u",
|
|
|
+ total_node_blocks, valid_node_count(sbi));
|
|
|
+ set_sbi_flag(sbi, SBI_NEED_FSCK);
|
|
|
+ err = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|