| Index: dm-bht.c
|
| diff --git a/dm-bht.c b/dm-bht.c
|
| index 6c07f35bab5b314dc7bb98c6a02de4e794e6956a..bc662cbd188500158fc6e1691c38f3110c285101 100644
|
| --- a/dm-bht.c
|
| +++ b/dm-bht.c
|
| @@ -93,17 +93,12 @@ static void dm_bht_log_mismatch(struct dm_bht *bht, u8 *given, u8 *computed)
|
| typedef int (*dm_bht_compare_cb)(struct dm_bht *, u8 *, u8 *);
|
|
|
| /**
|
| - * dm_bht_compute_and_compare: hashes a page of data; compares it to a hash
|
| + * dm_bht_compute_hash: hashes a page of data
|
| */
|
| -static int dm_bht_compute_and_compare(struct dm_bht *bht,
|
| - struct hash_desc *hash_desc,
|
| - struct page *page,
|
| - u8 *expected_digest,
|
| - dm_bht_compare_cb compare_cb)
|
| +static int dm_bht_compute_hash(struct dm_bht *bht, struct hash_desc *hash_desc,
|
| + struct page *page, u8 *digest)
|
| {
|
| struct scatterlist sg;
|
| - u8 digest[DM_BHT_MAX_DIGEST_SIZE];
|
| - int result;
|
|
|
| sg_init_table(&sg, 1);
|
| sg_set_page(&sg, page, PAGE_SIZE, 0);
|
| @@ -118,12 +113,7 @@ static int dm_bht_compute_and_compare(struct dm_bht *bht,
|
| return -EINVAL;
|
| }
|
|
|
| - result = compare_cb(bht, expected_digest, digest);
|
| -#ifdef CONFIG_DM_DEBUG
|
| - if (result)
|
| - dm_bht_log_mismatch(bht, expected_digest, digest);
|
| -#endif
|
| - return result;
|
| + return 0;
|
| }
|
|
|
| static __always_inline struct dm_bht_level *dm_bht_get_level(struct dm_bht *bht,
|
| @@ -716,15 +706,16 @@ static int dm_bht_verify_root(struct dm_bht *bht,
|
| /* dm_bht_verify_path
|
| * Verifies the path from block_index to depth=0. Returns 0 on ok.
|
| */
|
| -static int dm_bht_verify_path(struct dm_bht *bht, unsigned int block_index,
|
| - dm_bht_compare_cb compare_cb)
|
| +static int dm_bht_verify_path(struct dm_bht *bht, unsigned int block_index)
|
| {
|
| unsigned int depth = bht->depth - 1;
|
| struct dm_bht_entry *entry = dm_bht_get_entry(bht, depth, block_index);
|
| struct hash_desc *hash_desc = &bht->hash_desc[smp_processor_id()];
|
|
|
| while (depth > 0) {
|
| + u8 digest[DM_BHT_MAX_DIGEST_SIZE];
|
| struct dm_bht_entry *parent;
|
| + struct page *page;
|
| u8 *node;
|
| int state;
|
|
|
| @@ -761,10 +752,10 @@ static int dm_bht_verify_path(struct dm_bht *bht, unsigned int block_index,
|
| */
|
| BUG_ON(atomic_read(&parent->state) < DM_BHT_ENTRY_READY);
|
| node = dm_bht_get_node(bht, parent, depth, block_index);
|
| + page = virt_to_page(entry->nodes);
|
|
|
| - if (dm_bht_compute_and_compare(bht, hash_desc,
|
| - virt_to_page(entry->nodes),
|
| - node, compare_cb)) {
|
| + if (dm_bht_compute_hash(bht, hash_desc, page, digest) ||
|
| + dm_bht_compare_hash(bht, digest, node)) {
|
| DMERR("failed to verify entry's hash against parent "
|
| "(d=%u,bi=%u)", depth, block_index);
|
| goto mismatch;
|
| @@ -860,9 +851,8 @@ int dm_bht_store_block(struct dm_bht *bht, unsigned int block_index,
|
| }
|
|
|
| hash_desc = &bht->hash_desc[smp_processor_id()];
|
| - dm_bht_compute_and_compare(bht, hash_desc, virt_to_page(block_data),
|
| - dm_bht_node(bht, entry, node_index),
|
| - &dm_bht_update_hash);
|
| + dm_bht_compute_hash(bht, hash_desc, virt_to_page(block_data),
|
| + dm_bht_node(bht, entry, node_index));
|
| return 0;
|
| }
|
| EXPORT_SYMBOL(dm_bht_store_block);
|
| @@ -931,8 +921,8 @@ int dm_bht_compute(struct dm_bht *bht, void *read_cb_ctx)
|
| struct page *pg = virt_to_page(child->nodes);
|
| u8 *node = dm_bht_node(bht, entry, j);
|
|
|
| - r = dm_bht_compute_and_compare(bht, hash_desc,
|
| - pg, node, dm_bht_update_hash);
|
| + r = dm_bht_compute_hash(bht, hash_desc,
|
| + pg, node);
|
| if (r) {
|
| DMERR("Failed to update (d=%u,i=%u)",
|
| depth, i);
|
| @@ -1140,9 +1130,7 @@ int dm_bht_verify_block(struct dm_bht *bht, unsigned int block_index,
|
| return unverified;
|
|
|
| /* Now check levels in between */
|
| - unverified = dm_bht_verify_path(bht,
|
| - block_index,
|
| - dm_bht_compare_hash);
|
| + unverified = dm_bht_verify_path(bht, block_index);
|
| if (unverified)
|
| DMERR_LIMIT("Failed to verify intermediary nodes for block: %u (%d)",
|
| block_index, unverified);
|
|
|