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

Commit 01482b76 authored by Milan Broz's avatar Milan Broz Committed by Alasdair G Kergon
Browse files

dm crypt: extract scatterlist processing



dm-crypt: Use crypto ablkcipher interface

Move scatterlists to separate dm_crypt_struct and
pick out block processing from crypt_convert.

Signed-off-by: default avatarMilan Broz <mbroz@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 899c95d3
Loading
Loading
Loading
Loading
+39 −24
Original line number Diff line number Diff line
@@ -55,6 +55,11 @@ struct dm_crypt_io {
	sector_t sector;
};

struct dm_crypt_request {
	struct scatterlist sg_in;
	struct scatterlist sg_out;
};

struct crypt_config;

struct crypt_iv_operations {
@@ -339,40 +344,50 @@ static void crypt_convert_init(struct crypt_config *cc,
	ctx->sector = sector + cc->iv_offset;
}

/*
 * Encrypt / decrypt data from one bio to another one (can be the same one)
 */
static int crypt_convert(struct crypt_config *cc,
static int crypt_convert_block(struct crypt_config *cc,
			       struct convert_context *ctx)
{
	int r = 0;

	while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
	      ctx->idx_out < ctx->bio_out->bi_vcnt) {
	struct bio_vec *bv_in = bio_iovec_idx(ctx->bio_in, ctx->idx_in);
	struct bio_vec *bv_out = bio_iovec_idx(ctx->bio_out, ctx->idx_out);
		struct scatterlist sg_in, sg_out;
	struct dm_crypt_request dmreq;

		sg_init_table(&sg_in, 1);
		sg_set_page(&sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT, bv_in->bv_offset + ctx->offset_in);
	sg_init_table(&dmreq.sg_in, 1);
	sg_set_page(&dmreq.sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
		    bv_in->bv_offset + ctx->offset_in);

		sg_init_table(&sg_out, 1);
		sg_set_page(&sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT, bv_out->bv_offset + ctx->offset_out);
	sg_init_table(&dmreq.sg_out, 1);
	sg_set_page(&dmreq.sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT,
		    bv_out->bv_offset + ctx->offset_out);

		ctx->offset_in += sg_in.length;
	ctx->offset_in += 1 << SECTOR_SHIFT;
	if (ctx->offset_in >= bv_in->bv_len) {
		ctx->offset_in = 0;
		ctx->idx_in++;
	}

		ctx->offset_out += sg_out.length;
	ctx->offset_out += 1 << SECTOR_SHIFT;
	if (ctx->offset_out >= bv_out->bv_len) {
		ctx->offset_out = 0;
		ctx->idx_out++;
	}

		r = crypt_convert_scatterlist(cc, &sg_out, &sg_in, sg_in.length,
			bio_data_dir(ctx->bio_in) == WRITE, ctx->sector);
	return crypt_convert_scatterlist(cc, &dmreq.sg_out, &dmreq.sg_in,
					 dmreq.sg_in.length,
					 bio_data_dir(ctx->bio_in) == WRITE,
					 ctx->sector);
}

/*
 * Encrypt / decrypt data from one bio to another one (can be the same one)
 */
static int crypt_convert(struct crypt_config *cc,
			 struct convert_context *ctx)
{
	int r = 0;

	while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
	      ctx->idx_out < ctx->bio_out->bi_vcnt) {
		r = crypt_convert_block(cc, ctx);
		if (r < 0)
			break;