diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c index 716439a5..275aa418 100644 --- a/btrfs-corrupt-block.c +++ b/btrfs-corrupt-block.c @@ -158,7 +158,8 @@ static void corrupt_keys(struct btrfs_trans_handle *trans, if (!trans) { u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); - csum_tree_block_size(eb, csum_size, 0); + u16 csum_type = btrfs_super_csum_type(fs_info->super_copy); + csum_tree_block_size(eb, csum_size, 0, csum_type); write_extent_to_disk(eb); } } diff --git a/cmds/rescue-chunk-recover.c b/cmds/rescue-chunk-recover.c index 1959a204..c2a26ad0 100644 --- a/cmds/rescue-chunk-recover.c +++ b/cmds/rescue-chunk-recover.c @@ -768,7 +768,8 @@ static int scan_one_device(void *dev_scan_struct) continue; } - if (verify_tree_block_csum_silent(buf, rc->csum_size)) { + if (verify_tree_block_csum_silent(buf, rc->csum_size, + rc->csum_type)) { bytenr += rc->sectorsize; continue; } diff --git a/convert/common.c b/convert/common.c index dea5f5b2..f8bbb23c 100644 --- a/convert/common.c +++ b/convert/common.c @@ -223,7 +223,8 @@ static inline int write_temp_extent_buffer(int fd, struct extent_buffer *buf, { int ret; - csum_tree_block_size(buf, btrfs_csum_sizes[BTRFS_CSUM_TYPE_CRC32], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); /* Temporary extent buffer is always mapped 1:1 on disk */ ret = pwrite(fd, buf->data, buf->len, bytenr); diff --git a/convert/main.c b/convert/main.c index e2fbd3cd..611ca769 100644 --- a/convert/main.c +++ b/convert/main.c @@ -1058,7 +1058,8 @@ static int migrate_super_block(int fd, u64 old_bytenr) BUG_ON(btrfs_super_bytenr(super) != old_bytenr); btrfs_set_super_bytenr(super, BTRFS_SUPER_INFO_OFFSET); - csum_tree_block_size(buf, btrfs_csum_sizes[BTRFS_CSUM_TYPE_CRC32], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[BTRFS_CSUM_TYPE_CRC32], 0, + btrfs_super_csum_type(super)); ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE, BTRFS_SUPER_INFO_OFFSET); if (ret != BTRFS_SUPER_INFO_SIZE) diff --git a/disk-io.c b/disk-io.c index 01314504..a4995a62 100644 --- a/disk-io.c +++ b/disk-io.c @@ -149,7 +149,7 @@ void btrfs_csum_final(u32 crc, u8 *result) } static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, - int verify, int silent) + int verify, int silent, u16 csum_type) { u8 result[BTRFS_CSUM_SIZE]; u32 len; @@ -174,24 +174,27 @@ static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, return 0; } -int csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, int verify) +int csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, int verify, + u16 csum_type) { - return __csum_tree_block_size(buf, csum_size, verify, 0); + return __csum_tree_block_size(buf, csum_size, verify, 0, csum_type); } -int verify_tree_block_csum_silent(struct extent_buffer *buf, u16 csum_size) +int verify_tree_block_csum_silent(struct extent_buffer *buf, u16 csum_size, + u16 csum_type) { - return __csum_tree_block_size(buf, csum_size, 1, 1); + return __csum_tree_block_size(buf, csum_size, 1, 1, csum_type); } int csum_tree_block(struct btrfs_fs_info *fs_info, struct extent_buffer *buf, int verify) { - u16 csum_size = - btrfs_super_csum_size(fs_info->super_copy); + u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); + u16 csum_type = btrfs_super_csum_type(fs_info->super_copy); + if (verify && fs_info->suppress_check_block_errors) - return verify_tree_block_csum_silent(buf, csum_size); - return csum_tree_block_size(buf, csum_size, verify); + return verify_tree_block_csum_silent(buf, csum_size, csum_type); + return csum_tree_block_size(buf, csum_size, verify, csum_type); } struct extent_buffer *btrfs_find_tree_block(struct btrfs_fs_info *fs_info, diff --git a/disk-io.h b/disk-io.h index 7b5c3806..394997ad 100644 --- a/disk-io.h +++ b/disk-io.h @@ -191,8 +191,9 @@ void btrfs_csum_final(u32 crc, u8 *result); int btrfs_open_device(struct btrfs_device *dev); int csum_tree_block_size(struct extent_buffer *buf, u16 csum_sectorsize, - int verify); -int verify_tree_block_csum_silent(struct extent_buffer *buf, u16 csum_size); + int verify, u16 csum_type); +int verify_tree_block_csum_silent(struct extent_buffer *buf, u16 csum_size, + u16 csum_type); int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid); int write_tree_block(struct btrfs_trans_handle *trans, struct btrfs_fs_info *fs_info, diff --git a/mkfs/common.c b/mkfs/common.c index b6e549b1..9762391a 100644 --- a/mkfs/common.c +++ b/mkfs/common.c @@ -101,7 +101,8 @@ static int btrfs_create_tree_root(int fd, struct btrfs_mkfs_config *cfg, } /* generate checksum */ - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); /* write back root tree */ ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_ROOT_TREE]); @@ -292,7 +293,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_EXTENT_TREE]); btrfs_set_header_owner(buf, BTRFS_EXTENT_TREE_OBJECTID); btrfs_set_header_nritems(buf, nritems); - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_EXTENT_TREE]); if (ret != cfg->nodesize) { ret = (ret < 0 ? -errno : -EIO); @@ -380,7 +382,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_CHUNK_TREE]); btrfs_set_header_owner(buf, BTRFS_CHUNK_TREE_OBJECTID); btrfs_set_header_nritems(buf, nritems); - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_CHUNK_TREE]); if (ret != cfg->nodesize) { ret = (ret < 0 ? -errno : -EIO); @@ -420,7 +423,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_DEV_TREE]); btrfs_set_header_owner(buf, BTRFS_DEV_TREE_OBJECTID); btrfs_set_header_nritems(buf, nritems); - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_DEV_TREE]); if (ret != cfg->nodesize) { ret = (ret < 0 ? -errno : -EIO); @@ -433,7 +437,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_FS_TREE]); btrfs_set_header_owner(buf, BTRFS_FS_TREE_OBJECTID); btrfs_set_header_nritems(buf, 0); - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_FS_TREE]); if (ret != cfg->nodesize) { ret = (ret < 0 ? -errno : -EIO); @@ -445,7 +450,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) btrfs_set_header_bytenr(buf, cfg->blocks[MKFS_CSUM_TREE]); btrfs_set_header_owner(buf, BTRFS_CSUM_TREE_OBJECTID); btrfs_set_header_nritems(buf, 0); - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[MKFS_CSUM_TREE]); if (ret != cfg->nodesize) { ret = (ret < 0 ? -errno : -EIO); @@ -456,7 +462,8 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg) memset(buf->data, 0, BTRFS_SUPER_INFO_SIZE); memcpy(buf->data, &super, sizeof(super)); buf->len = BTRFS_SUPER_INFO_SIZE; - csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0); + csum_tree_block_size(buf, btrfs_csum_sizes[cfg->csum_type], 0, + cfg->csum_type); ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE, cfg->blocks[MKFS_SUPER_BLOCK]); if (ret != BTRFS_SUPER_INFO_SIZE) {