Skip to content

Commit

Permalink
f2fs: refactor f2fs_gc to call checkpoint in urgent condition
Browse files Browse the repository at this point in the history
The major change is to call checkpoint, if there's not enough space while having
some prefree segments in FG_GC case.

Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
  • Loading branch information
Jaegeuk Kim committed Apr 18, 2023
1 parent 635a52d commit 2d3f197
Showing 1 changed file with 13 additions and 14 deletions.
27 changes: 13 additions & 14 deletions fs/f2fs/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1829,7 +1829,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
goto stop;
}

if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) {
/* Let's run FG_GC, if we don't have enough space. */
if (has_not_enough_free_secs(sbi, 0, 0)) {
gc_type = FG_GC;

/*
* For example, if there are many prefree_segments below given
* threshold, we can make them free by checkpoint. Then, we
Expand All @@ -1840,8 +1843,6 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
if (ret)
goto stop;
}
if (has_not_enough_free_secs(sbi, 0, 0))
gc_type = FG_GC;
}

/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
Expand All @@ -1868,19 +1869,15 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
if (seg_freed == f2fs_usable_segs_in_sec(sbi, segno))
sec_freed++;

if (gc_type == FG_GC)
if (gc_type == FG_GC) {
sbi->cur_victim_sec = NULL_SEGNO;

if (gc_control->init_gc_type == FG_GC ||
!has_not_enough_free_secs(sbi,
(gc_type == FG_GC) ? sec_freed : 0, 0)) {
if (gc_type == FG_GC && sec_freed < gc_control->nr_free_secs)
goto go_gc_more;
goto stop;
}

/* FG_GC stops GC by skip_count */
if (gc_type == FG_GC) {
if (!has_not_enough_free_secs(sbi, sec_freed, 0)) {
if (!gc_control->no_bg_gc &&
sec_freed < gc_control->nr_free_secs)
goto go_gc_more;
goto stop;
}
if (sbi->skipped_gc_rwsem)
skipped_round++;
round++;
Expand All @@ -1889,6 +1886,8 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
ret = f2fs_write_checkpoint(sbi, &cpc);
goto stop;
}
} else if (!has_not_enough_free_secs(sbi, 0, 0)) {
goto stop;
}

__get_secs_required(sbi, NULL, &upper_secs, NULL);
Expand Down

0 comments on commit 2d3f197

Please sign in to comment.