clean up some redundant repeat code in build_sit_entries and seperate some logic into new functions: - build_discard_entries - build_sec_entries Note that "if (f2fs_discard_en(sbi))" and "if (sbi->segs_per_sec > 1)" are all taken out of the loops they are unchangable. Signed-off-by: Gao Xiang <gaoxiang25@xxxxxxxxxx> --- fs/f2fs/segment.c | 80 +++++++++++++++++++++++++------------------------------ 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 40e1d20..bcd8a40 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3476,12 +3476,39 @@ static int build_curseg(struct f2fs_sb_info *sbi) return restore_curseg_summaries(sbi); } +static void build_discard_entries(struct f2fs_sb_info *sbi) +{ + unsigned segno; + + for (segno = 0; segno < MAIN_SEGS(sbi); ++segno) { + struct seg_entry *se = get_seg_entry(sbi, segno); + + if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) + memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); + else { + memcpy(se->discard_map, se->cur_valid_map, + SIT_VBLOCK_MAP_SIZE); + + sbi->discard_blks += sbi->blocks_per_seg - + se->valid_blocks; + } + } +} + +static void build_sec_entries(struct f2fs_sb_info *sbi) +{ + unsigned segno; + + for (segno = 0; segno < MAIN_SEGS(sbi); ++segno) + get_sec_entry(sbi, segno)->valid_blocks += + get_seg_entry(sbi, segno)->valid_blocks; +} + static void build_sit_entries(struct f2fs_sb_info *sbi) { struct sit_info *sit_i = SIT_I(sbi); struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA); struct f2fs_journal *journal = curseg->journal; - struct seg_entry *se; struct f2fs_sit_entry sit; int sit_blk_cnt = SIT_BLK_CNT(sbi); unsigned int i, start, end; @@ -3498,67 +3525,34 @@ static void build_sit_entries(struct f2fs_sb_info *sbi) struct f2fs_sit_block *sit_blk; struct page *page; - se = &sit_i->sentries[start]; page = get_current_sit_page(sbi, start); sit_blk = (struct f2fs_sit_block *)page_address(page); sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)]; f2fs_put_page(page, 1); check_block_count(sbi, start, &sit); - seg_info_from_raw_sit(se, &sit); - - /* build discard map only one time */ - if (f2fs_discard_en(sbi)) { - if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { - memset(se->discard_map, 0xff, - SIT_VBLOCK_MAP_SIZE); - } else { - memcpy(se->discard_map, - se->cur_valid_map, - SIT_VBLOCK_MAP_SIZE); - sbi->discard_blks += - sbi->blocks_per_seg - - se->valid_blocks; - } - } - if (sbi->segs_per_sec > 1) - get_sec_entry(sbi, start)->valid_blocks += - se->valid_blocks; + seg_info_from_raw_sit(&sit_i->sentries[start], &sit); } start_blk += readed; } while (start_blk < sit_blk_cnt); down_read(&curseg->journal_rwsem); for (i = 0; i < sits_in_cursum(journal); i++) { - unsigned int old_valid_blocks; - start = le32_to_cpu(segno_in_journal(journal, i)); - se = &sit_i->sentries[start]; sit = sit_in_journal(journal, i); - old_valid_blocks = se->valid_blocks; - check_block_count(sbi, start, &sit); - seg_info_from_raw_sit(se, &sit); - - if (f2fs_discard_en(sbi)) { - if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { - memset(se->discard_map, 0xff, - SIT_VBLOCK_MAP_SIZE); - } else { - memcpy(se->discard_map, se->cur_valid_map, - SIT_VBLOCK_MAP_SIZE); - sbi->discard_blks += old_valid_blocks - - se->valid_blocks; - } - } - - if (sbi->segs_per_sec > 1) - get_sec_entry(sbi, start)->valid_blocks += - se->valid_blocks - old_valid_blocks; + seg_info_from_raw_sit(&sit_i->sentries[start], &sit); } up_read(&curseg->journal_rwsem); + + /* build discard map only one time */ + if (f2fs_discard_en(sbi)) + build_discard_entries(sbi); + + if (sbi->segs_per_sec > 1) + build_sec_entries(sbi); } static void init_free_segmap(struct f2fs_sb_info *sbi) -- 2.1.4