btrfs-progs: check: fix the return value bug of cmd_check()
[platform/upstream/btrfs-progs.git] / cmds-check.c
index fbd6a20..14816bd 100644 (file)
@@ -12278,6 +12278,7 @@ int cmd_check(int argc, char **argv)
        u64 chunk_root_bytenr = 0;
        char uuidbuf[BTRFS_UUID_UNPARSED_SIZE];
        int ret;
+       int err = 0;
        u64 num;
        int init_csum_tree = 0;
        int readonly = 0;
@@ -12427,10 +12428,12 @@ int cmd_check(int argc, char **argv)
 
        if((ret = check_mounted(argv[optind])) < 0) {
                error("could not check mount status: %s", strerror(-ret));
+               err |= !!ret;
                goto err_out;
        } else if(ret) {
                error("%s is currently mounted, aborting", argv[optind]);
                ret = -EBUSY;
+               err |= !!ret;
                goto err_out;
        }
 
@@ -12443,6 +12446,7 @@ int cmd_check(int argc, char **argv)
        if (!info) {
                error("cannot open file system");
                ret = -EIO;
+               err |= !!ret;
                goto err_out;
        }
 
@@ -12491,9 +12495,11 @@ int cmd_check(int argc, char **argv)
                ret = ask_user("repair mode will force to clear out log tree, are you sure?");
                if (!ret) {
                        ret = 1;
+                       err |= !!ret;
                        goto close_out;
                }
                ret = zero_log_tree(root);
+               err |= !!ret;
                if (ret) {
                        error("failed to zero log tree: %d", ret);
                        goto close_out;
@@ -12505,6 +12511,7 @@ int cmd_check(int argc, char **argv)
                printf("Print quota groups for %s\nUUID: %s\n", argv[optind],
                       uuidbuf);
                ret = qgroup_verify_all(info);
+               err |= !!ret;
                if (ret == 0)
                        report_qgroups(1);
                goto close_out;
@@ -12513,6 +12520,7 @@ int cmd_check(int argc, char **argv)
                printf("Print extent state for subvolume %llu on %s\nUUID: %s\n",
                       subvolid, argv[optind], uuidbuf);
                ret = print_extent_state(info, subvolid);
+               err |= !!ret;
                goto close_out;
        }
        printf("Checking filesystem on %s\nUUID: %s\n", argv[optind], uuidbuf);
@@ -12521,6 +12529,7 @@ int cmd_check(int argc, char **argv)
            !extent_buffer_uptodate(info->dev_root->node) ||
            !extent_buffer_uptodate(info->chunk_root->node)) {
                error("critical roots corrupted, unable to check the filesystem");
+               err |= !!ret;
                ret = -EIO;
                goto close_out;
        }
@@ -12532,12 +12541,14 @@ int cmd_check(int argc, char **argv)
                if (IS_ERR(trans)) {
                        error("error starting transaction");
                        ret = PTR_ERR(trans);
+                       err |= !!ret;
                        goto close_out;
                }
 
                if (init_extent_tree) {
                        printf("Creating a new extent tree\n");
                        ret = reinit_extent_tree(trans, info);
+                       err |= !!ret;
                        if (ret)
                                goto close_out;
                }
@@ -12549,11 +12560,13 @@ int cmd_check(int argc, char **argv)
                                error("checksum tree initialization failed: %d",
                                                ret);
                                ret = -EIO;
+                               err |= !!ret;
                                goto close_out;
                        }
 
                        ret = fill_csum_tree(trans, info->csum_root,
                                             init_extent_tree);
+                       err |= !!ret;
                        if (ret) {
                                error("checksum tree refilling failed: %d", ret);
                                return -EIO;
@@ -12564,17 +12577,20 @@ int cmd_check(int argc, char **argv)
                 * extent entries for all of the items it finds.
                 */
                ret = btrfs_commit_transaction(trans, info->extent_root);
+               err |= !!ret;
                if (ret)
                        goto close_out;
        }
        if (!extent_buffer_uptodate(info->extent_root->node)) {
                error("critical: extent_root, unable to check the filesystem");
                ret = -EIO;
+               err |= !!ret;
                goto close_out;
        }
        if (!extent_buffer_uptodate(info->csum_root->node)) {
                error("critical: csum_root, unable to check the filesystem");
                ret = -EIO;
+               err |= !!ret;
                goto close_out;
        }
 
