f2fs: refactor next blk selection
authorChristoph Hellwig <hch@lst.de>
Thu, 19 Jan 2023 06:36:24 +0000 (07:36 +0100)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 2 Feb 2023 21:37:16 +0000 (13:37 -0800)
Remove __refresh_next_blkoff by opencoding the SSR vs LFS segment check
in the only caller, and then add helpers for SSR block selection and
blkoff randomization instead.

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 55720251755ead81d5906141c15ae619e4fd588a..14a9651e4f317352ab930b70251ba350ab3bd9be 100644 (file)
@@ -2632,30 +2632,10 @@ static int __next_free_blkoff(struct f2fs_sb_info *sbi,
        return __find_rev_next_zero_bit(target_map, sbi->blocks_per_seg, start);
 }
 
-/*
- * If a segment is written by LFS manner, next block offset is just obtained
- * by increasing the current block offset. However, if a segment is written by
- * SSR manner, next block offset obtained by calling __next_free_blkoff
- */
-static void __refresh_next_blkoff(struct f2fs_sb_info *sbi,
-                               struct curseg_info *seg)
+static int f2fs_find_next_ssr_block(struct f2fs_sb_info *sbi,
+               struct curseg_info *seg)
 {
-       if (seg->alloc_type == SSR) {
-               seg->next_blkoff =
-                       __next_free_blkoff(sbi, seg->segno,
-                                               seg->next_blkoff + 1);
-       } else {
-               seg->next_blkoff++;
-               if (F2FS_OPTION(sbi).fs_mode == FS_MODE_FRAGMENT_BLK) {
-                       /* To allocate block chunks in different sizes, use random number */
-                       if (--seg->fragment_remained_chunk <= 0) {
-                               seg->fragment_remained_chunk =
-                                  get_random_u32_inclusive(1, sbi->max_fragment_chunk);
-                               seg->next_blkoff +=
-                                  get_random_u32_inclusive(1, sbi->max_fragment_hole);
-                       }
-               }
-       }
+       return __next_free_blkoff(sbi, seg->segno, seg->next_blkoff + 1);
 }
 
 bool f2fs_segment_has_free_slot(struct f2fs_sb_info *sbi, int segno)
@@ -3232,6 +3212,19 @@ static int __get_segment_type(struct f2fs_io_info *fio)
        return type;
 }
 
+static void f2fs_randomize_chunk(struct f2fs_sb_info *sbi,
+               struct curseg_info *seg)
+{
+       /* To allocate block chunks in different sizes, use random number */
+       if (--seg->fragment_remained_chunk > 0)
+               return;
+
+       seg->fragment_remained_chunk =
+               get_random_u32_inclusive(1, sbi->max_fragment_chunk);
+       seg->next_blkoff +=
+               get_random_u32_inclusive(1, sbi->max_fragment_hole);
+}
+
 void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
                block_t old_blkaddr, block_t *new_blkaddr,
                struct f2fs_summary *sum, int type,
@@ -3261,8 +3254,13 @@ void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
        f2fs_wait_discard_bio(sbi, *new_blkaddr);
 
        curseg->sum_blk->entries[curseg->next_blkoff] = *sum;
-       __refresh_next_blkoff(sbi, curseg);
-
+       if (curseg->alloc_type == SSR) {
+               curseg->next_blkoff = f2fs_find_next_ssr_block(sbi, curseg);
+       } else {
+               curseg->next_blkoff++;
+               if (F2FS_OPTION(sbi).fs_mode == FS_MODE_FRAGMENT_BLK)
+                       f2fs_randomize_chunk(sbi, curseg);
+       }
        stat_inc_block_count(sbi, curseg);
 
        if (from_gc) {