Skip to content

Commit bb4d73a

Browse files
samitolvanensnitm
authored andcommitted
dm verity: factor out verity_for_bv_block()
verity_for_bv_block() will be re-used by optional dm-verity object. Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
1 parent ffa3938 commit bb4d73a

File tree

2 files changed

+55
-23
lines changed

2 files changed

+55
-23
lines changed

drivers/md/dm-verity-target.c

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io,
333333
return 0;
334334
}
335335

336+
/*
337+
* Calls function process for 1 << v->data_dev_block_bits bytes in the bio_vec
338+
* starting from iter.
339+
*/
340+
int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io,
341+
struct bvec_iter *iter,
342+
int (*process)(struct dm_verity *v,
343+
struct dm_verity_io *io, u8 *data,
344+
size_t len))
345+
{
346+
unsigned todo = 1 << v->data_dev_block_bits;
347+
struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_bio_data_size);
348+
349+
do {
350+
int r;
351+
u8 *page;
352+
unsigned len;
353+
struct bio_vec bv = bio_iter_iovec(bio, *iter);
354+
355+
page = kmap_atomic(bv.bv_page);
356+
len = bv.bv_len;
357+
358+
if (likely(len >= todo))
359+
len = todo;
360+
361+
r = process(v, io, page + bv.bv_offset, len);
362+
kunmap_atomic(page);
363+
364+
if (r < 0)
365+
return r;
366+
367+
bio_advance_iter(bio, iter, len);
368+
todo -= len;
369+
} while (todo);
370+
371+
return 0;
372+
}
373+
374+
static int verity_bv_hash_update(struct dm_verity *v, struct dm_verity_io *io,
375+
u8 *data, size_t len)
376+
{
377+
return verity_hash_update(v, verity_io_hash_desc(v, io), data, len);
378+
}
379+
336380
/*
337381
* Verify one "dm_verity_io" structure.
338382
*/
339383
static int verity_verify_io(struct dm_verity_io *io)
340384
{
341385
struct dm_verity *v = io->v;
342-
struct bio *bio = dm_bio_from_per_bio_data(io,
343-
v->ti->per_bio_data_size);
386+
struct bvec_iter start;
344387
unsigned b;
345388

346389
for (b = 0; b < io->n_blocks; b++) {
347390
int r;
348-
unsigned todo;
349391
struct shash_desc *desc = verity_io_hash_desc(v, io);
350392

351393
r = verity_hash_for_block(v, io, io->block + b,
@@ -357,26 +399,10 @@ static int verity_verify_io(struct dm_verity_io *io)
357399
if (unlikely(r < 0))
358400
return r;
359401

360-
todo = 1 << v->data_dev_block_bits;
361-
do {
362-
u8 *page;
363-
unsigned len;
364-
struct bio_vec bv = bio_iter_iovec(bio, io->iter);
365-
366-
page = kmap_atomic(bv.bv_page);
367-
len = bv.bv_len;
368-
if (likely(len >= todo))
369-
len = todo;
370-
r = verity_hash_update(v, desc, page + bv.bv_offset,
371-
len);
372-
kunmap_atomic(page);
373-
374-
if (unlikely(r < 0))
375-
return r;
376-
377-
bio_advance_iter(bio, &io->iter, len);
378-
todo -= len;
379-
} while (todo);
402+
start = io->iter;
403+
r = verity_for_bv_block(v, io, &io->iter, verity_bv_hash_update);
404+
if (unlikely(r < 0))
405+
return r;
380406

381407
r = verity_hash_final(v, desc, verity_io_real_digest(v, io));
382408
if (unlikely(r < 0))

drivers/md/dm-verity.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ static inline u8 *verity_io_want_digest(struct dm_verity *v,
103103
return (u8 *)(io + 1) + v->shash_descsize + v->digest_size;
104104
}
105105

106+
extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io,
107+
struct bvec_iter *iter,
108+
int (*process)(struct dm_verity *v,
109+
struct dm_verity_io *io,
110+
u8 *data, size_t len));
111+
106112
extern int verity_hash(struct dm_verity *v, struct shash_desc *desc,
107113
const u8 *data, size_t len, u8 *digest);
108114

0 commit comments

Comments
 (0)