| Index: dm-bht.c
|
| diff --git a/dm-bht.c b/dm-bht.c
|
| index e3da9c55f25eb30bf3212b04e638548e29630512..72af2a7033019190b28b513484a6724aaba7166e 100644
|
| --- a/dm-bht.c
|
| +++ b/dm-bht.c
|
| @@ -20,6 +20,7 @@
|
| #include <linux/dm-bht.h>
|
| #include <linux/kernel.h>
|
| #include <linux/module.h>
|
| +#include <linux/mm_types.h>
|
| #include <linux/scatterlist.h>
|
| #include <linux/slab.h> /* k*alloc */
|
| #include <linux/string.h> /* memset */
|
| @@ -95,24 +96,14 @@ typedef int (*dm_bht_compare_cb)(struct dm_bht *, u8 *, u8 *);
|
| /**
|
| * dm_bht_compute_hash: hashes a page of data
|
| */
|
| -static int dm_bht_compute_hash(struct dm_bht *bht, const void *block,
|
| - u8 *digest)
|
| +static int dm_bht_compute_hash(struct dm_bht *bht, struct page *pg,
|
| + unsigned int offset, u8 *digest)
|
| {
|
| struct hash_desc *hash_desc = &bht->hash_desc[smp_processor_id()];
|
| struct scatterlist sg;
|
|
|
| - /* TODO(msb): Once we supporting block_size < PAGE_SIZE, change this to:
|
| - * offset_into_page + length < page_size
|
| - * For now just check that block is page-aligned.
|
| - */
|
| - /*
|
| - * TODO(msb): Re-enable once user-space code is modified to use
|
| - * aligned buffers.
|
| - * BUG_ON(!IS_ALIGNED((uintptr_t)block, PAGE_SIZE));
|
| - */
|
| -
|
| sg_init_table(&sg, 1);
|
| - sg_set_buf(&sg, block, PAGE_SIZE);
|
| + sg_set_page(&sg, pg, PAGE_SIZE, offset);
|
| /* Note, this is synchronous. */
|
| if (crypto_hash_init(hash_desc)) {
|
| DMCRIT("failed to reinitialize crypto hash (proc:%d)",
|
| @@ -653,7 +644,7 @@ static int dm_bht_verify_root(struct dm_bht *bht,
|
| * Verifies the path. Returns 0 on ok.
|
| */
|
| static int dm_bht_verify_path(struct dm_bht *bht, unsigned int block_index,
|
| - const void *block)
|
| + struct page *pg, unsigned int offset)
|
| {
|
| unsigned int depth = bht->depth;
|
| struct dm_bht_entry *entry;
|
| @@ -674,14 +665,15 @@ static int dm_bht_verify_path(struct dm_bht *bht, unsigned int block_index,
|
| BUG_ON(state < DM_BHT_ENTRY_READY);
|
| node = dm_bht_get_node(bht, entry, depth, block_index);
|
|
|
| - if (dm_bht_compute_hash(bht, block, digest) ||
|
| + if (dm_bht_compute_hash(bht, pg, offset, digest) ||
|
| dm_bht_compare_hash(bht, digest, node))
|
| goto mismatch;
|
|
|
| /* Keep the containing block of hashes to be verified in the
|
| * next pass.
|
| */
|
| - block = entry->nodes;
|
| + pg = virt_to_page(entry->nodes);
|
| + offset = 0;
|
| } while (--depth > 0 && state != DM_BHT_ENTRY_VERIFIED);
|
|
|
| /* Mark path to leaf as verified. */
|
| @@ -776,7 +768,7 @@ int dm_bht_store_block(struct dm_bht *bht, unsigned int block_index,
|
| return 1;
|
| }
|
|
|
| - dm_bht_compute_hash(bht, block_data,
|
| + dm_bht_compute_hash(bht, virt_to_page(block_data), 0,
|
| dm_bht_node(bht, entry, node_index));
|
| return 0;
|
| }
|
| @@ -846,10 +838,10 @@ int dm_bht_compute(struct dm_bht *bht, void *read_cb_ctx)
|
| if (count == 0)
|
| count = bht->node_count;
|
| for (j = 0; j < count; j++, child++) {
|
| - u8 *block = child->nodes;
|
| + struct page *pg = virt_to_page(child->nodes);
|
| u8 *digest = dm_bht_node(bht, entry, j);
|
|
|
| - r = dm_bht_compute_hash(bht, block, digest);
|
| + r = dm_bht_compute_hash(bht, pg, 0, digest);
|
| if (r) {
|
| DMERR("Failed to update (d=%u,i=%u)",
|
| depth, i);
|
| @@ -1026,10 +1018,12 @@ EXPORT_SYMBOL(dm_bht_populate);
|
| * should return similarly.
|
| */
|
| int dm_bht_verify_block(struct dm_bht *bht, unsigned int block_index,
|
| - const void *block)
|
| + struct page *pg, unsigned int offset)
|
| {
|
| int r = 0;
|
|
|
| + BUG_ON(offset != 0);
|
| +
|
| /* Make sure that the root has been verified */
|
| if (atomic_read(&bht->root_state) != DM_BHT_ENTRY_VERIFIED) {
|
| r = dm_bht_verify_root(bht, dm_bht_compare_hash);
|
| @@ -1040,7 +1034,7 @@ int dm_bht_verify_block(struct dm_bht *bht, unsigned int block_index,
|
| }
|
|
|
| /* Now check levels in between */
|
| - r = dm_bht_verify_path(bht, block_index, block);
|
| + r = dm_bht_verify_path(bht, block_index, pg, offset);
|
| if (r)
|
| DMERR_LIMIT("Failed to verify block: %u (%d)", block_index, r);
|
|
|
|
|