Add auth-key option for btrfs inspect-internal dump-super so we can dump an
authenticated super-block and check for it's integrity.

Signed-off-by: Johannes Thumshirn <[email protected]>
---
 cmds/inspect-dump-super.c | 35 ++++++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/cmds/inspect-dump-super.c b/cmds/inspect-dump-super.c
index 5bf5a6bc6f27..ad81ba9f9ea2 100644
--- a/cmds/inspect-dump-super.c
+++ b/cmds/inspect-dump-super.c
@@ -35,11 +35,13 @@
 #include "crypto/crc32c.h"
 #include "common/help.h"
 
-static int check_csum_sblock(void *sb, int csum_size, u16 csum_type)
+static int check_csum_sblock(void *sb, int csum_size, u16 csum_type,
+                            char *auth_key)
 {
+       struct btrfs_fs_info dummy_fs_info = { .auth_key = auth_key };
        u8 result[BTRFS_CSUM_SIZE];
 
-       btrfs_csum_data(NULL, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+       btrfs_csum_data(&dummy_fs_info, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
                        result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
 
        return !memcmp(sb, result, csum_size);
@@ -325,7 +327,8 @@ static bool is_valid_csum_type(u16 csum_type)
        }
 }
 
-static void dump_superblock(struct btrfs_super_block *sb, int full)
+static void dump_superblock(struct btrfs_super_block *sb, int full,
+                           char *auth_key)
 {
        int i;
        char *s, buf[BTRFS_UUID_UNPARSED_SIZE];
@@ -352,11 +355,11 @@ static void dump_superblock(struct btrfs_super_block *sb, 
int full)
        printf("csum\t\t\t0x");
        for (i = 0, p = sb->csum; i < csum_size; i++)
                printf("%02x", p[i]);
-       if (csum_type == BTRFS_CSUM_TYPE_HMAC_SHA256)
+       if (csum_type == BTRFS_CSUM_TYPE_HMAC_SHA256 && !auth_key)
                printf(" [NO KEY FOR HMAC]");
        else if (!is_valid_csum_type(csum_type))
                printf(" [UNKNOWN CSUM TYPE OR SIZE]");
-       else if (check_csum_sblock(sb, csum_size, csum_type))
+       else if (check_csum_sblock(sb, csum_size, csum_type, auth_key))
                printf(" [match]");
        else
                printf(" [DON'T MATCH]");
@@ -484,7 +487,7 @@ static void dump_superblock(struct btrfs_super_block *sb, 
int full)
 }
 
 static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full,
-               int force)
+               int force, char *auth_key)
 {
        u8 super_block_data[BTRFS_SUPER_INFO_SIZE];
        struct btrfs_super_block *sb;
@@ -509,7 +512,7 @@ static int load_and_dump_sb(char *filename, int fd, u64 
sb_bytenr, int full,
                error("bad magic on superblock on %s at %llu",
                                filename, (unsigned long long)sb_bytenr);
        } else {
-               dump_superblock(sb, full);
+               dump_superblock(sb, full, auth_key);
        }
        return 0;
 }
@@ -523,6 +526,7 @@ static const char * const cmd_inspect_dump_super_usage[] = {
        "-s|--super <super>    specify which copy to print out (values: 0, 1, 
2)",
        "-F|--force            attempt to dump superblocks with bad magic",
        "--bytenr <offset>     specify alternate superblock offset",
+       "--auth-key <key>      specify authentication key for authenticated 
file-system",
        "",
        "Deprecated syntax:",
        "-s <bytenr>           specify alternate superblock offset, values 
other than 0, 1, 2",
@@ -545,16 +549,19 @@ static int cmd_inspect_dump_super(const struct cmd_struct 
*cmd,
        int ret = 0;
        u64 arg;
        u64 sb_bytenr = btrfs_sb_offset(0);
+       char *auth_key = NULL;
 
        while (1) {
                int c;
-               enum { GETOPT_VAL_BYTENR = 257 };
+               enum { GETOPT_VAL_BYTENR = 257, GETOPT_VAL_AUTHKEY, };
                static const struct option long_options[] = {
                        {"all", no_argument, NULL, 'a'},
                        {"bytenr", required_argument, NULL, GETOPT_VAL_BYTENR },
                        {"full", no_argument, NULL, 'f'},
                        {"force", no_argument, NULL, 'F'},
                        {"super", required_argument, NULL, 's' },
+                       {"auth-key", required_argument, NULL,
+                               GETOPT_VAL_AUTHKEY },
                        {NULL, 0, NULL, 0}
                };
 
@@ -601,13 +608,16 @@ static int cmd_inspect_dump_super(const struct cmd_struct 
*cmd,
                        sb_bytenr = arg;
                        all = 0;
                        break;
+               case GETOPT_VAL_AUTHKEY:
+                       auth_key = strdup(optarg);
+                       break;
                default:
                        usage_unknown_option(cmd, argv);
                }
        }
 
        if (check_argc_min(argc - optind, 1))
-               return 1;
+               goto out;
 
        for (i = optind; i < argc; i++) {
                filename = argv[i];
@@ -624,7 +634,8 @@ static int cmd_inspect_dump_super(const struct cmd_struct 
*cmd,
                        for (idx = 0; idx < BTRFS_SUPER_MIRROR_MAX; idx++) {
                                sb_bytenr = btrfs_sb_offset(idx);
                                if (load_and_dump_sb(filename, fd,
-                                               sb_bytenr, full, force)) {
+                                               sb_bytenr, full, force,
+                                               auth_key)) {
                                        close(fd);
                                        ret = 1;
                                        goto out;
@@ -633,13 +644,15 @@ static int cmd_inspect_dump_super(const struct cmd_struct 
*cmd,
                                putchar('\n');
                        }
                } else {
-                       load_and_dump_sb(filename, fd, sb_bytenr, full, force);
+                       load_and_dump_sb(filename, fd, sb_bytenr, full, force,
+                                        auth_key);
                        putchar('\n');
                }
                close(fd);
        }
 
 out:
+       free(auth_key);
        return ret;
 }
 DEFINE_SIMPLE_COMMAND(inspect_dump_super, "dump-super");
-- 
2.16.4

Reply via email to