summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/compression.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r--fs/btrfs/compression.c17
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 }