On 2018/6/13 9:51, Sheng Yong wrote: > If curseg is an empty segment, it will not be checked. This patch > introduces fsck_chk_curseg_info() to check SIT/SSA type of cursegs > to avoid curseg corruption. > > Signed-off-by: Sheng Yong <shengyo...@huawei.com> > --- > fsck/fsck.c | 34 ++++++++++++++++++++++++++++++++++ > fsck/fsck.h | 1 + > fsck/main.c | 2 ++ > 3 files changed, 37 insertions(+) > > diff --git a/fsck/fsck.c b/fsck/fsck.c > index 5b6dbc8..cfd939f 100644 > --- a/fsck/fsck.c > +++ b/fsck/fsck.c > @@ -2422,6 +2422,40 @@ out: > return cnt; > } > > +int fsck_chk_curseg_info(struct f2fs_sb_info *sbi) > +{ > + struct curseg_info *curseg; > + struct seg_entry *se; > + struct f2fs_summary_block *sum_blk; > + int i, ret = 0; > + > + for (i = 0; i < NO_CHECK_TYPE; i++) { > + curseg = CURSEG_I(sbi, i); > + se = get_seg_entry(sbi, curseg->segno); > + sum_blk = curseg->sum_blk; > + > + if (se->type != i) { > + ASSERT_MSG("Incorrect curseg [%d]: segno [0x%x] " > + "type(SIT) [%d]", i, curseg->segno, > + se->type); > + se->type = i;
Need to check c.fix_on to decide fix se->type here? > + ret = -1; > + } > + if (i <= CURSEG_COLD_DATA && IS_SUM_DATA_SEG(sum_blk->footer)) { > + continue; > + } else if (i > CURSEG_COLD_DATA && > IS_SUM_NODE_SEG(sum_blk->footer)) { > + continue; > + } else { > + ASSERT_MSG("Incorrect curseg [%d]: segno [0x%x] " > + "type(SSA) [%d]", i, curseg->segno, > + sum_blk->footer.entry_type); Ditto. Thanks, > + ret = -1; > + } > + } > + > + return ret; > +} > + > int fsck_verify(struct f2fs_sb_info *sbi) > { > unsigned int i = 0; > diff --git a/fsck/fsck.h b/fsck/fsck.h > index cbe7fc4..5530aff 100644 > --- a/fsck/fsck.h > +++ b/fsck/fsck.h > @@ -144,6 +144,7 @@ extern int fsck_chk_dentry_blk(struct f2fs_sb_info *, > u32, struct child_info *, > int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *, > struct child_info *); > int fsck_chk_meta(struct f2fs_sb_info *sbi); > +int fsck_chk_curseg_info(struct f2fs_sb_info *); > int convert_encrypted_name(unsigned char *, int, unsigned char *, int); > > extern void update_free_segments(struct f2fs_sb_info *); > diff --git a/fsck/main.c b/fsck/main.c > index 09026c9..f6d12b0 100644 > --- a/fsck/main.c > +++ b/fsck/main.c > @@ -578,6 +578,8 @@ static void do_fsck(struct f2fs_sb_info *sbi) > > print_cp_state(flag); > > + fsck_chk_curseg_info(sbi); > + > if (!c.fix_on && !c.bug_on) { > switch (c.preen_mode) { > case PREEN_MODE_1: > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel