Commit e9307e3d authored by Mike Snitzer's avatar Mike Snitzer

dm verity: only copy bvec_iter in verity_verify_io if in_tasklet

Avoid extra bvec_iter copy unless it is needed to allow retrying
verification, that failed from a tasklet, from a workqueue.
Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
parent 0a36463f
...@@ -501,15 +501,22 @@ static int verity_verify_io(struct dm_verity_io *io) ...@@ -501,15 +501,22 @@ static int verity_verify_io(struct dm_verity_io *io)
#if defined(CONFIG_DM_VERITY_FEC) #if defined(CONFIG_DM_VERITY_FEC)
struct bvec_iter start; struct bvec_iter start;
#endif #endif
/* struct bvec_iter iter_copy;
* Copy the iterator in case we need to restart verification in a struct bvec_iter *iter;
* work-queue.
*/
struct bvec_iter iter_copy = io->iter;
struct crypto_wait wait; struct crypto_wait wait;
struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size); struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
unsigned int b; unsigned int b;
if (static_branch_unlikely(&use_tasklet_enabled) && io->in_tasklet) {
/*
* Copy the iterator in case we need to restart
* verification in a work-queue.
*/
iter_copy = io->iter;
iter = &iter_copy;
} else
iter = &io->iter;
for (b = 0; b < io->n_blocks; b++) { for (b = 0; b < io->n_blocks; b++) {
int r; int r;
sector_t cur_block = io->block + b; sector_t cur_block = io->block + b;
...@@ -517,7 +524,7 @@ static int verity_verify_io(struct dm_verity_io *io) ...@@ -517,7 +524,7 @@ static int verity_verify_io(struct dm_verity_io *io)
if (v->validated_blocks && if (v->validated_blocks &&
likely(test_bit(cur_block, v->validated_blocks))) { likely(test_bit(cur_block, v->validated_blocks))) {
verity_bv_skip_block(v, io, &iter_copy); verity_bv_skip_block(v, io, iter);
continue; continue;
} }
...@@ -532,7 +539,7 @@ static int verity_verify_io(struct dm_verity_io *io) ...@@ -532,7 +539,7 @@ static int verity_verify_io(struct dm_verity_io *io)
* If we expect a zero block, don't validate, just * If we expect a zero block, don't validate, just
* return zeros. * return zeros.
*/ */
r = verity_for_bv_block(v, io, &iter_copy, r = verity_for_bv_block(v, io, iter,
verity_bv_zero); verity_bv_zero);
if (unlikely(r < 0)) if (unlikely(r < 0))
return r; return r;
...@@ -546,9 +553,9 @@ static int verity_verify_io(struct dm_verity_io *io) ...@@ -546,9 +553,9 @@ static int verity_verify_io(struct dm_verity_io *io)
#if defined(CONFIG_DM_VERITY_FEC) #if defined(CONFIG_DM_VERITY_FEC)
if (verity_fec_is_enabled(v)) if (verity_fec_is_enabled(v))
start = iter_copy; start = *iter;
#endif #endif
r = verity_for_io_block(v, io, &iter_copy, &wait); r = verity_for_io_block(v, io, iter, &wait);
if (unlikely(r < 0)) if (unlikely(r < 0))
return r; return r;
......
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