@@ -12584,11 +12600,13 @@ int cmd_check(int argc, char **argv)
                ret = check_chunks_and_extents_v2(root);
        else
                ret = check_chunks_and_extents(root);
+       err |= !!ret;
        if (ret)
                error(
                "errors found in extent allocation tree or chunk allocation");
 
        ret = repair_root_items(info);
+       err |= !!ret;
        if (ret < 0)
                goto close_out;
        if (repair) {
@@ -12601,6 +12619,7 @@ int cmd_check(int argc, char **argv)
                fprintf(stderr,
                        "Please run a filesystem check with the option --repair to fix them.\n");
                ret = 1;
+               err |= !!ret;
                goto close_out;
        }
 
@@ -12611,6 +12630,7 @@ int cmd_check(int argc, char **argv)
                        fprintf(stderr, "checking free space cache\n");
        }
        ret = check_space_cache(root);
+       err |= !!ret;
        if (ret)
                goto out;
 
@@ -12628,11 +12648,13 @@ int cmd_check(int argc, char **argv)
                ret = check_fs_roots_v2(root->fs_info);
        else
                ret = check_fs_roots(root, &root_cache);
+       err |= !!ret;
        if (ret)
                goto out;
 
        fprintf(stderr, "checking csums\n");
        ret = check_csums(root);
+       err |= !!ret;
        if (ret)
                goto out;
 
@@ -12640,6 +12662,7 @@ int cmd_check(int argc, char **argv)
        /* For low memory mode, check_fs_roots_v2 handles root refs */
        if (check_mode != CHECK_MODE_LOWMEM) {
                ret = check_root_refs(root, &root_cache);
+               err |= !!ret;
                if (ret)
                        goto out;
        }
@@ -12651,6 +12674,7 @@ int cmd_check(int argc, char **argv)
                                      struct extent_buffer, recow);
                list_del_init(&eb->recow);
                ret = recow_extent_buffer(root, eb);
+               err |= !!ret;
                if (ret)
                        break;
        }
@@ -12660,32 +12684,33 @@ int cmd_check(int argc, char **argv)
 
                bad = list_first_entry(&delete_items, struct bad_item, list);
                list_del_init(&bad->list);
-               if (repair)
+               if (repair) {
                        ret = delete_bad_item(root, bad);
+                       err |= !!ret;
+               }
                free(bad);
        }
 
        if (info->quota_enabled) {
-               int err;
                fprintf(stderr, "checking quota groups\n");
-               err = qgroup_verify_all(info);
-               if (err)
+               ret = qgroup_verify_all(info);
+               err |= !!ret;
+               if (ret)
                        goto out;
                report_qgroups(0);
-               err = repair_qgroups(info, &qgroups_repaired);
+               ret = repair_qgroups(info, &qgroups_repaired);
+               err |= !!ret;
                if (err)
                        goto out;
+               ret = 0;
        }
 
        if (!list_empty(&root->fs_info->recow_ebs)) {
                error("transid errors in file system");
                ret = 1;
+               err |= !!ret;
        }
 out:
-       /* Don't override original ret */
-       if (!ret && qgroups_repaired)
-               ret = qgroups_repaired;
-
        if (found_old_backref) { /*
                 * there was a disk format change when mixed
                 * backref was in testing tree. The old format
@@ -12695,7 +12720,7 @@ out:
                       "The old format is not supported! *"
                       "\n * Please mount the FS in readonly mode, "
                       "backup data and re-format the FS. *\n\n");
-               ret = 1;
+               err |= 1;
        }
        printf("found %llu bytes used err is %d\n",
               (unsigned long long)bytes_used, ret);
@@ -12720,5 +12745,5 @@ err_out:
        if (ctx.progress_enabled)
                task_deinit(ctx.info);
 
-       return ret;
+       return err;
 }