Skip to content

Commit 314080a

Browse files
committed
'15functiondone'
1 parent 41c3b51 commit 314080a

File tree

1 file changed

+113
-4
lines changed

1 file changed

+113
-4
lines changed

fs/hmfs/segment.c

Lines changed: 113 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
*/
878882
static 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+
*/
904924
static 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+
*/
926956
int 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+
*/
9731027
static 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+
*/
9861050
static 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

9961067
static 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

10081087
static 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

10221111
void 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

10341131
struct 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+
*/
10431149
struct 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

Comments
 (0)