Use enum defined error codes to represent different kinds of errs
for super-recover and chunk-recover.
---
 chunk-recover.c | 35 ++++++++++++++++++++++++++---
 cmds-rescue.c   | 36 ++++++++++++++++++++----------
 super-recover.c | 69 ++++++++++++++++++++++++++++-----------------------------
 3 files changed, 90 insertions(+), 50 deletions(-)

diff --git a/chunk-recover.c b/chunk-recover.c
index 613d715..84fd8b7 100644
--- a/chunk-recover.c
+++ b/chunk-recover.c
@@ -82,6 +82,27 @@ struct device_scan {
        int fd;
 };
 
+enum chunk_recover_err_code {
+       cr_notused,
+       ERR_CR_NO_RECOVER,
+       ERR_CR_FAILED_TO_RECOVER,
+       ERR_CR_ABORTED_TO_RECOVER,
+};
+
+char *chunk_recover_err_str(int err)
+{
+       switch (err) {
+       case ERR_CR_NO_RECOVER:
+               return "All chunks are good, no need to recover\n";
+       case ERR_CR_FAILED_TO_RECOVER:
+               return "Failed to recover the chunk tree\n";
+       case ERR_CR_ABORTED_TO_RECOVER:
+               return "Aborted to recover bad superblocks\n";
+       default:
+               return "Unkown recover result\n";
+       }
+}
+
 static struct extent_record *btrfs_new_extent_record(struct extent_buffer *eb)
 {
        struct extent_record *rec;
@@ -2092,12 +2113,14 @@ int btrfs_recover_chunk_tree(char *path, int verbose, 
int yes)
        ret = recover_prepare(&rc, path);
        if (ret) {
                fprintf(stderr, "recover prepare error\n");
+               ret = ERR_CR_FAILED_TO_RECOVER;
                return ret;
        }
 
        ret = scan_devices(&rc);
        if (ret) {
                fprintf(stderr, "scan chunk headers error\n");
+               ret = ERR_CR_FAILED_TO_RECOVER;
                goto fail_rc;
        }
 
@@ -2105,6 +2128,7 @@ int btrfs_recover_chunk_tree(char *path, int verbose, int 
yes)
            cache_tree_empty(&rc.bg.tree) &&
            cache_tree_empty(&rc.devext.tree)) {
                fprintf(stderr, "no recoverable chunk\n");
+               ret = ERR_CR_NO_RECOVER;
                goto fail_rc;
        }
 
