Re: [f2fs-dev] [PATCH 2/3] f2fs: open code allocate_segment_by_default

2022-12-08 Thread Chao Yu

On 2022/11/28 17:43, Christoph Hellwig wrote:

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 


Reviewed-by: Chao Yu 

Thanks,


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


[f2fs-dev] [PATCH 2/3] f2fs: open code allocate_segment_by_default

2022-11-28 Thread Christoph Hellwig
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 
---
 fs/f2fs/segment.c | 50 +++
 1 file changed, 24 insertions(+), 26 deletions(-)

diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 714f9114d9aac0..2e54df1d3feea5 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -2836,31 +2836,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,
@@ -2913,7 +2902,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);
 }
 
@@ -3264,11 +3254,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,
-- 
2.30.2



___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel