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 ---