@@ -2117,8 +2141,10 @@ int btrfs_recover_chunk_tree(char *path, int verbose, 
int yes)
                if (!list_empty(&rc.bg.block_groups) ||
                    !list_empty(&rc.devext.no_chunk_orphans)) {
                        ret = btrfs_recover_chunks(&rc);
-                       if (ret)
+                       if (ret) {
+                               ret = ERR_CR_FAILED_TO_RECOVER;
                                goto fail_rc;
+                       }
                }
                /*
                 * If the chunk is healthy, its block group item and device
@@ -2129,32 +2155,35 @@ int btrfs_recover_chunk_tree(char *path, int verbose, 
int yes)
                 */
        } else {
                fprintf(stderr, "Check chunks successfully with no orphans\n");
+               ret = ERR_CR_NO_RECOVER;
                goto fail_rc;
        }
 
        root = open_ctree_with_broken_chunk(&rc);
        if (IS_ERR(root)) {
                fprintf(stderr, "open with broken chunk error\n");
-               ret = PTR_ERR(root);
+               ret = ERR_CR_FAILED_TO_RECOVER;
                goto fail_rc;
        }
 
        ret = check_all_chunks_by_metadata(&rc, root);
        if (ret) {
                fprintf(stderr, "The chunks in memory can not match the 
metadata of the fs. Repair failed.\n");
+               ret = ERR_CR_FAILED_TO_RECOVER;
                goto fail_close_ctree;
        }
 
        ret = btrfs_rebuild_ordered_data_chunk_stripes(&rc, root);
        if (ret) {
                fprintf(stderr, "Failed to rebuild ordered chunk stripes.\n");
+               ret = ERR_CR_FAILED_TO_RECOVER;
                goto fail_close_ctree;
        }
 
        if (!rc.yes) {
                ret = ask_user("We are going to rebuild the chunk tree on disk, 
it might destroy the old metadata on the disk, Are you sure?");
                if (!ret) {
-                       ret = 1;
+                       ret = ERR_CR_ABORTED_TO_RECOVER;
                        goto fail_close_ctree;
                }
        }
diff --git a/cmds-rescue.c b/cmds-rescue.c
index f20a206..7e0687e 100644
--- a/cmds-rescue.c
+++ b/cmds-rescue.c
@@ -30,6 +30,9 @@ static const char * const rescue_cmd_group_usage[] = {
 int btrfs_recover_chunk_tree(char *path, int verbose, int yes);
 int btrfs_recover_superblocks(char *path, int verbose, int yes);
 
+char *chunk_recover_err_str(int err);
+char *super_recover_err_str(int err);
+
 const char * const cmd_chunk_recover_usage[] = {
        "btrfs rescue chunk-recover [options] <device>",
        "Recover the chunk tree by scanning the devices one by one.",
@@ -49,6 +52,13 @@ const char * const cmd_super_recover_usage[] = {
        NULL
 };
 
+/*
+ * return codes:
+ *   0 : Chunk recover successfully
+ *   1 : All chunks are good, no need to recover
+ *   2 : Fail to recover the chunk tree
+ *   3 : Abort to recover the on-disk chunk tree
+ */
 int cmd_chunk_recover(int argc, char *argv[])
 {
        int ret = 0;
@@ -90,23 +100,20 @@ int cmd_chunk_recover(int argc, char *argv[])
        }
 
        ret = btrfs_recover_chunk_tree(file, verbose, yes);
-       if (!ret) {
-               fprintf(stdout, "Recover the chunk tree successfully.\n");
-       } else if (ret > 0) {
-               ret = 0;
-               fprintf(stdout, "Abort to rebuild the on-disk chunk tree.\n");
-       } else {
-               fprintf(stdout, "Fail to recover the chunk tree.\n");
-       }
+       if (!ret)
+               printf("Chunk recover successfully\n");
+       else if (ret > 0)
+               fprintf(stderr, "%s", chunk_recover_err_str(ret));
+
        return ret;
 }
 
 /*
  * return codes:
- *   0 : All superblocks are valid, no need to recover
- *   1 : Usage or syntax error
- *   2 : Recover all bad superblocks successfully
- *   3 : Fail to Recover bad supeblocks
+ *   0 : Super recover successfully
+ *   1 : All superblocks are good, no need to recover
+ *   2 : Usage or syntax error
+ *   3 : Fail to recover bad supeblocks
  *   4 : Abort to recover bad superblocks
  */
 int cmd_super_recover(int argc, char **argv)
@@ -146,6 +153,11 @@ int cmd_super_recover(int argc, char **argv)
                return 1;
        }
        ret = btrfs_recover_superblocks(dname, verbose, yes);
+       if (!ret)
+               printf("Super recover successfully\n");
+       else if (ret > 0)
+               fprintf(stderr, "%s", super_recover_err_str(ret));
+
        return ret;
 }
 
diff --git a/super-recover.c b/super-recover.c
index cd6ba37..72ad884 100644
--- a/super-recover.c
+++ b/super-recover.c
@@ -56,6 +56,30 @@ struct super_block_record {
        u64 bytenr;
 };
 
+enum super_recover_err_code {
+       sr_notused,
+       ERR_SR_NO_RECOVER,
+       ERR_SR_USAGE_OR_SYNTAX,
+       ERR_SR_FAILED_TO_RECOVER,
+       ERR_SR_ABORTED_TO_RECOVER,
+};
+
+char *super_recover_err_str(int err)
+{
+       switch (err) {
+       case ERR_SR_NO_RECOVER:
+               return "All superblocks are good, no need to recover\n";
+       case ERR_SR_USAGE_OR_SYNTAX:
+               return "Usage or syntax error\n";
+       case ERR_SR_FAILED_TO_RECOVER:
+               return "Failed to recover the chunk tree\n";
+       case ERR_SR_ABORTED_TO_RECOVER:
+               return "Aborted to recover the on-disk chunk tree\n";
+       default:
+               return "Unkown recover result\n";
+       }
+}
+
 static
 void init_recover_superblock(struct btrfs_recover_superblock *recover)
 {
@@ -253,30 +277,6 @@ static void print_all_supers(struct 
btrfs_recover_superblock *recover)
        printf("\n");
 }
 
-static void recover_err_str(int ret)
-{
-       switch (ret) {
-       case 0:
-               printf("All supers are valid, no need to recover\n");
-               break;
-       case 1:
-               printf("Usage or syntax errors\n");
-               break;
-       case 2:
-               printf("Recovered bad superblocks successful\n");
-               break;
-       case 3:
-               printf("Failed to recover bad superblocks\n");
-               break;
-       case 4:
-               printf("Aborted to recover bad superblocks\n");
-               break;
-       default:
-               printf("Unknown recover result\n");
-               break;
-       }
-}
-
 int btrfs_recover_superblocks(const char *dname,
                        int verbose, int yes)
 {
@@ -288,14 +288,14 @@ int btrfs_recover_superblocks(const char *dname,
        fd = open(dname, O_RDONLY);
        if (fd < 0) {
                fprintf(stderr, "open %s error\n", dname);
-               return 1;
+               return ERR_SR_USAGE_OR_SYNTAX;
        }
        init_recover_superblock(&recover);
 
        ret = btrfs_scan_fs_devices(fd, dname, &recover.fs_devices, 0, 0);
        close(fd);
        if (ret) {
-               ret = 1;
+               ret = ERR_SR_USAGE_OR_SYNTAX;
                goto no_recover;
        }
 
@@ -304,7 +304,7 @@ int btrfs_recover_superblocks(const char *dname,
 
        ret = read_fs_supers(&recover);
        if (ret) {
-               ret = 1;
+               ret = ERR_SR_USAGE_OR_SYNTAX;
                goto no_recover;
        }
        if (verbose) {
@@ -312,13 +312,15 @@ int btrfs_recover_superblocks(const char *dname,
                print_all_supers(&recover);
        }
 
-       if (list_empty(&recover.bad_supers))
+       if (list_empty(&recover.bad_supers)) {
+               ret = ERR_SR_NO_RECOVER;
                goto no_recover;
+       }
 
        if (!yes) {
                ret = ask_user("Make sure this is a btrfs disk otherwise the 
tool will destroy other fs, Are you sure?");
                if (!ret) {
-                       ret = 4;
+                       ret = ERR_SR_ABORTED_TO_RECOVER;
                        goto no_recover;
                }
        }
@@ -326,20 +328,17 @@ int btrfs_recover_superblocks(const char *dname,
        root = open_ctree(record->device_name, record->bytenr,
                          OPEN_CTREE_RECOVER_SUPER | OPEN_CTREE_WRITES);
        if (!root) {
-               ret = 3;
+               ret = ERR_SR_FAILED_TO_RECOVER;
                goto no_recover;
        }
        /* reset super_bytenr in order that we will rewite all supers */
        root->fs_info->super_bytenr = BTRFS_SUPER_INFO_OFFSET;
        ret = write_all_supers(root);
-       if (!ret)
-               ret = 2;
-       else
-               ret = 3;
+       if (ret)
+               ret = ERR_SR_FAILED_TO_RECOVER;
 
        close_ctree(root);
 no_recover:
-       recover_err_str(ret);
        free_recover_superblock(&recover);
        return ret;
 }
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to