For passing authentication keys to the checksumming functions we need a
container for the key.
Pass in a btrfs_fs_info to btrfs_csum_data() so we can use the fs_info as
a container for the authentication key.
Note this is not always possible for all callers of btrfs_csum_data() so
we're just passing in NULL if it is not directly possible.
Functions calling btrfs_csum_data() with a NULL fs_info argument are
currently not supported in the context of an authenticated file-system.
Signed-off-by: Johannes Thumshirn <jthumshirn@xxxxxxx>
---
btrfs-sb-mod.c | 4 ++--
check/main.c | 2 +-
cmds/inspect-dump-super.c | 2 +-
cmds/rescue-chunk-recover.c | 2 +-
convert/common.c | 2 +-
disk-io.c | 16 +++++++++-------
disk-io.h | 3 ++-
file-item.c | 2 +-
8 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/btrfs-sb-mod.c b/btrfs-sb-mod.c
index ad143ca05aa6..537002687da6 100644
--- a/btrfs-sb-mod.c
+++ b/btrfs-sb-mod.c
@@ -36,7 +36,7 @@ static int check_csum_superblock(void *sb)
u8 result[BTRFS_CSUM_SIZE];
u16 csum_type = btrfs_super_csum_type(sb);
- btrfs_csum_data(csum_type, (unsigned char *)sb + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(NULL, csum_type, (unsigned char *)sb + BTRFS_CSUM_SIZE,
result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
return !memcmp(sb, result, csum_size);
@@ -48,7 +48,7 @@ static void update_block_csum(void *block)
struct btrfs_header *hdr;
u16 csum_type = btrfs_super_csum_type(block);
- btrfs_csum_data(csum_type, (unsigned char *)block + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(NULL, csum_type, (unsigned char *)block + BTRFS_CSUM_SIZE,
result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
memset(block, 0, BTRFS_CSUM_SIZE);
diff --git a/check/main.c b/check/main.c
index fd05430c1f51..d009f33e9657 100644
--- a/check/main.c
+++ b/check/main.c
@@ -5659,7 +5659,7 @@ static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
while (data_checked < read_len) {
tmp = offset + data_checked;
- btrfs_csum_data(csum_type, data + tmp,
+ btrfs_csum_data(fs_info, csum_type, data + tmp,
result, fs_info->sectorsize);
csum_offset = leaf_offset +
diff --git a/cmds/inspect-dump-super.c b/cmds/inspect-dump-super.c
index fc06488dde32..1a2ef4d4822c 100644
--- a/cmds/inspect-dump-super.c
+++ b/cmds/inspect-dump-super.c
@@ -39,7 +39,7 @@ static int check_csum_sblock(void *sb, int csum_size, u16 csum_type)
{
u8 result[BTRFS_CSUM_SIZE];
- btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(NULL, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
return !memcmp(sb, result, csum_size);
diff --git a/cmds/rescue-chunk-recover.c b/cmds/rescue-chunk-recover.c
index bf35693ddbfa..0896cea674ab 100644
--- a/cmds/rescue-chunk-recover.c
+++ b/cmds/rescue-chunk-recover.c
@@ -1908,7 +1908,7 @@ static int check_one_csum(int fd, u64 start, u32 len, u32 tree_csum,
}
ret = 0;
put_unaligned_le32(tree_csum, expected_csum);
- btrfs_csum_data(csum_type, (u8 *)data, result, len);
+ btrfs_csum_data(NULL, csum_type, (u8 *)data, result, len);
if (memcmp(result, expected_csum, csum_size) != 0)
ret = 1;
out:
diff --git a/convert/common.c b/convert/common.c
index 3cb2d9d44881..54ed52b592e6 100644
--- a/convert/common.c
+++ b/convert/common.c
@@ -66,7 +66,7 @@ static inline int write_temp_super(int fd, struct btrfs_super_block *sb,
u16 csum_type = btrfs_super_csum_type(sb);
int ret;
- btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(NULL, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
memcpy(&sb->csum[0], result, BTRFS_CSUM_SIZE);
ret = pwrite(fd, sb, BTRFS_SUPER_INFO_SIZE, sb_bytenr);
diff --git a/disk-io.c b/disk-io.c
index a9744af90a43..e68f28e72077 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -139,7 +139,8 @@ static void print_tree_block_error(struct btrfs_fs_info *fs_info,
}
}
-int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len)
+int btrfs_csum_data(struct btrfs_fs_info *fs_info, u16 csum_type,
+ const u8 *data, u8 *out, size_t len)
{
memset(out, 0, BTRFS_CSUM_SIZE);
@@ -167,7 +168,8 @@ static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size,
u32 len;
len = buf->len - BTRFS_CSUM_SIZE;
- btrfs_csum_data(csum_type, (u8 *)buf->data + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(buf->fs_info, csum_type,
+ (u8 *)buf->data + BTRFS_CSUM_SIZE,
result, len);
if (verify) {
@@ -1386,7 +1388,7 @@ int btrfs_check_super(struct btrfs_super_block *sb, unsigned sbflags)
}
csum_size = btrfs_super_csum_size(sb);
- btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+ btrfs_csum_data(NULL, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
if (memcmp(result, sb->csum, csum_size)) {
@@ -1640,8 +1642,8 @@ static int write_dev_supers(struct btrfs_fs_info *fs_info,
}
if (fs_info->super_bytenr != BTRFS_SUPER_INFO_OFFSET) {
btrfs_set_super_bytenr(sb, fs_info->super_bytenr);
- btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE, result,
- BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
+ btrfs_csum_data(fs_info, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+ result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
memcpy(&sb->csum[0], result, BTRFS_CSUM_SIZE);
/*
@@ -1675,8 +1677,8 @@ static int write_dev_supers(struct btrfs_fs_info *fs_info,
btrfs_set_super_bytenr(sb, bytenr);
- btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE, result,
- BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
+ btrfs_csum_data(fs_info, csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+ result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
memcpy(&sb->csum[0], result, BTRFS_CSUM_SIZE);
/*
diff --git a/disk-io.h b/disk-io.h
index 545cacda9a79..bb093ae69d57 100644
--- a/disk-io.h
+++ b/disk-io.h
@@ -186,7 +186,8 @@ int btrfs_free_fs_root(struct btrfs_root *root);
void btrfs_mark_buffer_dirty(struct extent_buffer *buf);
int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid);
int btrfs_set_buffer_uptodate(struct extent_buffer *buf);
-int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len);
+int btrfs_csum_data(struct btrfs_fs_info *fs_info, u16 csum_type,
+ const u8 *data, u8 *out, size_t len);
int btrfs_open_device(struct btrfs_device *dev);
int csum_tree_block_size(struct extent_buffer *buf, u16 csum_sectorsize,
diff --git a/file-item.c b/file-item.c
index 64af57693baf..fb84fbd6d54f 100644
--- a/file-item.c
+++ b/file-item.c
@@ -315,7 +315,7 @@ csum:
item = (struct btrfs_csum_item *)((unsigned char *)item +
csum_offset * csum_size);
found:
- btrfs_csum_data(csum_type, (u8 *)data, csum_result, len);
+ btrfs_csum_data(root->fs_info, csum_type, (u8 *)data, csum_result, len);
/* FIXME: does not make sense for non-crc32c */
if (csum_result == 0) {
printk("csum result is 0 for block %llu\n",
--
2.16.4