Commit 8442d94b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jaegeuk Kim

f2fs: open code allocate_segment_by_default

allocate_segment_by_default has just two callers, which use very
different code pathes inside it based on the force paramter.  Just
open code the logic in the two callers using a new helper to decided
if a new segment should be allocated.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 1c8a8ec0
...@@ -2849,31 +2849,20 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type, ...@@ -2849,31 +2849,20 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type,
return 0; return 0;
} }
/* static bool need_new_seg(struct f2fs_sb_info *sbi, int type)
* flush out current segment and replace it with new segment
* This function should be returned with success, otherwise BUG
*/
static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
int type, bool force)
{ {
struct curseg_info *curseg = CURSEG_I(sbi, type); struct curseg_info *curseg = CURSEG_I(sbi, type);
if (force) if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
new_curseg(sbi, type, true);
else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
curseg->seg_type == CURSEG_WARM_NODE) curseg->seg_type == CURSEG_WARM_NODE)
new_curseg(sbi, type, false); return true;
else if (curseg->alloc_type == LFS && if (curseg->alloc_type == LFS &&
is_next_segment_free(sbi, curseg, type) && is_next_segment_free(sbi, curseg, type) &&
likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED))) likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
new_curseg(sbi, type, false); return true;
else if (f2fs_need_SSR(sbi) && if (!f2fs_need_SSR(sbi) || !get_ssr_segment(sbi, type, SSR, 0))
get_ssr_segment(sbi, type, SSR, 0)) return true;
change_curseg(sbi, type, true); return false;
else
new_curseg(sbi, type, false);
stat_inc_seg_type(sbi, curseg);
} }
void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type, void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
...@@ -2926,7 +2915,8 @@ static void __allocate_new_segment(struct f2fs_sb_info *sbi, int type, ...@@ -2926,7 +2915,8 @@ static void __allocate_new_segment(struct f2fs_sb_info *sbi, int type,
return; return;
alloc: alloc:
old_segno = curseg->segno; old_segno = curseg->segno;
allocate_segment_by_default(sbi, type, true); new_curseg(sbi, type, true);
stat_inc_seg_type(sbi, curseg);
locate_dirty_segment(sbi, old_segno); locate_dirty_segment(sbi, old_segno);
} }
...@@ -3276,11 +3266,19 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, ...@@ -3276,11 +3266,19 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
update_sit_entry(sbi, old_blkaddr, -1); update_sit_entry(sbi, old_blkaddr, -1);
if (!__has_curseg_space(sbi, curseg)) { if (!__has_curseg_space(sbi, curseg)) {
if (from_gc) /*
* Flush out current segment and replace it with new segment.
*/
if (from_gc) {
get_atssr_segment(sbi, type, se->type, get_atssr_segment(sbi, type, se->type,
AT_SSR, se->mtime); AT_SSR, se->mtime);
} else {
if (need_new_seg(sbi, type))
new_curseg(sbi, type, false);
else else
allocate_segment_by_default(sbi, type, false); change_curseg(sbi, type, true);
stat_inc_seg_type(sbi, curseg);
}
} }
/* /*
* segment dirty status should be updated after segment allocation, * segment dirty status should be updated after segment allocation,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment