@@ -765,7 +765,7 @@ static int build_free_segmap(struct hmfs_sb_info *sbi)
765765}
766766
767767/*
768- *cc23 build_curseg:
768+ *cc23 build_curseg:生成active段缓存信息
769769 *@sbi:指向hmfs超级块信息的实例
770770 *@return:操作正确返回0,否则返回超出内存范围
771771 */
@@ -875,8 +875,15 @@ static void init_free_segmap(struct hmfs_sb_info *sbi)
875875 __set_test_and_inuse (sbi , atomic_read (& curseg_t [i ].segno ));
876876}
877877
878+ /*
879+ *26cc init_dirty_segmap:初始化脏的段的信息
880+ *@sbi:指向hmfs超级块信息的实例
881+ */
878882static void init_dirty_segmap (struct hmfs_sb_info * sbi )
879883{
884+ /*
885+ * 初始化既有有效块又有无效的块的段的实例及信息,活跃的日志段
886+ */
880887 struct dirty_seglist_info * dirty_i = DIRTY_I (sbi );
881888 struct free_segmap_info * free_i = FREE_I (sbi );
882889 struct curseg_info * curseg_t = CURSEG_I (sbi );
@@ -886,32 +893,51 @@ static void init_dirty_segmap(struct hmfs_sb_info *sbi)
886893
887894 while (1 ) {
888895 /* find dirty segmap based on free segmap */
896+ /*
897+ *基于空闲段找到脏的段,同时根据SIT段缓存记录有效块的数量
898+ */
889899 segno = find_next_inuse (free_i , total_segs , offset );
890900 if (segno >= total_segs )
891901 break ;
892902 offset = segno + 1 ;
893903 valid_blocks = get_seg_entry (sbi , segno )-> valid_blocks ;
894904 if (valid_blocks >= HMFS_PAGE_PER_SEG || !valid_blocks )
895905 continue ;
906+ /*
907+ * 同时获取脏的段的bitmap
908+ */
896909 test_and_set_bit (segno , dirty_i -> dirty_segmap );
897910 }
898911
899912 /* Clear the current segments */
913+ /*
914+ *清楚当前脏的段的位图信息
915+ */
900916 for (i = 0 ; i < NR_CURSEG_TYPE ; i ++ )
901917 clear_bit (atomic_read (& curseg_t [i ].segno ), dirty_i -> dirty_segmap );
902918}
903-
919+ /*
920+ *27cc build_dirty_segmap:处理脏的段的位图信息
921+ *@sbi:指向hmfs超级块信息的实例
922+ *@return:异常报错超出内存,正常执行返回0
923+ */
904924static int build_dirty_segmap (struct hmfs_sb_info * sbi )
905925{
906926 struct dirty_seglist_info * dirty_i ;
907927 unsigned int bitmap_size ;
908928
929+ /*
930+ * 回收脏的段所占的空间,同时设置当前脏段的信息
931+ */
909932 dirty_i = kzalloc (sizeof (struct dirty_seglist_info ), GFP_KERNEL );
910933 if (!dirty_i )
911934 return - ENOMEM ;
912935
913936 SM_I (sbi )-> dirty_info = dirty_i ;
914937
938+ /*
939+ * 回收脏的段的位图所占的空间,同时初始化葬断脏段的信息
940+ */
915941 bitmap_size = (BITS_TO_LONGS (TOTAL_SEGS (sbi )) * sizeof (unsigned long ));
916942
917943 dirty_i -> dirty_segmap = kzalloc (bitmap_size , GFP_KERNEL );
@@ -922,32 +948,54 @@ static int build_dirty_segmap(struct hmfs_sb_info *sbi)
922948 init_dirty_segmap (sbi );
923949 return 0 ;
924950}
925-
951+ /*
952+ *cc8 build_segment_manager:处理段管理器的信息
953+ *@sbi:指向hmfs超级块信息的实例
954+ *@return:
955+ */
926956int build_segment_manager (struct hmfs_sb_info * sbi )
927957{
958+ /*
959+ *获取当前超级块的物理地址,同时初始化段管理器的实例
960+ */
928961 struct hmfs_super_block * raw_super = HMFS_RAW_SUPER (sbi );
929962 struct hmfs_sm_info * sm_info ;
930963 int err ;
931964 pgc_t user_segments , main_segments ;
932965
966+ /*
967+ *回收段管理器的内存信息
968+ */
933969 sm_info = kzalloc (sizeof (struct hmfs_sm_info ), GFP_KERNEL );
934970 if (!sm_info )
935971 return - ENOMEM ;
936972
937973 /* init sm info */
974+ /*
975+ * 初始化段管理器的信息,例如段的总数,main area段数
976+ */
938977 sbi -> sm_info = sm_info ;
939978 sm_info -> segment_count = le64_to_cpu (raw_super -> segment_count );
940979 main_segments = le64_to_cpu (raw_super -> segment_count_main );
941980 sm_info -> main_segments = main_segments ;
981+ /*
982+ * main area区预先给user分区的段数和其他段数
983+ */
942984 user_segments = sm_info -> main_segments * (100 - DEF_OP_SEGMENTS ) / 100 ;
943985 sm_info -> ovp_segments = sm_info -> main_segments - user_segments ;
986+ /*
987+ *定义无效的块数的上限以及空闲块的上限,以及在危急情况下空闲块的上限
988+ */
944989 sm_info -> limit_invalid_blocks = main_segments * HMFS_PAGE_PER_SEG
945990 * LIMIT_INVALID_BLOCKS / 100 ;
946991 sm_info -> limit_free_blocks = main_segments * HMFS_PAGE_PER_SEG
947992 * LIMIT_FREE_BLOCKS / 100 ;
948993 sm_info -> severe_free_blocks = main_segments * HMFS_PAGE_PER_SEG
949994 * SEVERE_FREE_BLOCKS / 100 ;
950995
996+ /*
997+ *生成SIT信息,空闲段位图信息等
998+ */
951999 err = build_sit_info (sbi );
9521000 if (err )
9531001 return err ;
@@ -959,6 +1007,9 @@ int build_segment_manager(struct hmfs_sb_info *sbi)
9591007 return err ;
9601008
9611009 /* reinit free segmap based on SIT */
1010+ /*
1011+ * 基于SIT表信息,重新初始化空闲段的位图,脏的段的位图信息
1012+ */
9621013 build_sit_entries (sbi );
9631014
9641015 init_free_segmap (sbi );
@@ -969,84 +1020,142 @@ int build_segment_manager(struct hmfs_sb_info *sbi)
9691020 init_min_max_mtime (sbi );
9701021 return 0 ;
9711022}
972-
1023+ /*
1024+ *cc29 destroy_dirty_segmap:销毁脏的段的位图信息
1025+ *@sbi:指向hmfs超级块信息的实例
1026+ */
9731027static void destroy_dirty_segmap (struct hmfs_sb_info * sbi )
9741028{
1029+ /*
1030+ * 初始化脏段的信息
1031+ */
9751032 struct dirty_seglist_info * dirty_i = DIRTY_I (sbi );
9761033
9771034 if (!dirty_i )
9781035 return ;
9791036
1037+ /*
1038+ * 释放脏段的位图信息,并将脏段的信息置为空
1039+ */
9801040 kfree (dirty_i -> dirty_segmap );
9811041
9821042 SM_I (sbi )-> dirty_info = NULL ;
9831043 kfree (dirty_i );
9841044}
9851045
1046+ /*
1047+ *cc30 destroy_curseg:销毁当前active的段信息
1048+ *@sbi:指向hmfs超级块信息的实例
1049+ */
9861050static void destroy_curseg (struct hmfs_sb_info * sbi )
9871051{
9881052 struct curseg_info * array = SM_I (sbi )-> curseg_array ;
9891053
9901054 if (!array )
9911055 return ;
1056+ /*
1057+ *将脏的active段置为空
1058+ */
9921059 SM_I (sbi )-> curseg_array = NULL ;
9931060 kfree (array );
9941061}
1062+ /*
1063+ *31cc destroy_free_segmap:
1064+ *@sbi:指向hmfs超级块信息的实例
1065+ */
9951066
9961067static void destroy_free_segmap (struct hmfs_sb_info * sbi )
9971068{
9981069 struct free_segmap_info * free_i = SM_I (sbi )-> free_info ;
9991070
10001071 if (!free_i )
10011072 return ;
1073+ /*
1074+ * 释放空段及预分配的空段的信息
1075+ */
1076+
10021077 SM_I (sbi )-> free_info = NULL ;
10031078 kfree (free_i -> free_segmap );
10041079 kfree (free_i -> prefree_segmap );
10051080 kfree (free_i );
10061081}
1082+ /*
1083+ * cc32 destroy_sit_info:
1084+ * @sbi:指向hmfs超级块信息的实例
1085+ */
10071086
10081087static void destroy_sit_info (struct hmfs_sb_info * sbi )
10091088{
1089+ /*
1090+ *获取SIT信息表的实例
1091+ */
10101092 struct sit_info * sit_i = SIT_I (sbi );
10111093
10121094 if (!sit_i )
10131095 return ;
10141096
1097+ /*
1098+ * 释放SIT表的段缓存对象和entry位图对象,同时将SIT信息表内容置为空
1099+ */
10151100 vfree (sit_i -> sentries );
10161101 kfree (sit_i -> dirty_sentries_bitmap );
10171102
10181103 SM_I (sbi )-> sit_info = NULL ;
10191104 kfree (sit_i );
10201105}
1106+ /*
1107+ *cc33: destroy_segment_manager:释放段管理器
1108+ *@sbi:指向hmfs超级块信息的实例
1109+ */
10211110
10221111void destroy_segment_manager (struct hmfs_sb_info * sbi )
10231112{
10241113 struct hmfs_sm_info * sm_info = SM_I (sbi );
10251114
1115+ /*
1116+ * 释放段管理器,同时将段管理器的信息置为空
1117+ */
10261118 destroy_dirty_segmap (sbi );
10271119 destroy_curseg (sbi );
10281120 destroy_free_segmap (sbi );
10291121 destroy_sit_info (sbi );
10301122 sbi -> sm_info = NULL ;
10311123 kfree (sm_info );
10321124}
1125+ /*
1126+ * cc34:get_summary_block:返回指定块的entry的入口地址
1127+ * @sbi:指向hmfs超级块信息的实例
1128+ * @return:返回入口地址
1129+ */
10331130
10341131struct hmfs_summary_block * get_summary_block (struct hmfs_sb_info * sbi ,
10351132 seg_t segno )
10361133{
1134+ /*
1135+ *总结块,获取SSA entry块的地址
1136+ */
10371137 struct hmfs_summary_block * summary_blk ;
10381138
10391139 summary_blk = HMFS_SUMMARY_BLOCK (sbi -> ssa_entries );
10401140 return & summary_blk [segno ];
10411141}
10421142
1143+ /*
1144+ *cc35: get_summary_by_addr
1145+ *@sbi:指向hmfs超级块信息的实例
1146+ *@blk_addr
1147+ *@return:返回主存开始地址
1148+ */
10431149struct hmfs_summary * get_summary_by_addr (struct hmfs_sb_info * sbi ,
10441150 block_t blk_addr )
10451151{
10461152 seg_t segno ;
10471153 unsigned int blkoff ;
10481154 struct hmfs_summary_block * summary_blk = NULL ;
10491155
1156+ /*
1157+ *根据当前超级块的SSA入口地址
1158+ */
10501159 segno = GET_SEGNO (sbi , blk_addr );
10511160 blkoff = GET_SEG_OFS (sbi , blk_addr );
10521161 summary_blk = get_summary_block (sbi , segno );
0 commit comments