dm-verity-target.c (03b18887703c5fa342896e52e873812ea33d964b) | dm-verity-target.c (0ef0b4717aa6849d251b23ae1efe93ca93af540b) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2012 Red Hat, Inc. 4 * 5 * Author: Mikulas Patocka <mpatocka@redhat.com> 6 * 7 * Based on Chromium dm-verity driver (C) 2011 The Chromium OS Authors 8 * --- 100 unchanged lines hidden (view full) --- 109 if (likely(!is_vmalloc_addr(data))) { 110 sg_init_one(&sg, data, len); 111 ahash_request_set_crypt(req, &sg, NULL, len); 112 return crypto_wait_req(crypto_ahash_update(req), wait); 113 } else { 114 do { 115 int r; 116 size_t this_step = min_t(size_t, len, PAGE_SIZE - offset_in_page(data)); | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2012 Red Hat, Inc. 4 * 5 * Author: Mikulas Patocka <mpatocka@redhat.com> 6 * 7 * Based on Chromium dm-verity driver (C) 2011 The Chromium OS Authors 8 * --- 100 unchanged lines hidden (view full) --- 109 if (likely(!is_vmalloc_addr(data))) { 110 sg_init_one(&sg, data, len); 111 ahash_request_set_crypt(req, &sg, NULL, len); 112 return crypto_wait_req(crypto_ahash_update(req), wait); 113 } else { 114 do { 115 int r; 116 size_t this_step = min_t(size_t, len, PAGE_SIZE - offset_in_page(data)); |
117 |
|
117 flush_kernel_vmap_range((void *)data, this_step); 118 sg_init_table(&sg, 1); 119 sg_set_page(&sg, vmalloc_to_page(data), this_step, offset_in_page(data)); 120 ahash_request_set_crypt(req, &sg, NULL, this_step); 121 r = crypto_wait_req(crypto_ahash_update(req), wait); 122 if (unlikely(r)) 123 return r; 124 data += this_step; --- 553 unchanged lines hidden (view full) --- 678 struct dm_verity_prefetch_work *pw = 679 container_of(work, struct dm_verity_prefetch_work, work); 680 struct dm_verity *v = pw->v; 681 int i; 682 683 for (i = v->levels - 2; i >= 0; i--) { 684 sector_t hash_block_start; 685 sector_t hash_block_end; | 118 flush_kernel_vmap_range((void *)data, this_step); 119 sg_init_table(&sg, 1); 120 sg_set_page(&sg, vmalloc_to_page(data), this_step, offset_in_page(data)); 121 ahash_request_set_crypt(req, &sg, NULL, this_step); 122 r = crypto_wait_req(crypto_ahash_update(req), wait); 123 if (unlikely(r)) 124 return r; 125 data += this_step; --- 553 unchanged lines hidden (view full) --- 679 struct dm_verity_prefetch_work *pw = 680 container_of(work, struct dm_verity_prefetch_work, work); 681 struct dm_verity *v = pw->v; 682 int i; 683 684 for (i = v->levels - 2; i >= 0; i--) { 685 sector_t hash_block_start; 686 sector_t hash_block_end; |
687 |
|
686 verity_hash_at_level(v, pw->block, i, &hash_block_start, NULL); 687 verity_hash_at_level(v, pw->block + pw->n_blocks - 1, i, &hash_block_end, NULL); | 688 verity_hash_at_level(v, pw->block, i, &hash_block_start, NULL); 689 verity_hash_at_level(v, pw->block + pw->n_blocks - 1, i, &hash_block_end, NULL); |
690 |
|
688 if (!i) { 689 unsigned int cluster = READ_ONCE(dm_verity_prefetch_cluster); 690 691 cluster >>= v->data_dev_block_bits; 692 if (unlikely(!cluster)) 693 goto no_prefetch_cluster; 694 695 if (unlikely(cluster & (cluster - 1))) --- 666 unchanged lines hidden (view full) --- 1362 ti->error = "Too many tree levels"; 1363 r = -E2BIG; 1364 goto bad; 1365 } 1366 1367 hash_position = v->hash_start; 1368 for (i = v->levels - 1; i >= 0; i--) { 1369 sector_t s; | 691 if (!i) { 692 unsigned int cluster = READ_ONCE(dm_verity_prefetch_cluster); 693 694 cluster >>= v->data_dev_block_bits; 695 if (unlikely(!cluster)) 696 goto no_prefetch_cluster; 697 698 if (unlikely(cluster & (cluster - 1))) --- 666 unchanged lines hidden (view full) --- 1365 ti->error = "Too many tree levels"; 1366 r = -E2BIG; 1367 goto bad; 1368 } 1369 1370 hash_position = v->hash_start; 1371 for (i = v->levels - 1; i >= 0; i--) { 1372 sector_t s; |
1373 |
|
1370 v->hash_level_block[i] = hash_position; 1371 s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1) 1372 >> ((i + 1) * v->hash_per_block_bits); 1373 if (hash_position + s < hash_position) { 1374 ti->error = "Hash device offset overflow"; 1375 r = -E2BIG; 1376 goto bad; 1377 } --- 143 unchanged lines hidden --- | 1374 v->hash_level_block[i] = hash_position; 1375 s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1) 1376 >> ((i + 1) * v->hash_per_block_bits); 1377 if (hash_position + s < hash_position) { 1378 ti->error = "Hash device offset overflow"; 1379 r = -E2BIG; 1380 goto bad; 1381 } --- 143 unchanged lines hidden --- |