Commit bb4d73ac authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Mike Snitzer

dm verity: factor out verity_for_bv_block()

verity_for_bv_block() will be re-used by optional dm-verity object.
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent ffa39380
...@@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, ...@@ -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) ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment