If one cp is invalidate, set CP_FSCK_FLAG to allow fixing cp at the end of check.
Signed-off-by: Sheng Yong <shengy...@oppo.com> --- fsck/f2fs.h | 6 ++++++ fsck/mount.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fsck/f2fs.h b/fsck/f2fs.h index 187e73cf9aec..651a1f734281 100644 --- a/fsck/f2fs.h +++ b/fsck/f2fs.h @@ -346,6 +346,12 @@ static inline __u64 cur_cp_crc(struct f2fs_checkpoint *cp) return le32_to_cpu(*((__le32 *)((unsigned char *)cp + crc_offset))); } +static inline void set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f) +{ + unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags); + cp->ckpt_flags = cpu_to_le32(ckpt_flags | f); +} + static inline bool is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f) { unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags); diff --git a/fsck/mount.c b/fsck/mount.c index a09a974fc810..bbe29dba0f45 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -1322,8 +1322,11 @@ void *validate_checkpoint(struct f2fs_sb_info *sbi, block_t cp_addr, return NULL; cp = (struct f2fs_checkpoint *)cp_page_1; - if (get_cp(cp_pack_total_block_count) > sbi->blocks_per_seg) + if (get_cp(cp_pack_total_block_count) > sbi->blocks_per_seg) { + MSG(0, "\tInvalid CP pack block count: %u\n", + get_cp(cp_pack_total_block_count)); goto invalid_cp1; + } pre_version = get_cp(checkpoint_ver); @@ -1387,14 +1390,16 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi) sbi->cur_cp = 1; version = cp1_version; } - } else if (cp1) { + } else if (cp1) { // cp2 is invalidate cur_page = cp1; sbi->cur_cp = 1; version = cp1_version; - } else if (cp2) { + set_ckpt_flags(cp1, CP_FSCK_FLAG); + } else if (cp2) { // cp1 is invalidate cur_page = cp2; sbi->cur_cp = 2; version = cp2_version; + set_ckpt_flags(cp2, CP_FSCK_FLAG); } else goto fail_no_cp; -- 2.40.1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel