Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c3c5eed authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Gerrit - the friendly Code Review server
Browse files

UPSTREAM: dm verity: factor out verity_for_bv_block()



(cherry-picked from bb4d73ac5e4f0a6c4853f35824f6cb2d396a2f9c)

verity_for_bv_block() will be re-used by optional dm-verity object.

Bug: 21893453

Change-Id: Ib2f74553faaa6e0e3f5adf7d3742d5b4bfe15089
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Git-commit: 42e8a0d2
Git-repo: https://git.linaro.org/kernel/linux-linaro-stable.git


Signed-off-by: default avatarImran Khan <kimran@codeaurora.org>
parent 2baabee2
Loading
Loading
Loading
Loading
+49 −23
Original line number Diff line number Diff line
@@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io,
	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.
 */
static int verity_verify_io(struct dm_verity_io *io)
{
	struct dm_verity *v = io->v;
	struct bio *bio = dm_bio_from_per_bio_data(io,
						   v->ti->per_bio_data_size);
	struct bvec_iter start;
	unsigned b;

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

		r = verity_hash_for_block(v, io, io->block + b,
@@ -357,27 +399,11 @@ static int verity_verify_io(struct dm_verity_io *io)
		if (unlikely(r < 0))
			return r;

		todo = 1 << v->data_dev_block_bits;
		do {
			u8 *page;
			unsigned len;
			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);

		start = io->iter;
		r = verity_for_bv_block(v, io, &io->iter, verity_bv_hash_update);
		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));
		if (unlikely(r < 0))
			return r;
+6 −0
Original line number Diff line number Diff line
@@ -104,6 +104,12 @@ static inline u8 *verity_io_want_digest(struct dm_verity *v,
	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,
		       const u8 *data, size_t len, u8 *digest);