@@ -624,7 +624,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
624
624
{
625
625
struct dnode_of_data dn ;
626
626
struct node_info ni ;
627
- unsigned int start , end ;
627
+ unsigned int start = 0 , end = 0 , index ;
628
628
int err = 0 , recovered = 0 ;
629
629
630
630
/* step 1: recover xattr */
@@ -679,7 +679,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
679
679
goto err ;
680
680
}
681
681
682
- for (; start < end ; start ++ , dn .ofs_in_node ++ ) {
682
+ for (index = start ; index < end ; index ++ , dn .ofs_in_node ++ ) {
683
683
block_t src , dest ;
684
684
685
685
src = f2fs_data_blkaddr (& dn );
@@ -708,9 +708,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
708
708
}
709
709
710
710
if (!file_keep_isize (inode ) &&
711
- (i_size_read (inode ) <= ((loff_t )start << PAGE_SHIFT )))
711
+ (i_size_read (inode ) <= ((loff_t )index << PAGE_SHIFT )))
712
712
f2fs_i_size_write (inode ,
713
- (loff_t )(start + 1 ) << PAGE_SHIFT );
713
+ (loff_t )(index + 1 ) << PAGE_SHIFT );
714
714
715
715
/*
716
716
* dest is reserved block, invalidate src block
@@ -765,9 +765,11 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
765
765
err :
766
766
f2fs_put_dnode (& dn );
767
767
out :
768
- f2fs_notice (sbi , "recover_data: ino = %lx (i_size: %s) recovered = %d, err = %d" ,
769
- inode -> i_ino , file_keep_isize (inode ) ? "keep" : "recover" ,
770
- recovered , err );
768
+ f2fs_notice (sbi , "recover_data: ino = %lx, nid = %x (i_size: %s), "
769
+ "range (%u, %u), recovered = %d, err = %d" ,
770
+ inode -> i_ino , nid_of_node (& folio -> page ),
771
+ file_keep_isize (inode ) ? "keep" : "recover" ,
772
+ start , end , recovered , err );
771
773
return err ;
772
774
}
773
775
@@ -778,6 +780,14 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
778
780
int err = 0 ;
779
781
block_t blkaddr ;
780
782
unsigned int ra_blocks = RECOVERY_MAX_RA_BLOCKS ;
783
+ unsigned int recoverable_dnode = 0 ;
784
+ unsigned int fsynced_dnode = 0 ;
785
+ unsigned int total_dnode = 0 ;
786
+ unsigned int recovered_inode = 0 ;
787
+ unsigned int recovered_dentry = 0 ;
788
+ unsigned int recovered_dnode = 0 ;
789
+
790
+ f2fs_notice (sbi , "do_recover_data: start to recover dnode" );
781
791
782
792
/* get node pages in the current segment */
783
793
curseg = CURSEG_I (sbi , CURSEG_WARM_NODE );
@@ -800,10 +810,12 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
800
810
f2fs_folio_put (folio , true);
801
811
break ;
802
812
}
813
+ recoverable_dnode ++ ;
803
814
804
815
entry = get_fsync_inode (inode_list , ino_of_node (& folio -> page ));
805
816
if (!entry )
806
817
goto next ;
818
+ fsynced_dnode ++ ;
807
819
/*
808
820
* inode(x) | CP | inode(x) | dnode(F)
809
821
* In this case, we can lose the latest inode(x).
@@ -815,19 +827,22 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
815
827
f2fs_folio_put (folio , true);
816
828
break ;
817
829
}
830
+ recovered_inode ++ ;
818
831
}
819
832
if (entry -> last_dentry == blkaddr ) {
820
833
err = recover_dentry (entry -> inode , & folio -> page , dir_list );
821
834
if (err ) {
822
835
f2fs_folio_put (folio , true);
823
836
break ;
824
837
}
838
+ recovered_dentry ++ ;
825
839
}
826
840
err = do_recover_data (sbi , entry -> inode , folio );
827
841
if (err ) {
828
842
f2fs_folio_put (folio , true);
829
843
break ;
830
844
}
845
+ recovered_dnode ++ ;
831
846
832
847
if (entry -> blkaddr == blkaddr )
833
848
list_move_tail (& entry -> list , tmp_inode_list );
@@ -840,9 +855,15 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
840
855
f2fs_folio_put (folio , true);
841
856
842
857
f2fs_ra_meta_pages_cond (sbi , blkaddr , ra_blocks );
858
+ total_dnode ++ ;
843
859
}
844
860
if (!err )
845
861
err = f2fs_allocate_new_segments (sbi );
862
+
863
+ f2fs_notice (sbi , "do_recover_data: dnode: (recoverable: %u, fsynced: %u, "
864
+ "total: %u), recovered: (inode: %u, dentry: %u, dnode: %u), err: %d" ,
865
+ recoverable_dnode , fsynced_dnode , total_dnode , recovered_inode ,
866
+ recovered_dentry , recovered_dnode , err );
846
867
return err ;
847
868
}
848
869
@@ -855,6 +876,9 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
855
876
unsigned long s_flags = sbi -> sb -> s_flags ;
856
877
bool need_writecp = false;
857
878
879
+ f2fs_notice (sbi , "f2fs_recover_fsync_data: recovery fsync data, "
880
+ "check_only: %d" , check_only );
881
+
858
882
if (is_sbi_flag_set (sbi , SBI_IS_WRITABLE ))
859
883
f2fs_info (sbi , "recover fsync data on readonly fs" );
860
884
0 commit comments