diff options
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r-- | fs/btrfs/compression.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 92291f266324..935c0c564c02 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/sched/mm.h> | 18 | #include <linux/sched/mm.h> |
19 | #include <linux/log2.h> | 19 | #include <linux/log2.h> |
20 | #include <crypto/hash.h> | ||
20 | #include "ctree.h" | 21 | #include "ctree.h" |
21 | #include "disk-io.h" | 22 | #include "disk-io.h" |
22 | #include "transaction.h" | 23 | #include "transaction.h" |
@@ -58,29 +59,33 @@ static int check_compressed_csum(struct btrfs_inode *inode, | |||
58 | u64 disk_start) | 59 | u64 disk_start) |
59 | { | 60 | { |
60 | struct btrfs_fs_info *fs_info = inode->root->fs_info; | 61 | struct btrfs_fs_info *fs_info = inode->root->fs_info; |
62 | SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); | ||
61 | const u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); | 63 | const u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); |
62 | int ret; | 64 | int ret; |
63 | struct page *page; | 65 | struct page *page; |
64 | unsigned long i; | 66 | unsigned long i; |
65 | char *kaddr; | 67 | char *kaddr; |
66 | u32 csum; | 68 | u8 csum[BTRFS_CSUM_SIZE]; |
67 | u8 *cb_sum = cb->sums; | 69 | u8 *cb_sum = cb->sums; |
68 | 70 | ||
69 | if (inode->flags & BTRFS_INODE_NODATASUM) | 71 | if (inode->flags & BTRFS_INODE_NODATASUM) |
70 | return 0; | 72 | return 0; |
71 | 73 | ||
74 | shash->tfm = fs_info->csum_shash; | ||
75 | |||
72 | for (i = 0; i < cb->nr_pages; i++) { | 76 | for (i = 0; i < cb->nr_pages; i++) { |
73 | page = cb->compressed_pages[i]; | 77 | page = cb->compressed_pages[i]; |
74 | csum = ~(u32)0; | ||
75 | 78 | ||
79 | crypto_shash_init(shash); | ||
76 | kaddr = kmap_atomic(page); | 80 | kaddr = kmap_atomic(page); |
77 | csum = btrfs_csum_data(kaddr, csum, PAGE_SIZE); | 81 | crypto_shash_update(shash, kaddr, PAGE_SIZE); |
78 | btrfs_csum_final(csum, (u8 *)&csum); | ||
79 | kunmap_atomic(kaddr); | 82 | kunmap_atomic(kaddr); |
83 | crypto_shash_final(shash, (u8 *)&csum); | ||
80 | 84 | ||
81 | if (memcmp(&csum, cb_sum, csum_size)) { | 85 | if (memcmp(&csum, cb_sum, csum_size)) { |
82 | btrfs_print_data_csum_error(inode, disk_start, csum, | 86 | btrfs_print_data_csum_error(inode, disk_start, |
83 | *(u32 *)cb_sum, cb->mirror_num); | 87 | *(u32 *)csum, *(u32 *)cb_sum, |
88 | cb->mirror_num); | ||
84 | ret = -EIO; | 89 | ret = -EIO; |
85 | goto fail; | 90 | goto fail; |
86 | } | 91 | } |