fsck.f2fs: introduce preen mode 2
authorChao Yu <yuchao0@huawei.com>
Tue, 27 Nov 2018 12:36:35 +0000 (20:36 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 28 Nov 2018 08:14:30 +0000 (00:14 -0800)
As Michael reported:

after updating to f2fs-tools 1.12.0, a routine fsck of my file systems
took quite a while and output ten-thousands instances of the following
line:

> [FIX] (fsck_chk_inode_blk: 954)  --> Regular: 0xXYZ reset i_gc_failures from 0x1 to 0x00

The reason is that:

We start to support reseting .i_gc_failures's value to zero in fsck since
91bb7b21f740 ("f2fs-tools: fix to reset i_gc_failures offline"), this is
because if .i_gc_failures continues increasing and exceed threshold, it
can make f2fs break atomic_write semantics during GC, so I added that
patch to avoid such condition.

But the problem here is even .i_gc_failures's value is one which was
initialized duing inode creation by old kernel, and it never be increased
by GC flow, we will still trigger such fix in fsck. I think it's not
necessary.

As Jaegeuk suggested, we introduce a new preen mode 2 to handle such
condition:
  - 2: same as 0, but skip some checks for old kernel

Suggested-by: Jaegeuk Kim <jaegeuk@kernel.org>
Reported-by: Michael Laß <bevan@bi-co.net>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/fsck.c
fsck/fsck.h
fsck/main.c

index 970d150..bcda781 100644 (file)
@@ -941,7 +941,13 @@ skip_blkcnt_fix:
        }
 
        i_gc_failures = le16_to_cpu(node_blk->i.i_gc_failures);
-       if (ftype == F2FS_FT_REG_FILE && i_gc_failures) {
+
+       /*
+        * old kernel initialized i_gc_failures as 0x01, in preen mode 2,
+        * let's skip repairing.
+        */
+       if (ftype == F2FS_FT_REG_FILE && i_gc_failures &&
+               (c.preen_mode != PREEN_MODE_2 || i_gc_failures != 0x01)) {
 
                DBG(1, "Regular Inode: 0x%x [%s] depth: %d\n\n",
                                le32_to_cpu(node_blk->footer.ino), en,
index b2227d2..cbd6e93 100644 (file)
@@ -21,6 +21,7 @@ struct quota_ctx;
 enum {
        PREEN_MODE_0,
        PREEN_MODE_1,
+       PREEN_MODE_2,
        PREEN_MODE_MAX
 };
 
index bb79f6e..65bdb5d 100644 (file)
@@ -216,6 +216,8 @@ void f2fs_parse_options(int argc, char *argv[])
                                /* preen mode has different levels:
                                 *  0: default level, the same as -a
                                 *  1: check meta
+                                *  2: same as 0, but will skip some
+                                *     check for old kernel
                                 */
                                if (optarg[0] == '-' || !is_digits(optarg) ||
                                                        optind == argc) {
@@ -230,7 +232,8 @@ void f2fs_parse_options(int argc, char *argv[])
                                        c.preen_mode = PREEN_MODE_0;
                                else if (c.preen_mode >= PREEN_MODE_MAX)
                                        c.preen_mode = PREEN_MODE_MAX - 1;
-                               if (c.preen_mode == PREEN_MODE_0)
+                               if (c.preen_mode == PREEN_MODE_0 ||
+                                       c.preen_mode == PREEN_MODE_2)
                                        c.auto_fix = 1;
                                MSG(0, "Info: Fix the reported corruption in "
                                        "preen mode %d\n", c.preen_mode);