Currently only single checksum byte is outputted. This fixes it so that full checksum is outputted.
Signed-off-by: Dāvis Mosāns <davis...@gmail.com> --- kernel-shared/disk-io.c | 47 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 6f584986..8773eed7 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -160,10 +160,45 @@ int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len) return -1; } +int btrfs_format_csum(u16 csum_type, const char *data, char *output) +{ + int i; + int csum_len = 0; + int position = 0; + int direction = 1; + switch (csum_type) { + case BTRFS_CSUM_TYPE_CRC32: + csum_len = 4; + position = csum_len - 1; + direction = -1; + break; + case BTRFS_CSUM_TYPE_XXHASH: + csum_len = 8; + position = csum_len - 1; + direction = -1; + break; + case BTRFS_CSUM_TYPE_SHA256: + case BTRFS_CSUM_TYPE_BLAKE2: + csum_len = 32; + break; + default: + fprintf(stderr, "ERROR: unknown csum type: %d\n", csum_type); + ASSERT(0); + } + + for (i = 0; i < csum_len; i++) { + sprintf(output + i*2, "%02X", data[position + i*direction] & 0xFF); + } + + return csum_len; +} + static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, int verify, int silent, u16 csum_type) { u8 result[BTRFS_CSUM_SIZE]; + char found[BTRFS_CSUM_SIZE * 2 + 1]; // 2 hex chars for each byte + null + char expected[BTRFS_CSUM_SIZE * 2 + 1]; u32 len; len = buf->len - BTRFS_CSUM_SIZE; @@ -172,12 +207,14 @@ static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, if (verify) { if (memcmp_extent_buffer(buf, result, 0, csum_size)) { - /* FIXME: format */ - if (!silent) - printk("checksum verify failed on %llu found %08X wanted %08X\n", + if (!silent) { + btrfs_format_csum(csum_type, (char *)result, found); + btrfs_format_csum(csum_type, buf->data, expected); + printk("checksum verify failed on %llu found %s wanted %s\n", (unsigned long long)buf->start, - result[0], - buf->data[0]); + found, + expected); + } return 1; } } else { -- 2.30.1