From: Byungki Lee <[email protected]>

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 <[email protected]>
Signed-off-by: Jaegeuk Kim <[email protected]>
---
 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 eddd2e81a2a2..4d47723523c3 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -1841,23 +1841,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.36.0.464.gb9c8b46e94-goog



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to