@@ -3600,6 +3600,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3600
3600
unsigned int i , start , end ;
3601
3601
unsigned int readed , start_blk = 0 ;
3602
3602
int err = 0 ;
3603
+ block_t total_node_blocks = 0 ;
3603
3604
3604
3605
do {
3605
3606
readed = ra_meta_pages (sbi , start_blk , BIO_MAX_PAGES ,
@@ -3622,6 +3623,8 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3622
3623
if (err )
3623
3624
return err ;
3624
3625
seg_info_from_raw_sit (se , & sit );
3626
+ if (IS_NODESEG (se -> type ))
3627
+ total_node_blocks += se -> valid_blocks ;
3625
3628
3626
3629
/* build discard map only one time */
3627
3630
if (f2fs_discard_en (sbi )) {
@@ -3663,11 +3666,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3663
3666
sit = sit_in_journal (journal , i );
3664
3667
3665
3668
old_valid_blocks = se -> valid_blocks ;
3669
+ if (IS_NODESEG (se -> type ))
3670
+ total_node_blocks -= old_valid_blocks ;
3666
3671
3667
3672
err = check_block_count (sbi , start , & sit );
3668
3673
if (err )
3669
3674
break ;
3670
3675
seg_info_from_raw_sit (se , & sit );
3676
+ if (IS_NODESEG (se -> type ))
3677
+ total_node_blocks += se -> valid_blocks ;
3671
3678
3672
3679
if (f2fs_discard_en (sbi )) {
3673
3680
if (is_set_ckpt_flags (sbi , CP_TRIMMED_FLAG )) {
@@ -3686,6 +3693,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3686
3693
se -> valid_blocks - old_valid_blocks ;
3687
3694
}
3688
3695
up_read (& curseg -> journal_rwsem );
3696
+
3697
+ if (!err && total_node_blocks != valid_node_count (sbi )) {
3698
+ f2fs_msg (sbi -> sb , KERN_ERR ,
3699
+ "SIT is corrupted node# %u vs %u" ,
3700
+ total_node_blocks , valid_node_count (sbi ));
3701
+ set_sbi_flag (sbi , SBI_NEED_FSCK );
3702
+ err = - EINVAL ;
3703
+ }
3704
+
3689
3705
return err ;
3690
3706
}
3691
3707
0 commit comments