@@ -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);
@@ -326,7 +328,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];
@@ -353,11 +356,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]");
@@ -485,7 +488,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;
@@ -510,7 +513,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;
}
@@ -524,6 +527,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",
@@ -546,16 +550,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}
};
@@ -602,13 +609,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];
@@ -625,7 +635,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;
@@ -634,13 +645,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");