@@ -3631,6 +3631,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3631
3631
unsigned int i , start , end ;
3632
3632
unsigned int readed , start_blk = 0 ;
3633
3633
int err = 0 ;
3634
+ block_t total_node_blocks = 0 ;
3634
3635
3635
3636
do {
3636
3637
readed = ra_meta_pages (sbi , start_blk , BIO_MAX_PAGES ,
@@ -3653,6 +3654,8 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3653
3654
if (err )
3654
3655
return err ;
3655
3656
seg_info_from_raw_sit (se , & sit );
3657
+ if (IS_NODESEG (se -> type ))
3658
+ total_node_blocks += se -> valid_blocks ;
3656
3659
3657
3660
/* build discard map only one time */
3658
3661
if (f2fs_discard_en (sbi )) {
@@ -3694,11 +3697,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3694
3697
sit = sit_in_journal (journal , i );
3695
3698
3696
3699
old_valid_blocks = se -> valid_blocks ;
3700
+ if (IS_NODESEG (se -> type ))
3701
+ total_node_blocks -= old_valid_blocks ;
3697
3702
3698
3703
err = check_block_count (sbi , start , & sit );
3699
3704
if (err )
3700
3705
break ;
3701
3706
seg_info_from_raw_sit (se , & sit );
3707
+ if (IS_NODESEG (se -> type ))
3708
+ total_node_blocks += se -> valid_blocks ;
3702
3709
3703
3710
if (f2fs_discard_en (sbi )) {
3704
3711
if (is_set_ckpt_flags (sbi , CP_TRIMMED_FLAG )) {
@@ -3717,6 +3724,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
3717
3724
se -> valid_blocks - old_valid_blocks ;
3718
3725
}
3719
3726
up_read (& curseg -> journal_rwsem );
3727
+
3728
+ if (!err && total_node_blocks != valid_node_count (sbi )) {
3729
+ f2fs_msg (sbi -> sb , KERN_ERR ,
3730
+ "SIT is corrupted node# %u vs %u" ,
3731
+ total_node_blocks , valid_node_count (sbi ));
3732
+ set_sbi_flag (sbi , SBI_NEED_FSCK );
3733
+ err = - EINVAL ;
3734
+ }
3735
+
3720
3736
return err ;
3721
3737
}
3722
3738
0 commit comments