lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 419/545] f2fs: write checkpoint during FG_GC
    Date
    From: Byungki Lee <dominicus79@gmail.com>

    [ Upstream commit a9163b947ae8f7af7cb8d63606cd87b9facbfe74 ]

    If there's not enough free sections each of which consistis of large segments,
    we can hit no free section for upcoming section allocation. Let's reclaim some
    prefree segments by writing checkpoints.

    Signed-off-by: Byungki Lee <dominicus79@gmail.com>
    Reviewed-by: Chao Yu <chao@kernel.org>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/f2fs/gc.c | 38 +++++++++++++++++++++++---------------
    1 file changed, 23 insertions(+), 15 deletions(-)

    diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
    index 22bb5e07f656..3b53fdebf03d 100644
    --- a/fs/f2fs/gc.c
    +++ b/fs/f2fs/gc.c
    @@ -1741,23 +1741,31 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
    if (sync)
    goto stop;

    - if (has_not_enough_free_secs(sbi, sec_freed, 0)) {
    - if (skipped_round <= MAX_SKIP_GC_COUNT ||
    - skipped_round * 2 < round) {
    - segno = NULL_SEGNO;
    - goto gc_more;
    - }
    + if (!has_not_enough_free_secs(sbi, sec_freed, 0))
    + goto stop;

    - if (first_skipped < last_skipped &&
    - (last_skipped - first_skipped) >
    - sbi->skipped_gc_rwsem) {
    - f2fs_drop_inmem_pages_all(sbi, true);
    - segno = NULL_SEGNO;
    - goto gc_more;
    - }
    - if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED))
    + if (skipped_round <= MAX_SKIP_GC_COUNT || skipped_round * 2 < round) {
    +
    + /* Write checkpoint to reclaim prefree segments */
    + if (free_sections(sbi) < NR_CURSEG_PERSIST_TYPE &&
    + prefree_segments(sbi) &&
    + !is_sbi_flag_set(sbi, SBI_CP_DISABLED)) {
    ret = f2fs_write_checkpoint(sbi, &cpc);
    - }
    + if (ret)
    + goto stop;
    + }
    + segno = NULL_SEGNO;
    + goto gc_more;
    + }
    + if (first_skipped < last_skipped &&
    + (last_skipped - first_skipped) >
    + sbi->skipped_gc_rwsem) {
    + f2fs_drop_inmem_pages_all(sbi, true);
    + segno = NULL_SEGNO;
    + goto gc_more;
    + }
    + if (gc_type == FG_GC && !is_sbi_flag_set(sbi, SBI_CP_DISABLED))
    + ret = f2fs_write_checkpoint(sbi, &cpc);
    stop:
    SIT_I(sbi)->last_victim[ALLOC_NEXT] = 0;
    SIT_I(sbi)->last_victim[FLUSH_DEVICE] = init_segno;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-19 18:38    [W:2.099 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site