From 6d50a758230e08e6b7ef8f277bb5f4271cd083cb Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Fri, 10 Feb 2023 13:02:23 -0800 Subject: [PATCH] f2fs-tools: fix # of total segments TOTAL_SEGS should include metadata segments and main segments. Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim --- fsck/f2fs.h | 2 +- fsck/fsck.c | 4 ++-- fsck/mount.c | 26 +++++++++++++------------- fsck/resize.c | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fsck/f2fs.h b/fsck/f2fs.h index 703f340..e65644e 100644 --- a/fsck/f2fs.h +++ b/fsck/f2fs.h @@ -463,6 +463,7 @@ static inline block_t __end_block_addr(struct f2fs_sb_info *sbi) #define GET_R2L_SEGNO(sbi, segno) (segno + FREE_I_START_SEGNO(sbi)) #define MAIN_SEGS(sbi) (SM_I(sbi)->main_segments) +#define TOTAL_SEGS(sbi) (SM_I(sbi)->segment_count) #define TOTAL_BLKS(sbi) (TOTAL_SEGS(sbi) << (sbi)->log_blocks_per_seg) #define MAX_BLKADDR(sbi) (SEG0_BLKADDR(sbi) + TOTAL_BLKS(sbi)) @@ -511,7 +512,6 @@ struct fsync_inode_entry { ((segno) % sit_i->sents_per_block) #define SIT_BLOCK_OFFSET(sit_i, segno) \ ((segno) / SIT_ENTRY_PER_BLOCK) -#define TOTAL_SEGS(sbi) (SM_I(sbi)->main_segments) static inline bool IS_VALID_NID(struct f2fs_sb_info *sbi, u32 nid) { diff --git a/fsck/fsck.c b/fsck/fsck.c index df91c82..1b6f2c2 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -2064,7 +2064,7 @@ int fsck_chk_meta(struct f2fs_sb_info *sbi) unsigned int i; /* 1. check sit usage with CP: curseg is lost? */ - for (i = 0; i < TOTAL_SEGS(sbi); i++) { + for (i = 0; i < MAIN_SEGS(sbi); i++) { se = get_seg_entry(sbi, i); if (se->valid_blocks != 0) sit_valid_segs++; @@ -2607,7 +2607,7 @@ int check_sit_types(struct f2fs_sb_info *sbi) unsigned int i; int err = 0; - for (i = 0; i < TOTAL_SEGS(sbi); i++) { + for (i = 0; i < MAIN_SEGS(sbi); i++) { struct seg_entry *se; se = get_seg_entry(sbi, i); diff --git a/fsck/mount.c b/fsck/mount.c index 1a65b05..1d0df88 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -81,7 +81,7 @@ unsigned int get_usable_seg_count(struct f2fs_sb_info *sbi) { unsigned int i, usable_seg_count = 0; - for (i = 0; i < TOTAL_SEGS(sbi); i++) + for (i = 0; i < MAIN_SEGS(sbi); i++) if (is_usable_seg(sbi, i)) usable_seg_count++; @@ -97,7 +97,7 @@ bool is_usable_seg(struct f2fs_sb_info *UNUSED(sbi), unsigned int UNUSED(segno)) unsigned int get_usable_seg_count(struct f2fs_sb_info *sbi) { - return TOTAL_SEGS(sbi); + return MAIN_SEGS(sbi); } #endif @@ -106,7 +106,7 @@ u32 get_free_segments(struct f2fs_sb_info *sbi) { u32 i, free_segs = 0; - for (i = 0; i < TOTAL_SEGS(sbi); i++) { + for (i = 0; i < MAIN_SEGS(sbi); i++) { struct seg_entry *se = get_seg_entry(sbi, i); if (se->valid_blocks == 0x0 && !IS_CUR_SEGNO(sbi, i) && @@ -1829,13 +1829,13 @@ int build_sit_info(struct f2fs_sb_info *sbi) SM_I(sbi)->sit_info = sit_i; - sit_i->sentries = calloc(TOTAL_SEGS(sbi) * sizeof(struct seg_entry), 1); + sit_i->sentries = calloc(MAIN_SEGS(sbi) * sizeof(struct seg_entry), 1); if (!sit_i->sentries) { MSG(1, "\tError: Calloc failed for build_sit_info!\n"); goto free_sit_info; } - bitmap_size = TOTAL_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE; + bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE; if (need_fsync_data_record(sbi)) bitmap_size += bitmap_size; @@ -1848,7 +1848,7 @@ int build_sit_info(struct f2fs_sb_info *sbi) bitmap = sit_i->bitmap; - for (start = 0; start < TOTAL_SEGS(sbi); start++) { + for (start = 0; start < MAIN_SEGS(sbi); start++) { sit_i->sentries[start].cur_valid_map = bitmap; bitmap += SIT_VBLOCK_MAP_SIZE; @@ -2100,7 +2100,7 @@ static int build_curseg(struct f2fs_sb_info *sbi) blk_off = get_cp(cur_node_blkoff[i - CURSEG_HOT_NODE]); segno = get_cp(cur_node_segno[i - CURSEG_HOT_NODE]); } - ASSERT(segno < TOTAL_SEGS(sbi)); + ASSERT(segno < MAIN_SEGS(sbi)); ASSERT(blk_off < DEFAULT_BLOCKS_PER_SEGMENT); array[i].segno = segno; @@ -2462,7 +2462,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) segno = start_blk * sit_i->sents_per_block; end = (start_blk + readed) * sit_i->sents_per_block; - for (; segno < end && segno < TOTAL_SEGS(sbi); segno++) { + for (; segno < end && segno < MAIN_SEGS(sbi); segno++) { se = &sit_i->sentries[segno]; get_current_sit_page(sbi, segno, sit_blk); @@ -2488,7 +2488,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) for (i = 0; i < sits_in_cursum(journal); i++) { segno = le32_to_cpu(segno_in_journal(journal, i)); - if (segno >= TOTAL_SEGS(sbi)) { + if (segno >= MAIN_SEGS(sbi)) { MSG(0, "\tError: build_sit_entries: segno(%u) is invalid!!!\n", segno); journal->n_sits = cpu_to_le16(i); c.fix_on = 1; @@ -2565,7 +2565,7 @@ void build_sit_area_bitmap(struct f2fs_sb_info *sbi) ASSERT(fsck->sit_area_bitmap_sz == fsck->main_area_bitmap_sz); - for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) { + for (segno = 0; segno < MAIN_SEGS(sbi); segno++) { se = get_seg_entry(sbi, segno); memcpy(ptr, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE); @@ -2611,7 +2611,7 @@ void rewrite_sit_area_bitmap(struct f2fs_sb_info *sbi) ptr = fsck->main_area_bitmap; - for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) { + for (segno = 0; segno < MAIN_SEGS(sbi); segno++) { struct f2fs_sit_entry *sit; struct seg_entry *se; u16 valid_blocks = 0; @@ -2734,7 +2734,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi) sit_blk = calloc(BLOCK_SZ, 1); ASSERT(sit_blk); /* update free segments */ - for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) { + for (segno = 0; segno < MAIN_SEGS(sbi); segno++) { struct f2fs_sit_entry *sit; struct seg_entry *se; @@ -3440,7 +3440,7 @@ static int find_fsync_inode(struct f2fs_sb_info *sbi, struct list_head *head) struct f2fs_node *node_blk; block_t blkaddr; unsigned int loop_cnt = 0; - unsigned int free_blocks = TOTAL_SEGS(sbi) * sbi->blocks_per_seg - + unsigned int free_blocks = MAIN_SEGS(sbi) * sbi->blocks_per_seg - sbi->total_valid_block_count; int err = 0; diff --git a/fsck/resize.c b/fsck/resize.c index c545dd9..2fd3941 100644 --- a/fsck/resize.c +++ b/fsck/resize.c @@ -175,7 +175,7 @@ static void migrate_main(struct f2fs_sb_info *sbi, unsigned int offset) ASSERT(raw != NULL); - for (i = TOTAL_SEGS(sbi) - 1; i >= 0; i--) { + for (i = MAIN_SEGS(sbi) - 1; i >= 0; i--) { se = get_seg_entry(sbi, i); if (!se->valid_blocks) continue; @@ -240,7 +240,7 @@ static void migrate_ssa(struct f2fs_sb_info *sbi, block_t new_sum_blkaddr = get_newsb(ssa_blkaddr); block_t end_sum_blkaddr = get_newsb(main_blkaddr); block_t expand_sum_blkaddr = new_sum_blkaddr + - TOTAL_SEGS(sbi) - offset; + MAIN_SEGS(sbi) - offset; block_t blkaddr; int ret; void *zero_block = calloc(BLOCK_SZ, 1); @@ -258,7 +258,7 @@ static void migrate_ssa(struct f2fs_sb_info *sbi, } } else { blkaddr = end_sum_blkaddr - 1; - offset = TOTAL_SEGS(sbi) - 1; + offset = MAIN_SEGS(sbi) - 1; while (blkaddr >= new_sum_blkaddr) { if (blkaddr >= expand_sum_blkaddr) { ret = dev_write_block(zero_block, blkaddr--); @@ -412,7 +412,7 @@ static void migrate_sit(struct f2fs_sb_info *sbi, DBG(3, "Write zero sit: %x\n", get_newsb(sit_blkaddr) + index); } - for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) { + for (segno = 0; segno < MAIN_SEGS(sbi); segno++) { struct f2fs_sit_entry *sit; se = get_seg_entry(sbi, segno);