Btrfs-progs, fsck: move root items repair after root rebuilding
authorWang Shilong <wangshilong1991@gmail.com>
Wed, 26 Nov 2014 02:58:52 +0000 (10:58 +0800)
committerDavid Sterba <dsterba@suse.cz>
Wed, 10 Dec 2014 14:42:52 +0000 (15:42 +0100)
If some critical roots are corrupt, reapr_root_items() will fail,
this is detected by fsck_tests.sh's extent rebuilding tests.

Signed-off-by: Wang Shilong <wangshilong1991@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
cmds-check.c

index 45e3d21..6eea36c 100644 (file)
@@ -8522,22 +8522,6 @@ int cmd_check(int argc, char **argv)
 
        root = info->fs_root;
 
-       ret = repair_root_items(info);
-       if (ret < 0)
-               goto close_out;
-       if (repair) {
-               fprintf(stderr, "Fixed %d roots.\n", ret);
-               ret = 0;
-       } else if (ret > 0) {
-               fprintf(stderr,
-                      "Found %d roots with an outdated root item.\n",
-                      ret);
-               fprintf(stderr,
-                       "Please run a filesystem check with the option --repair to fix them.\n");
-               ret = 1;
-               goto close_out;
-       }
-
        /*
         * repair mode will force us to commit transaction which
         * will make us fail to load log tree when mounting.
@@ -8636,6 +8620,22 @@ int cmd_check(int argc, char **argv)
        if (ret)
                fprintf(stderr, "Errors found in extent allocation tree or chunk allocation\n");
 
+       ret = repair_root_items(info);
+       if (ret < 0)
+               goto close_out;
+       if (repair) {
+               fprintf(stderr, "Fixed %d roots.\n", ret);
+               ret = 0;
+       } else if (ret > 0) {
+               fprintf(stderr,
+                      "Found %d roots with an outdated root item.\n",
+                      ret);
+               fprintf(stderr,
+                       "Please run a filesystem check with the option --repair to fix them.\n");
+               ret = 1;
+               goto close_out;
+       }
+
        fprintf(stderr, "checking free space cache\n");
        ret = check_space_cache(root);
        if (ret)