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

Reply via email to