If a superblock failed in sanity check, it should be fixed. This patch
add a new state `sb_invalid' to tell fsck needs to update superblock
at the end of all checkings.

This patch also cleans up force_stop, abnormal_stop, fs_errors and
sb_invalid by merging them into an `invalid_sb' flags, and each of
them is indicated using one bit.

Signed-off-by: Sheng Yong <[email protected]>
---
 fsck/fsck.c       |  6 +++---
 fsck/mount.c      | 16 ++++++++++------
 include/f2fs_fs.h | 11 ++++++++---
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/fsck/fsck.c b/fsck/fsck.c
index b15931eba3a0..89a5913f4a26 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -3661,13 +3661,13 @@ int fsck_verify(struct f2fs_sb_info *sbi)
                        write_checkpoints(sbi);
                }
 
-               if (c.abnormal_stop)
+               if (c.invalid_sb & SB_ABNORMAL_STOP)
                        memset(sb->s_stop_reason, 0, MAX_STOP_REASON);
 
-               if (c.fs_errors)
+               if (c.invalid_sb & SB_FS_ERRORS)
                        memset(sb->s_errors, 0, MAX_F2FS_ERRORS);
 
-               if (c.abnormal_stop || c.fs_errors)
+               if (c.invalid_sb & SB_NEED_FIX)
                        update_superblock(sb, SB_MASK_ALL);
 
                /* to return FSCK_ERROR_CORRECTED */
diff --git a/fsck/mount.c b/fsck/mount.c
index 93ca351ef41c..e92e64e6feab 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -701,7 +701,7 @@ void print_sb_stop_reason(struct f2fs_super_block *sb)
        u8 *reason = sb->s_stop_reason;
        int i;
 
-       if (!c.force_stop)
+       if (!(c.invalid_sb & SB_FORCE_STOP))
                return;
 
        MSG(0, "Info: checkpoint stop reason: ");
@@ -739,7 +739,7 @@ void print_sb_errors(struct f2fs_super_block *sb)
        u8 *errors = sb->s_errors;
        int i;
 
-       if (!c.fs_errors)
+       if (!(c.invalid_sb & SB_FS_ERRORS))
                return;
 
        MSG(0, "Info: fs errors: ");
@@ -1171,9 +1171,12 @@ int validate_super_block(struct f2fs_sb_info *sbi, enum 
SB_ADDR sb_addr)
                                VERSION_NAME_LEN);
                get_kernel_version(c.init_version);
 
-               c.force_stop = is_checkpoint_stop(sbi->raw_super, false);
-               c.abnormal_stop = is_checkpoint_stop(sbi->raw_super, true);
-               c.fs_errors = is_inconsistent_error(sbi->raw_super);
+               if (is_checkpoint_stop(sbi->raw_super, false))
+                       c.invalid_sb |= SB_FORCE_STOP;
+               if (is_checkpoint_stop(sbi->raw_super, true))
+                       c.invalid_sb |= SB_ABNORMAL_STOP;
+               if (is_inconsistent_error(sbi->raw_super))
+                       c.invalid_sb |= SB_FS_ERRORS;
 
                MSG(0, "Info: MKFS version\n  \"%s\"\n", c.init_version);
                MSG(0, "Info: FSCK version\n  from \"%s\"\n    to \"%s\"\n",
@@ -1186,6 +1189,7 @@ int validate_super_block(struct f2fs_sb_info *sbi, enum 
SB_ADDR sb_addr)
 
        free(sbi->raw_super);
        sbi->raw_super = NULL;
+       c.invalid_sb |= SB_INVALID;
        MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", sb_addr);
 
        return -EINVAL;
@@ -1456,7 +1460,7 @@ static int f2fs_should_proceed(struct f2fs_super_block 
*sb, u32 flag)
                if (flag & CP_FSCK_FLAG ||
                        flag & CP_DISABLED_FLAG ||
                        flag & CP_QUOTA_NEED_FSCK_FLAG ||
-                       c.abnormal_stop || c.fs_errors ||
+                       c.invalid_sb & SB_NEED_FIX ||
                        (exist_qf_ino(sb) && (flag & CP_ERROR_FLAG))) {
                        c.fix_on = 1;
                } else if (!c.preen_mode) {
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 870a6e4823d2..fbd20d207e42 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1443,6 +1443,13 @@ enum {
        SSR
 };
 
+/* invalid sb types */
+#define SB_FORCE_STOP          0x1     /* s_stop_reason is set */
+#define SB_ABNORMAL_STOP       0x2     /* s_stop_reason is set except shutdown 
*/
+#define SB_FS_ERRORS           0x4     /* s_erros is set */
+#define SB_INVALID             0x8     /* sb is invalid */
+#define SB_NEED_FIX (SB_ABNORMAL_STOP | SB_FS_ERRORS | SB_INVALID)
+
 #define MAX_CACHE_SUMS                 8
 
 struct f2fs_configuration {
@@ -1494,9 +1501,7 @@ struct f2fs_configuration {
        int force;
        int defset;
        int bug_on;
-       int force_stop;
-       int abnormal_stop;
-       int fs_errors;
+       unsigned int invalid_sb;
        int bug_nat_bits;
        bool quota_fixed;
        int alloc_failed;
-- 
2.40.1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to