OSDN Git Service

f2fs: open code allocate_segment_by_default
authorChristoph Hellwig <hch@lst.de>
Mon, 28 Nov 2022 09:43:45 +0000 (10:43 +0100)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 8 Dec 2022 17:32:13 +0000 (09:32 -0800)
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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/segment.c

index bbe6556..c4e118e 100644 (file)
@@ -2849,31 +2849,20 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type,
        return 0;
 }
 
-/*
- * 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)
+static bool need_new_seg(struct f2fs_sb_info *sbi, int type)
 {
        struct curseg_info *curseg = CURSEG_I(sbi, type);
 
-       if (force)
-               new_curseg(sbi, type, true);
-       else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
-                                       curseg->seg_type == CURSEG_WARM_NODE)
-               new_curseg(sbi, type, false);
-       else if (curseg->alloc_type == LFS &&
-                       is_next_segment_free(sbi, curseg, type) &&
-                       likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
-               new_curseg(sbi, type, false);
-       else if (f2fs_need_SSR(sbi) &&
-                       get_ssr_segment(sbi, type, SSR, 0))
-               change_curseg(sbi, type, true);
-       else
-               new_curseg(sbi, type, false);
-
-       stat_inc_seg_type(sbi, curseg);
+       if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
+           curseg->seg_type == CURSEG_WARM_NODE)
+               return true;
+       if (curseg->alloc_type == LFS &&
+           is_next_segment_free(sbi, curseg, type) &&
+           likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+               return true;
+       if (!f2fs_need_SSR(sbi) || !get_ssr_segment(sbi, type, SSR, 0))
+               return true;
+       return false;
 }
 
 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,
                return;
 alloc:
        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);
 }
 
@@ -3276,11 +3266,19 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
                update_sit_entry(sbi, old_blkaddr, -1);
 
        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,
                                                AT_SSR, se->mtime);
-               else
-                       allocate_segment_by_default(sbi, type, false);
+               } else {
+                       if (need_new_seg(sbi, type))
+                               new_curseg(sbi, type, false);
+                       else
+                               change_curseg(sbi, type, true);
+                       stat_inc_seg_type(sbi, curseg);
+               }
        }
        /*
         * segment dirty status should be updated after segment allocation,