UPSTREAM: dm verity: factor out verity_for_bv_block()
verity_for_bv_block() will be re-used by optional dm-verity object. Change-Id: I80e0f8e7c9f234fce3fbdf21cb05aba3041d7f98 Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> (cherry picked from commit bb4d73ac5e4f0a6c4853f35824f6cb2d396a2f9c)
This commit is contained in:
parent
3ec912f8ef
commit
890b7865c5
2 changed files with 55 additions and 23 deletions
|
@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calls function process for 1 << v->data_dev_block_bits bytes in the bio_vec
|
||||||
|
* starting from iter.
|
||||||
|
*/
|
||||||
|
int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io,
|
||||||
|
struct bvec_iter *iter,
|
||||||
|
int (*process)(struct dm_verity *v,
|
||||||
|
struct dm_verity_io *io, u8 *data,
|
||||||
|
size_t len))
|
||||||
|
{
|
||||||
|
unsigned todo = 1 << v->data_dev_block_bits;
|
||||||
|
struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_bio_data_size);
|
||||||
|
|
||||||
|
do {
|
||||||
|
int r;
|
||||||
|
u8 *page;
|
||||||
|
unsigned len;
|
||||||
|
struct bio_vec bv = bio_iter_iovec(bio, *iter);
|
||||||
|
|
||||||
|
page = kmap_atomic(bv.bv_page);
|
||||||
|
len = bv.bv_len;
|
||||||
|
|
||||||
|
if (likely(len >= todo))
|
||||||
|
len = todo;
|
||||||
|
|
||||||
|
r = process(v, io, page + bv.bv_offset, len);
|
||||||
|
kunmap_atomic(page);
|
||||||
|
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
bio_advance_iter(bio, iter, len);
|
||||||
|
todo -= len;
|
||||||
|
} while (todo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int verity_bv_hash_update(struct dm_verity *v, struct dm_verity_io *io,
|
||||||
|
u8 *data, size_t len)
|
||||||
|
{
|
||||||
|
return verity_hash_update(v, verity_io_hash_desc(v, io), data, len);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verify one "dm_verity_io" structure.
|
* Verify one "dm_verity_io" structure.
|
||||||
*/
|
*/
|
||||||
static int verity_verify_io(struct dm_verity_io *io)
|
static int verity_verify_io(struct dm_verity_io *io)
|
||||||
{
|
{
|
||||||
struct dm_verity *v = io->v;
|
struct dm_verity *v = io->v;
|
||||||
struct bio *bio = dm_bio_from_per_bio_data(io,
|
struct bvec_iter start;
|
||||||
v->ti->per_bio_data_size);
|
|
||||||
unsigned b;
|
unsigned b;
|
||||||
|
|
||||||
for (b = 0; b < io->n_blocks; b++) {
|
for (b = 0; b < io->n_blocks; b++) {
|
||||||
int r;
|
int r;
|
||||||
unsigned todo;
|
|
||||||
struct shash_desc *desc = verity_io_hash_desc(v, io);
|
struct shash_desc *desc = verity_io_hash_desc(v, io);
|
||||||
|
|
||||||
r = verity_hash_for_block(v, io, io->block + b,
|
r = verity_hash_for_block(v, io, io->block + b,
|
||||||
|
@ -357,26 +399,10 @@ static int verity_verify_io(struct dm_verity_io *io)
|
||||||
if (unlikely(r < 0))
|
if (unlikely(r < 0))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
todo = 1 << v->data_dev_block_bits;
|
start = io->iter;
|
||||||
do {
|
r = verity_for_bv_block(v, io, &io->iter, verity_bv_hash_update);
|
||||||
u8 *page;
|
if (unlikely(r < 0))
|
||||||
unsigned len;
|
return r;
|
||||||
struct bio_vec bv = bio_iter_iovec(bio, io->iter);
|
|
||||||
|
|
||||||
page = kmap_atomic(bv.bv_page);
|
|
||||||
len = bv.bv_len;
|
|
||||||
if (likely(len >= todo))
|
|
||||||
len = todo;
|
|
||||||
r = verity_hash_update(v, desc, page + bv.bv_offset,
|
|
||||||
len);
|
|
||||||
kunmap_atomic(page);
|
|
||||||
|
|
||||||
if (unlikely(r < 0))
|
|
||||||
return r;
|
|
||||||
|
|
||||||
bio_advance_iter(bio, &io->iter, len);
|
|
||||||
todo -= len;
|
|
||||||
} while (todo);
|
|
||||||
|
|
||||||
r = verity_hash_final(v, desc, verity_io_real_digest(v, io));
|
r = verity_hash_final(v, desc, verity_io_real_digest(v, io));
|
||||||
if (unlikely(r < 0))
|
if (unlikely(r < 0))
|
||||||
|
|
|
@ -103,6 +103,12 @@ static inline u8 *verity_io_want_digest(struct dm_verity *v,
|
||||||
return (u8 *)(io + 1) + v->shash_descsize + v->digest_size;
|
return (u8 *)(io + 1) + v->shash_descsize + v->digest_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io,
|
||||||
|
struct bvec_iter *iter,
|
||||||
|
int (*process)(struct dm_verity *v,
|
||||||
|
struct dm_verity_io *io,
|
||||||
|
u8 *data, size_t len));
|
||||||
|
|
||||||
extern int verity_hash(struct dm_verity *v, struct shash_desc *desc,
|
extern int verity_hash(struct dm_verity *v, struct shash_desc *desc,
|
||||||
const u8 *data, size_t len, u8 *digest);
|
const u8 *data, size_t len, u8 *digest);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue