f2fs: Add a new CP flag to help fsck fix resize SPO issues
authorSahitya Tummala <stummala@codeaurora.org>
Tue, 3 Mar 2020 14:29:26 +0000 (19:59 +0530)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 23 Mar 2020 04:16:28 +0000 (21:16 -0700)
Add and set a new CP flag CP_RESIZEFS_FLAG during
online resize FS to help fsck fix the metadata mismatch
that may happen due to SPO during resize, where SB
got updated but CP data couldn't be written yet.

fsck errors -
Info: CKPT version = 6ed7bccb
        Wrong user_block_count(2233856)
[f2fs_do_mount:3365] Checkpoint is polluted

Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/checkpoint.c
include/linux/f2fs_fs.h

index 46fc9c1542fed87a1c9b039225710aadfb0ffec6..852890b72d6acd62bf63bef69c38520f674f0b98 100644 (file)
@@ -1298,10 +1298,14 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc)
        else
                __clear_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG);
 
-       if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) ||
-               is_sbi_flag_set(sbi, SBI_IS_RESIZEFS))
+       if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
                __set_ckpt_flags(ckpt, CP_FSCK_FLAG);
 
+       if (is_sbi_flag_set(sbi, SBI_IS_RESIZEFS))
+               __set_ckpt_flags(ckpt, CP_RESIZEFS_FLAG);
+       else
+               __clear_ckpt_flags(ckpt, CP_RESIZEFS_FLAG);
+
        if (is_sbi_flag_set(sbi, SBI_CP_DISABLED))
                __set_ckpt_flags(ckpt, CP_DISABLED_FLAG);
        else
index ac3f4888b3dfac7999de92bef9e2e73fd77d3b8f..3c383ddd92dddcee7d3bc3b416a766e5e363a77f 100644 (file)
@@ -125,6 +125,7 @@ struct f2fs_super_block {
 /*
  * For checkpoint
  */
+#define CP_RESIZEFS_FLAG               0x00004000
 #define CP_DISABLED_QUICK_FLAG         0x00002000
 #define CP_DISABLED_FLAG               0x00001000
 #define CP_QUOTA_NEED_FSCK_FLAG                0x00000800