dm-crypt.c 30.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * Copyright (C) 2003 Christophe Saout <christophe@saout.de>
 * Copyright (C) 2004 Clemens Fruhwirth <clemens@endorphin.org>
M
Milan Broz 已提交
4
 * Copyright (C) 2006-2008 Red Hat, Inc. All rights reserved.
L
Linus Torvalds 已提交
5 6 7 8
 *
 * This file is released under the GPL.
 */

M
Milan Broz 已提交
9
#include <linux/completion.h>
10
#include <linux/err.h>
L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18 19
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/bio.h>
#include <linux/blkdev.h>
#include <linux/mempool.h>
#include <linux/slab.h>
#include <linux/crypto.h>
#include <linux/workqueue.h>
20
#include <linux/backing-dev.h>
L
Linus Torvalds 已提交
21
#include <asm/atomic.h>
22
#include <linux/scatterlist.h>
L
Linus Torvalds 已提交
23
#include <asm/page.h>
24
#include <asm/unaligned.h>
L
Linus Torvalds 已提交
25

26
#include <linux/device-mapper.h>
L
Linus Torvalds 已提交
27

28
#define DM_MSG_PREFIX "crypt"
M
Milan Broz 已提交
29
#define MESG_STR(x) x, sizeof(x)
L
Linus Torvalds 已提交
30 31 32 33 34

/*
 * context holding the current state of a multi-part conversion
 */
struct convert_context {
M
Milan Broz 已提交
35
	struct completion restart;
L
Linus Torvalds 已提交
36 37 38 39 40 41 42
	struct bio *bio_in;
	struct bio *bio_out;
	unsigned int offset_in;
	unsigned int offset_out;
	unsigned int idx_in;
	unsigned int idx_out;
	sector_t sector;
M
Milan Broz 已提交
43
	atomic_t pending;
L
Linus Torvalds 已提交
44 45
};

46 47 48 49 50 51 52 53 54 55 56 57
/*
 * per bio private data
 */
struct dm_crypt_io {
	struct dm_target *target;
	struct bio *base_bio;
	struct work_struct work;

	struct convert_context ctx;

	atomic_t pending;
	int error;
58
	sector_t sector;
M
Milan Broz 已提交
59
	struct dm_crypt_io *base_io;
60 61
};

62 63 64 65 66
struct dm_crypt_request {
	struct scatterlist sg_in;
	struct scatterlist sg_out;
};

L
Linus Torvalds 已提交
67 68 69 70
struct crypt_config;

struct crypt_iv_operations {
	int (*ctr)(struct crypt_config *cc, struct dm_target *ti,
M
Milan Broz 已提交
71
		   const char *opts);
L
Linus Torvalds 已提交
72 73 74 75 76 77 78 79 80
	void (*dtr)(struct crypt_config *cc);
	const char *(*status)(struct crypt_config *cc);
	int (*generator)(struct crypt_config *cc, u8 *iv, sector_t sector);
};

/*
 * Crypt: maps a linear range of a block device
 * and encrypts / decrypts at the same time.
 */
M
Milan Broz 已提交
81
enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID };
L
Linus Torvalds 已提交
82 83 84 85 86
struct crypt_config {
	struct dm_dev *dev;
	sector_t start;

	/*
M
Milan Broz 已提交
87 88
	 * pool for per bio private data, crypto requests and
	 * encryption requeusts/buffer pages
L
Linus Torvalds 已提交
89 90
	 */
	mempool_t *io_pool;
M
Milan Broz 已提交
91
	mempool_t *req_pool;
L
Linus Torvalds 已提交
92
	mempool_t *page_pool;
M
Milan Broz 已提交
93
	struct bio_set *bs;
L
Linus Torvalds 已提交
94

M
Milan Broz 已提交
95 96
	struct workqueue_struct *io_queue;
	struct workqueue_struct *crypt_queue;
M
Milan Broz 已提交
97

L
Linus Torvalds 已提交
98 99 100 101 102
	/*
	 * crypto related data
	 */
	struct crypt_iv_operations *iv_gen_ops;
	char *iv_mode;
103 104 105 106
	union {
		struct crypto_cipher *essiv_tfm;
		int benbi_shift;
	} iv_gen_private;
L
Linus Torvalds 已提交
107 108 109
	sector_t iv_offset;
	unsigned int iv_size;

M
Milan Broz 已提交
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
	/*
	 * Layout of each crypto request:
	 *
	 *   struct ablkcipher_request
	 *      context
	 *      padding
	 *   struct dm_crypt_request
	 *      padding
	 *   IV
	 *
	 * The padding is added so that dm_crypt_request and the IV are
	 * correctly aligned.
	 */
	unsigned int dmreq_start;
	struct ablkcipher_request *req;

126 127
	char cipher[CRYPTO_MAX_ALG_NAME];
	char chainmode[CRYPTO_MAX_ALG_NAME];
M
Milan Broz 已提交
128
	struct crypto_ablkcipher *tfm;
M
Milan Broz 已提交
129
	unsigned long flags;
L
Linus Torvalds 已提交
130 131 132 133
	unsigned int key_size;
	u8 key[0];
};

M
Milan Broz 已提交
134
#define MIN_IOS        16
L
Linus Torvalds 已提交
135 136 137
#define MIN_POOL_PAGES 32
#define MIN_BIO_PAGES  8

138
static struct kmem_cache *_crypt_io_pool;
L
Linus Torvalds 已提交
139

A
Alasdair G Kergon 已提交
140
static void clone_init(struct dm_crypt_io *, struct bio *);
141
static void kcryptd_queue_crypt(struct dm_crypt_io *io);
O
Olaf Kirch 已提交
142

L
Linus Torvalds 已提交
143 144 145
/*
 * Different IV generation algorithms:
 *
146
 * plain: the initial vector is the 32-bit little-endian version of the sector
147
 *        number, padded with zeros if necessary.
L
Linus Torvalds 已提交
148
 *
149 150 151
 * essiv: "encrypted sector|salt initial vector", the sector number is
 *        encrypted with the bulk cipher using a salt as key. The salt
 *        should be derived from the bulk cipher's key via hashing.
L
Linus Torvalds 已提交
152
 *
153 154 155
 * benbi: the 64-bit "big-endian 'narrow block'-count", starting at 1
 *        (needed for LRW-32-AES and possible other narrow block modes)
 *
L
Ludwig Nussel 已提交
156 157 158
 * null: the initial vector is always zero.  Provides compatibility with
 *       obsolete loop_fish2 devices.  Do not use for new devices.
 *
L
Linus Torvalds 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171
 * plumb: unimplemented, see:
 * http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/454
 */

static int crypt_iv_plain_gen(struct crypt_config *cc, u8 *iv, sector_t sector)
{
	memset(iv, 0, cc->iv_size);
	*(u32 *)iv = cpu_to_le32(sector & 0xffffffff);

	return 0;
}

static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti,
M
Milan Broz 已提交
172
			      const char *opts)
L
Linus Torvalds 已提交
173
{
174
	struct crypto_cipher *essiv_tfm;
175 176
	struct crypto_hash *hash_tfm;
	struct hash_desc desc;
L
Linus Torvalds 已提交
177 178 179
	struct scatterlist sg;
	unsigned int saltsize;
	u8 *salt;
180
	int err;
L
Linus Torvalds 已提交
181 182

	if (opts == NULL) {
183
		ti->error = "Digest algorithm missing for ESSIV mode";
L
Linus Torvalds 已提交
184 185 186 187
		return -EINVAL;
	}

	/* Hash the cipher key with the given hash algorithm */
188 189
	hash_tfm = crypto_alloc_hash(opts, 0, CRYPTO_ALG_ASYNC);
	if (IS_ERR(hash_tfm)) {
190
		ti->error = "Error initializing ESSIV hash";
191
		return PTR_ERR(hash_tfm);
L
Linus Torvalds 已提交
192 193
	}

194
	saltsize = crypto_hash_digestsize(hash_tfm);
L
Linus Torvalds 已提交
195 196
	salt = kmalloc(saltsize, GFP_KERNEL);
	if (salt == NULL) {
197
		ti->error = "Error kmallocing salt storage in ESSIV";
198
		crypto_free_hash(hash_tfm);
L
Linus Torvalds 已提交
199 200 201
		return -ENOMEM;
	}

202
	sg_init_one(&sg, cc->key, cc->key_size);
203 204 205 206 207 208 209
	desc.tfm = hash_tfm;
	desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
	err = crypto_hash_digest(&desc, &sg, cc->key_size, salt);
	crypto_free_hash(hash_tfm);

	if (err) {
		ti->error = "Error calculating hash in ESSIV";
210
		kfree(salt);
211 212
		return err;
	}
L
Linus Torvalds 已提交
213 214

	/* Setup the essiv_tfm with the given salt */
215 216
	essiv_tfm = crypto_alloc_cipher(cc->cipher, 0, CRYPTO_ALG_ASYNC);
	if (IS_ERR(essiv_tfm)) {
217
		ti->error = "Error allocating crypto tfm for ESSIV";
L
Linus Torvalds 已提交
218
		kfree(salt);
219
		return PTR_ERR(essiv_tfm);
L
Linus Torvalds 已提交
220
	}
221
	if (crypto_cipher_blocksize(essiv_tfm) !=
M
Milan Broz 已提交
222
	    crypto_ablkcipher_ivsize(cc->tfm)) {
223
		ti->error = "Block size of ESSIV cipher does "
M
Milan Broz 已提交
224
			    "not match IV size of block cipher";
225
		crypto_free_cipher(essiv_tfm);
L
Linus Torvalds 已提交
226 227 228
		kfree(salt);
		return -EINVAL;
	}
229 230
	err = crypto_cipher_setkey(essiv_tfm, salt, saltsize);
	if (err) {
231
		ti->error = "Failed to set key for ESSIV cipher";
232
		crypto_free_cipher(essiv_tfm);
L
Linus Torvalds 已提交
233
		kfree(salt);
234
		return err;
L
Linus Torvalds 已提交
235 236 237
	}
	kfree(salt);

238
	cc->iv_gen_private.essiv_tfm = essiv_tfm;
L
Linus Torvalds 已提交
239 240 241 242 243
	return 0;
}

static void crypt_iv_essiv_dtr(struct crypt_config *cc)
{
244 245
	crypto_free_cipher(cc->iv_gen_private.essiv_tfm);
	cc->iv_gen_private.essiv_tfm = NULL;
L
Linus Torvalds 已提交
246 247 248 249 250 251
}

static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector)
{
	memset(iv, 0, cc->iv_size);
	*(u64 *)iv = cpu_to_le64(sector);
252
	crypto_cipher_encrypt_one(cc->iv_gen_private.essiv_tfm, iv, iv);
L
Linus Torvalds 已提交
253 254 255
	return 0;
}

256 257 258
static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti,
			      const char *opts)
{
M
Milan Broz 已提交
259
	unsigned bs = crypto_ablkcipher_blocksize(cc->tfm);
260
	int log = ilog2(bs);
261 262 263 264 265 266 267 268 269 270 271 272 273 274

	/* we need to calculate how far we must shift the sector count
	 * to get the cipher block count, we use this shift in _gen */

	if (1 << log != bs) {
		ti->error = "cypher blocksize is not a power of 2";
		return -EINVAL;
	}

	if (log > 9) {
		ti->error = "cypher blocksize is > 512";
		return -EINVAL;
	}

275
	cc->iv_gen_private.benbi_shift = 9 - log;
276 277 278 279 280 281 282 283 284 285

	return 0;
}

static void crypt_iv_benbi_dtr(struct crypt_config *cc)
{
}

static int crypt_iv_benbi_gen(struct crypt_config *cc, u8 *iv, sector_t sector)
{
286 287
	__be64 val;

288
	memset(iv, 0, cc->iv_size - sizeof(u64)); /* rest is cleared below */
289 290 291

	val = cpu_to_be64(((u64)sector << cc->iv_gen_private.benbi_shift) + 1);
	put_unaligned(val, (__be64 *)(iv + cc->iv_size - sizeof(u64)));
292

L
Linus Torvalds 已提交
293 294 295
	return 0;
}

L
Ludwig Nussel 已提交
296 297 298 299 300 301 302
static int crypt_iv_null_gen(struct crypt_config *cc, u8 *iv, sector_t sector)
{
	memset(iv, 0, cc->iv_size);

	return 0;
}

L
Linus Torvalds 已提交
303 304 305 306 307 308 309 310 311 312
static struct crypt_iv_operations crypt_iv_plain_ops = {
	.generator = crypt_iv_plain_gen
};

static struct crypt_iv_operations crypt_iv_essiv_ops = {
	.ctr       = crypt_iv_essiv_ctr,
	.dtr       = crypt_iv_essiv_dtr,
	.generator = crypt_iv_essiv_gen
};

313 314 315 316 317
static struct crypt_iv_operations crypt_iv_benbi_ops = {
	.ctr	   = crypt_iv_benbi_ctr,
	.dtr	   = crypt_iv_benbi_dtr,
	.generator = crypt_iv_benbi_gen
};
L
Linus Torvalds 已提交
318

L
Ludwig Nussel 已提交
319 320 321 322
static struct crypt_iv_operations crypt_iv_null_ops = {
	.generator = crypt_iv_null_gen
};

M
Milan Broz 已提交
323 324 325
static void crypt_convert_init(struct crypt_config *cc,
			       struct convert_context *ctx,
			       struct bio *bio_out, struct bio *bio_in,
326
			       sector_t sector)
L
Linus Torvalds 已提交
327 328 329 330 331 332 333 334
{
	ctx->bio_in = bio_in;
	ctx->bio_out = bio_out;
	ctx->offset_in = 0;
	ctx->offset_out = 0;
	ctx->idx_in = bio_in ? bio_in->bi_idx : 0;
	ctx->idx_out = bio_out ? bio_out->bi_idx : 0;
	ctx->sector = sector + cc->iv_offset;
M
Milan Broz 已提交
335
	init_completion(&ctx->restart);
L
Linus Torvalds 已提交
336 337
}

338
static int crypt_convert_block(struct crypt_config *cc,
M
Milan Broz 已提交
339 340
			       struct convert_context *ctx,
			       struct ablkcipher_request *req)
341 342 343
{
	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);
M
Milan Broz 已提交
344 345 346 347 348 349 350
	struct dm_crypt_request *dmreq;
	u8 *iv;
	int r = 0;

	dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
	iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
			 crypto_ablkcipher_alignmask(cc->tfm) + 1);
351

M
Milan Broz 已提交
352 353
	sg_init_table(&dmreq->sg_in, 1);
	sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
354 355
		    bv_in->bv_offset + ctx->offset_in);

M
Milan Broz 已提交
356 357
	sg_init_table(&dmreq->sg_out, 1);
	sg_set_page(&dmreq->sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT,
358 359 360 361 362 363 364 365 366 367 368 369 370 371
		    bv_out->bv_offset + ctx->offset_out);

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

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

M
Milan Broz 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
	if (cc->iv_gen_ops) {
		r = cc->iv_gen_ops->generator(cc, iv, ctx->sector);
		if (r < 0)
			return r;
	}

	ablkcipher_request_set_crypt(req, &dmreq->sg_in, &dmreq->sg_out,
				     1 << SECTOR_SHIFT, iv);

	if (bio_data_dir(ctx->bio_in) == WRITE)
		r = crypto_ablkcipher_encrypt(req);
	else
		r = crypto_ablkcipher_decrypt(req);

	return r;
387 388
}

M
Milan Broz 已提交
389 390
static void kcryptd_async_done(struct crypto_async_request *async_req,
			       int error);
M
Milan Broz 已提交
391 392 393 394 395
static void crypt_alloc_req(struct crypt_config *cc,
			    struct convert_context *ctx)
{
	if (!cc->req)
		cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
M
Milan Broz 已提交
396 397 398 399
	ablkcipher_request_set_tfm(cc->req, cc->tfm);
	ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
					     CRYPTO_TFM_REQ_MAY_SLEEP,
					     kcryptd_async_done, ctx);
M
Milan Broz 已提交
400 401
}

L
Linus Torvalds 已提交
402 403 404 405
/*
 * Encrypt / decrypt data from one bio to another one (can be the same one)
 */
static int crypt_convert(struct crypt_config *cc,
M
Milan Broz 已提交
406
			 struct convert_context *ctx)
L
Linus Torvalds 已提交
407
{
M
Milan Broz 已提交
408
	int r;
L
Linus Torvalds 已提交
409

M
Milan Broz 已提交
410 411
	atomic_set(&ctx->pending, 1);

L
Linus Torvalds 已提交
412 413 414
	while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
	      ctx->idx_out < ctx->bio_out->bi_vcnt) {

M
Milan Broz 已提交
415 416
		crypt_alloc_req(cc, ctx);

M
Milan Broz 已提交
417 418
		atomic_inc(&ctx->pending);

M
Milan Broz 已提交
419 420 421
		r = crypt_convert_block(cc, ctx, cc->req);

		switch (r) {
M
Milan Broz 已提交
422
		/* async */
M
Milan Broz 已提交
423 424 425 426 427 428
		case -EBUSY:
			wait_for_completion(&ctx->restart);
			INIT_COMPLETION(ctx->restart);
			/* fall through*/
		case -EINPROGRESS:
			cc->req = NULL;
M
Milan Broz 已提交
429 430 431 432
			ctx->sector++;
			continue;

		/* sync */
M
Milan Broz 已提交
433
		case 0:
M
Milan Broz 已提交
434
			atomic_dec(&ctx->pending);
M
Milan Broz 已提交
435
			ctx->sector++;
M
Milan Broz 已提交
436
			cond_resched();
M
Milan Broz 已提交
437 438
			continue;

M
Milan Broz 已提交
439 440 441 442 443
		/* error */
		default:
			atomic_dec(&ctx->pending);
			return r;
		}
L
Linus Torvalds 已提交
444 445
	}

M
Milan Broz 已提交
446
	return 0;
L
Linus Torvalds 已提交
447 448
}

M
Milan Broz 已提交
449 450
static void dm_crypt_bio_destructor(struct bio *bio)
{
A
Alasdair G Kergon 已提交
451
	struct dm_crypt_io *io = bio->bi_private;
M
Milan Broz 已提交
452 453 454
	struct crypt_config *cc = io->target->private;

	bio_free(bio, cc->bs);
M
Milan Broz 已提交
455
}
M
Milan Broz 已提交
456

L
Linus Torvalds 已提交
457 458 459
/*
 * Generate a new unfragmented bio with the given size
 * This should never violate the device limitations
460 461
 * May return a smaller bio when running out of pages, indicated by
 * *out_of_pages set to 1.
L
Linus Torvalds 已提交
462
 */
463 464
static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size,
				      unsigned *out_of_pages)
L
Linus Torvalds 已提交
465
{
O
Olaf Kirch 已提交
466
	struct crypt_config *cc = io->target->private;
467
	struct bio *clone;
L
Linus Torvalds 已提交
468
	unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
469
	gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
M
Milan Broz 已提交
470 471
	unsigned i, len;
	struct page *page;
L
Linus Torvalds 已提交
472

O
Olaf Kirch 已提交
473
	clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs);
474
	if (!clone)
L
Linus Torvalds 已提交
475 476
		return NULL;

O
Olaf Kirch 已提交
477
	clone_init(io, clone);
478
	*out_of_pages = 0;
M
Milan Broz 已提交
479

480
	for (i = 0; i < nr_iovecs; i++) {
M
Milan Broz 已提交
481
		page = mempool_alloc(cc->page_pool, gfp_mask);
482 483
		if (!page) {
			*out_of_pages = 1;
L
Linus Torvalds 已提交
484
			break;
485
		}
L
Linus Torvalds 已提交
486 487 488 489 490 491

		/*
		 * if additional pages cannot be allocated without waiting,
		 * return a partially allocated bio, the caller will then try
		 * to allocate additional bios while submitting this partial bio
		 */
492
		if (i == (MIN_BIO_PAGES - 1))
L
Linus Torvalds 已提交
493 494
			gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT;

M
Milan Broz 已提交
495 496 497 498 499 500
		len = (size > PAGE_SIZE) ? PAGE_SIZE : size;

		if (!bio_add_page(clone, page, len, 0)) {
			mempool_free(page, cc->page_pool);
			break;
		}
L
Linus Torvalds 已提交
501

M
Milan Broz 已提交
502
		size -= len;
L
Linus Torvalds 已提交
503 504
	}

505 506
	if (!clone->bi_size) {
		bio_put(clone);
L
Linus Torvalds 已提交
507 508 509
		return NULL;
	}

510
	return clone;
L
Linus Torvalds 已提交
511 512
}

N
Neil Brown 已提交
513
static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone)
L
Linus Torvalds 已提交
514
{
N
Neil Brown 已提交
515
	unsigned int i;
L
Linus Torvalds 已提交
516 517
	struct bio_vec *bv;

N
Neil Brown 已提交
518
	for (i = 0; i < clone->bi_vcnt; i++) {
519
		bv = bio_iovec_idx(clone, i);
L
Linus Torvalds 已提交
520 521 522 523 524 525
		BUG_ON(!bv->bv_page);
		mempool_free(bv->bv_page, cc->page_pool);
		bv->bv_page = NULL;
	}
}

M
Milan Broz 已提交
526 527 528 529 530 531 532 533 534 535 536
static struct dm_crypt_io *crypt_io_alloc(struct dm_target *ti,
					  struct bio *bio, sector_t sector)
{
	struct crypt_config *cc = ti->private;
	struct dm_crypt_io *io;

	io = mempool_alloc(cc->io_pool, GFP_NOIO);
	io->target = ti;
	io->base_bio = bio;
	io->sector = sector;
	io->error = 0;
M
Milan Broz 已提交
537
	io->base_io = NULL;
M
Milan Broz 已提交
538 539 540 541 542
	atomic_set(&io->pending, 0);

	return io;
}

M
Milan Broz 已提交
543 544 545 546 547
static void crypt_inc_pending(struct dm_crypt_io *io)
{
	atomic_inc(&io->pending);
}

L
Linus Torvalds 已提交
548 549 550
/*
 * One of the bios was finished. Check for completion of
 * the whole request and correctly clean up the buffer.
M
Milan Broz 已提交
551
 * If base_io is set, wait for the last fragment to complete.
L
Linus Torvalds 已提交
552
 */
553
static void crypt_dec_pending(struct dm_crypt_io *io)
L
Linus Torvalds 已提交
554
{
555
	struct crypt_config *cc = io->target->private;
L
Linus Torvalds 已提交
556 557 558 559

	if (!atomic_dec_and_test(&io->pending))
		return;

M
Milan Broz 已提交
560 561 562 563 564 565 566 567
	if (likely(!io->base_io))
		bio_endio(io->base_bio, io->error);
	else {
		if (io->error && !io->base_io->error)
			io->base_io->error = io->error;
		crypt_dec_pending(io->base_io);
	}

L
Linus Torvalds 已提交
568 569 570 571
	mempool_free(io, cc->io_pool);
}

/*
M
Milan Broz 已提交
572
 * kcryptd/kcryptd_io:
L
Linus Torvalds 已提交
573 574
 *
 * Needed because it would be very unwise to do decryption in an
575
 * interrupt context.
M
Milan Broz 已提交
576 577 578 579 580 581 582 583
 *
 * kcryptd performs the actual encryption or decryption.
 *
 * kcryptd_io performs the IO submission.
 *
 * They must be separated as otherwise the final stages could be
 * starved by new requests which can block in the first stages due
 * to memory allocation.
L
Linus Torvalds 已提交
584
 */
585
static void crypt_endio(struct bio *clone, int error)
586
{
A
Alasdair G Kergon 已提交
587
	struct dm_crypt_io *io = clone->bi_private;
588
	struct crypt_config *cc = io->target->private;
M
Milan Broz 已提交
589
	unsigned rw = bio_data_dir(clone);
590

M
Milan Broz 已提交
591 592 593
	if (unlikely(!bio_flagged(clone, BIO_UPTODATE) && !error))
		error = -EIO;

594
	/*
595
	 * free the processed pages
596
	 */
M
Milan Broz 已提交
597
	if (rw == WRITE)
N
Neil Brown 已提交
598
		crypt_free_buffer_pages(cc, clone);
599 600 601

	bio_put(clone);

M
Milan Broz 已提交
602 603 604 605
	if (rw == READ && !error) {
		kcryptd_queue_crypt(io);
		return;
	}
606 607 608 609 610

	if (unlikely(error))
		io->error = error;

	crypt_dec_pending(io);
611 612
}

A
Alasdair G Kergon 已提交
613
static void clone_init(struct dm_crypt_io *io, struct bio *clone)
614 615 616 617 618 619 620
{
	struct crypt_config *cc = io->target->private;

	clone->bi_private = io;
	clone->bi_end_io  = crypt_endio;
	clone->bi_bdev    = cc->dev->bdev;
	clone->bi_rw      = io->base_bio->bi_rw;
O
Olaf Kirch 已提交
621
	clone->bi_destructor = dm_crypt_bio_destructor;
622 623
}

624
static void kcryptd_io_read(struct dm_crypt_io *io)
625 626 627 628
{
	struct crypt_config *cc = io->target->private;
	struct bio *base_bio = io->base_bio;
	struct bio *clone;
629

M
Milan Broz 已提交
630
	crypt_inc_pending(io);
631 632 633 634 635 636

	/*
	 * The block layer might modify the bvec array, so always
	 * copy the required bvecs because we need the original
	 * one in order to decrypt the whole bio data *afterwards*.
	 */
M
Milan Broz 已提交
637
	clone = bio_alloc_bioset(GFP_NOIO, bio_segments(base_bio), cc->bs);
638
	if (unlikely(!clone)) {
639 640
		io->error = -ENOMEM;
		crypt_dec_pending(io);
641
		return;
642
	}
643 644 645 646 647

	clone_init(io, clone);
	clone->bi_idx = 0;
	clone->bi_vcnt = bio_segments(base_bio);
	clone->bi_size = base_bio->bi_size;
648
	clone->bi_sector = cc->start + io->sector;
649 650 651
	memcpy(clone->bi_io_vec, bio_iovec(base_bio),
	       sizeof(struct bio_vec) * clone->bi_vcnt);

652
	generic_make_request(clone);
653 654
}

655 656
static void kcryptd_io_write(struct dm_crypt_io *io)
{
M
Milan Broz 已提交
657 658
	struct bio *clone = io->ctx.bio_out;
	generic_make_request(clone);
659 660
}

661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
static void kcryptd_io(struct work_struct *work)
{
	struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work);

	if (bio_data_dir(io->base_bio) == READ)
		kcryptd_io_read(io);
	else
		kcryptd_io_write(io);
}

static void kcryptd_queue_io(struct dm_crypt_io *io)
{
	struct crypt_config *cc = io->target->private;

	INIT_WORK(&io->work, kcryptd_io);
	queue_work(cc->io_queue, &io->work);
}

M
Milan Broz 已提交
679 680
static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io,
					  int error, int async)
681
{
M
Milan Broz 已提交
682 683 684 685 686 687 688
	struct bio *clone = io->ctx.bio_out;
	struct crypt_config *cc = io->target->private;

	if (unlikely(error < 0)) {
		crypt_free_buffer_pages(cc, clone);
		bio_put(clone);
		io->error = -EIO;
689
		crypt_dec_pending(io);
M
Milan Broz 已提交
690 691 692 693 694 695 696
		return;
	}

	/* crypt_convert should have filled the clone bio */
	BUG_ON(io->ctx.idx_out < clone->bi_vcnt);

	clone->bi_sector = cc->start + io->sector;
M
Milan Broz 已提交
697

M
Milan Broz 已提交
698 699
	if (async)
		kcryptd_queue_io(io);
700
	else
M
Milan Broz 已提交
701
		generic_make_request(clone);
702 703
}

M
Milan Broz 已提交
704
static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
705 706 707
{
	struct crypt_config *cc = io->target->private;
	struct bio *clone;
M
Milan Broz 已提交
708
	struct dm_crypt_io *new_io;
M
Milan Broz 已提交
709
	int crypt_finished;
710
	unsigned out_of_pages = 0;
M
Milan Broz 已提交
711
	unsigned remaining = io->base_bio->bi_size;
M
Milan Broz 已提交
712
	sector_t sector = io->sector;
M
Milan Broz 已提交
713
	int r;
714

M
Milan Broz 已提交
715 716 717 718
	/*
	 * Prevent io from disappearing until this function completes.
	 */
	crypt_inc_pending(io);
M
Milan Broz 已提交
719
	crypt_convert_init(cc, &io->ctx, NULL, io->base_bio, sector);
M
Milan Broz 已提交
720

721 722 723 724 725
	/*
	 * The allocated buffers can be smaller than the whole bio,
	 * so repeat the whole process until all the data can be handled.
	 */
	while (remaining) {
726
		clone = crypt_alloc_buffer(io, remaining, &out_of_pages);
727
		if (unlikely(!clone)) {
728
			io->error = -ENOMEM;
M
Milan Broz 已提交
729
			break;
730
		}
731

732 733
		io->ctx.bio_out = clone;
		io->ctx.idx_out = 0;
734

M
Milan Broz 已提交
735
		remaining -= clone->bi_size;
M
Milan Broz 已提交
736
		sector += bio_sectors(clone);
737

M
Milan Broz 已提交
738
		crypt_inc_pending(io);
M
Milan Broz 已提交
739
		r = crypt_convert(cc, &io->ctx);
M
Milan Broz 已提交
740
		crypt_finished = atomic_dec_and_test(&io->ctx.pending);
741

M
Milan Broz 已提交
742 743
		/* Encryption was already finished, submit io now */
		if (crypt_finished) {
M
Milan Broz 已提交
744
			kcryptd_crypt_write_io_submit(io, r, 0);
M
Milan Broz 已提交
745 746 747 748 749

			/*
			 * If there was an error, do not try next fragments.
			 * For async, error is processed in async handler.
			 */
750
			if (unlikely(r < 0))
M
Milan Broz 已提交
751
				break;
M
Milan Broz 已提交
752 753

			io->sector = sector;
M
Milan Broz 已提交
754
		}
755

756 757 758 759 760
		/*
		 * Out of memory -> run queues
		 * But don't wait if split was due to the io size restriction
		 */
		if (unlikely(out_of_pages))
761
			congestion_wait(WRITE, HZ/100);
762

M
Milan Broz 已提交
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
		/*
		 * With async crypto it is unsafe to share the crypto context
		 * between fragments, so switch to a new dm_crypt_io structure.
		 */
		if (unlikely(!crypt_finished && remaining)) {
			new_io = crypt_io_alloc(io->target, io->base_bio,
						sector);
			crypt_inc_pending(new_io);
			crypt_convert_init(cc, &new_io->ctx, NULL,
					   io->base_bio, sector);
			new_io->ctx.idx_in = io->ctx.idx_in;
			new_io->ctx.offset_in = io->ctx.offset_in;

			/*
			 * Fragments after the first use the base_io
			 * pending count.
			 */
			if (!io->base_io)
				new_io->base_io = io;
			else {
				new_io->base_io = io->base_io;
				crypt_inc_pending(io->base_io);
				crypt_dec_pending(io);
			}

			io = new_io;
		}
790
	}
M
Milan Broz 已提交
791 792

	crypt_dec_pending(io);
793 794
}

795
static void kcryptd_crypt_read_done(struct dm_crypt_io *io, int error)
796 797 798 799 800 801 802
{
	if (unlikely(error < 0))
		io->error = -EIO;

	crypt_dec_pending(io);
}

803
static void kcryptd_crypt_read_convert(struct dm_crypt_io *io)
804 805
{
	struct crypt_config *cc = io->target->private;
806
	int r = 0;
L
Linus Torvalds 已提交
807

M
Milan Broz 已提交
808
	crypt_inc_pending(io);
M
Milan Broz 已提交
809

810
	crypt_convert_init(cc, &io->ctx, io->base_bio, io->base_bio,
811
			   io->sector);
L
Linus Torvalds 已提交
812

813 814
	r = crypt_convert(cc, &io->ctx);

M
Milan Broz 已提交
815
	if (atomic_dec_and_test(&io->ctx.pending))
M
Milan Broz 已提交
816 817 818
		kcryptd_crypt_read_done(io, r);

	crypt_dec_pending(io);
L
Linus Torvalds 已提交
819 820
}

M
Milan Broz 已提交
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843
static void kcryptd_async_done(struct crypto_async_request *async_req,
			       int error)
{
	struct convert_context *ctx = async_req->data;
	struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
	struct crypt_config *cc = io->target->private;

	if (error == -EINPROGRESS) {
		complete(&ctx->restart);
		return;
	}

	mempool_free(ablkcipher_request_cast(async_req), cc->req_pool);

	if (!atomic_dec_and_test(&ctx->pending))
		return;

	if (bio_data_dir(io->base_bio) == READ)
		kcryptd_crypt_read_done(io, error);
	else
		kcryptd_crypt_write_io_submit(io, error, 1);
}

844
static void kcryptd_crypt(struct work_struct *work)
L
Linus Torvalds 已提交
845
{
A
Alasdair G Kergon 已提交
846
	struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work);
847

M
Milan Broz 已提交
848
	if (bio_data_dir(io->base_bio) == READ)
849
		kcryptd_crypt_read_convert(io);
850
	else
851
		kcryptd_crypt_write_convert(io);
M
Milan Broz 已提交
852 853
}

854
static void kcryptd_queue_crypt(struct dm_crypt_io *io)
M
Milan Broz 已提交
855
{
856
	struct crypt_config *cc = io->target->private;
M
Milan Broz 已提交
857

858 859
	INIT_WORK(&io->work, kcryptd_crypt);
	queue_work(cc->crypt_queue, &io->work);
L
Linus Torvalds 已提交
860 861 862 863 864 865 866 867 868 869 870 871 872
}

/*
 * Decode key from its hex representation
 */
static int crypt_decode_key(u8 *key, char *hex, unsigned int size)
{
	char buffer[3];
	char *endp;
	unsigned int i;

	buffer[2] = '\0';

873
	for (i = 0; i < size; i++) {
L
Linus Torvalds 已提交
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
		buffer[0] = *hex++;
		buffer[1] = *hex++;

		key[i] = (u8)simple_strtoul(buffer, &endp, 16);

		if (endp != &buffer[2])
			return -EINVAL;
	}

	if (*hex != '\0')
		return -EINVAL;

	return 0;
}

/*
 * Encode key into its hex representation
 */
static void crypt_encode_key(char *hex, u8 *key, unsigned int size)
{
	unsigned int i;

896
	for (i = 0; i < size; i++) {
L
Linus Torvalds 已提交
897 898 899 900 901 902
		sprintf(hex, "%02x", *key);
		hex += 2;
		key++;
	}
}

M
Milan Broz 已提交
903 904 905 906 907 908 909 910 911 912
static int crypt_set_key(struct crypt_config *cc, char *key)
{
	unsigned key_size = strlen(key) >> 1;

	if (cc->key_size && cc->key_size != key_size)
		return -EINVAL;

	cc->key_size = key_size; /* initial settings */

	if ((!key_size && strcmp(key, "-")) ||
M
Milan Broz 已提交
913
	   (key_size && crypt_decode_key(cc->key, key, key_size) < 0))
M
Milan Broz 已提交
914 915 916 917 918 919 920 921 922 923 924 925 926 927
		return -EINVAL;

	set_bit(DM_CRYPT_KEY_VALID, &cc->flags);

	return 0;
}

static int crypt_wipe_key(struct crypt_config *cc)
{
	clear_bit(DM_CRYPT_KEY_VALID, &cc->flags);
	memset(&cc->key, 0, cc->key_size * sizeof(u8));
	return 0;
}

L
Linus Torvalds 已提交
928 929 930 931 932 933 934
/*
 * Construct an encryption mapping:
 * <cipher> <key> <iv_offset> <dev_path> <start>
 */
static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
{
	struct crypt_config *cc;
M
Milan Broz 已提交
935
	struct crypto_ablkcipher *tfm;
L
Linus Torvalds 已提交
936 937 938 939 940 941
	char *tmp;
	char *cipher;
	char *chainmode;
	char *ivmode;
	char *ivopts;
	unsigned int key_size;
A
Andrew Morton 已提交
942
	unsigned long long tmpll;
L
Linus Torvalds 已提交
943 944

	if (argc != 5) {
945
		ti->error = "Not enough arguments";
L
Linus Torvalds 已提交
946 947 948 949 950 951 952 953 954 955
		return -EINVAL;
	}

	tmp = argv[0];
	cipher = strsep(&tmp, "-");
	chainmode = strsep(&tmp, "-");
	ivopts = strsep(&tmp, "-");
	ivmode = strsep(&ivopts, ":");

	if (tmp)
956
		DMWARN("Unexpected additional cipher options");
L
Linus Torvalds 已提交
957 958 959

	key_size = strlen(argv[1]) >> 1;

M
Milan Broz 已提交
960
 	cc = kzalloc(sizeof(*cc) + key_size * sizeof(u8), GFP_KERNEL);
L
Linus Torvalds 已提交
961 962
	if (cc == NULL) {
		ti->error =
963
			"Cannot allocate transparent encryption context";
L
Linus Torvalds 已提交
964 965 966
		return -ENOMEM;
	}

M
Milan Broz 已提交
967
 	if (crypt_set_key(cc, argv[1])) {
968
		ti->error = "Error decoding key";
M
Milan Broz 已提交
969
		goto bad_cipher;
L
Linus Torvalds 已提交
970 971 972 973 974 975 976 977
	}

	/* Compatiblity mode for old dm-crypt cipher strings */
	if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) {
		chainmode = "cbc";
		ivmode = "plain";
	}

978 979
	if (strcmp(chainmode, "ecb") && !ivmode) {
		ti->error = "This chaining mode requires an IV mechanism";
M
Milan Broz 已提交
980
		goto bad_cipher;
L
Linus Torvalds 已提交
981 982
	}

M
Milan Broz 已提交
983 984
	if (snprintf(cc->cipher, CRYPTO_MAX_ALG_NAME, "%s(%s)",
		     chainmode, cipher) >= CRYPTO_MAX_ALG_NAME) {
985
		ti->error = "Chain mode + cipher name is too long";
M
Milan Broz 已提交
986
		goto bad_cipher;
L
Linus Torvalds 已提交
987 988
	}

M
Milan Broz 已提交
989
	tfm = crypto_alloc_ablkcipher(cc->cipher, 0, 0);
990
	if (IS_ERR(tfm)) {
991
		ti->error = "Error allocating crypto tfm";
M
Milan Broz 已提交
992
		goto bad_cipher;
L
Linus Torvalds 已提交
993 994
	}

995 996
	strcpy(cc->cipher, cipher);
	strcpy(cc->chainmode, chainmode);
L
Linus Torvalds 已提交
997 998 999
	cc->tfm = tfm;

	/*
1000
	 * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi".
L
Linus Torvalds 已提交
1001 1002 1003 1004 1005 1006 1007 1008 1009
	 * See comments at iv code
	 */

	if (ivmode == NULL)
		cc->iv_gen_ops = NULL;
	else if (strcmp(ivmode, "plain") == 0)
		cc->iv_gen_ops = &crypt_iv_plain_ops;
	else if (strcmp(ivmode, "essiv") == 0)
		cc->iv_gen_ops = &crypt_iv_essiv_ops;
1010 1011
	else if (strcmp(ivmode, "benbi") == 0)
		cc->iv_gen_ops = &crypt_iv_benbi_ops;
L
Ludwig Nussel 已提交
1012 1013
	else if (strcmp(ivmode, "null") == 0)
		cc->iv_gen_ops = &crypt_iv_null_ops;
L
Linus Torvalds 已提交
1014
	else {
1015
		ti->error = "Invalid IV mode";
M
Milan Broz 已提交
1016
		goto bad_ivmode;
L
Linus Torvalds 已提交
1017 1018 1019 1020
	}

	if (cc->iv_gen_ops && cc->iv_gen_ops->ctr &&
	    cc->iv_gen_ops->ctr(cc, ti, ivopts) < 0)
M
Milan Broz 已提交
1021
		goto bad_ivmode;
L
Linus Torvalds 已提交
1022

M
Milan Broz 已提交
1023
	cc->iv_size = crypto_ablkcipher_ivsize(tfm);
1024
	if (cc->iv_size)
L
Linus Torvalds 已提交
1025
		/* at least a 64 bit sector number should fit in our buffer */
1026
		cc->iv_size = max(cc->iv_size,
M
Milan Broz 已提交
1027
				  (unsigned int)(sizeof(u64) / sizeof(u8)));
L
Linus Torvalds 已提交
1028 1029
	else {
		if (cc->iv_gen_ops) {
1030
			DMWARN("Selected cipher does not support IVs");
L
Linus Torvalds 已提交
1031 1032 1033 1034 1035 1036
			if (cc->iv_gen_ops->dtr)
				cc->iv_gen_ops->dtr(cc);
			cc->iv_gen_ops = NULL;
		}
	}

1037
	cc->io_pool = mempool_create_slab_pool(MIN_IOS, _crypt_io_pool);
L
Linus Torvalds 已提交
1038
	if (!cc->io_pool) {
1039
		ti->error = "Cannot allocate crypt io mempool";
M
Milan Broz 已提交
1040
		goto bad_slab_pool;
L
Linus Torvalds 已提交
1041 1042
	}

M
Milan Broz 已提交
1043
	cc->dmreq_start = sizeof(struct ablkcipher_request);
M
Milan Broz 已提交
1044
	cc->dmreq_start += crypto_ablkcipher_reqsize(tfm);
M
Milan Broz 已提交
1045
	cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment());
M
Milan Broz 已提交
1046 1047
	cc->dmreq_start += crypto_ablkcipher_alignmask(tfm) &
			   ~(crypto_tfm_ctx_alignment() - 1);
M
Milan Broz 已提交
1048 1049 1050 1051 1052 1053 1054 1055 1056

	cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start +
			sizeof(struct dm_crypt_request) + cc->iv_size);
	if (!cc->req_pool) {
		ti->error = "Cannot allocate crypt request mempool";
		goto bad_req_pool;
	}
	cc->req = NULL;

1057
	cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0);
L
Linus Torvalds 已提交
1058
	if (!cc->page_pool) {
1059
		ti->error = "Cannot allocate page mempool";
M
Milan Broz 已提交
1060
		goto bad_page_pool;
L
Linus Torvalds 已提交
1061 1062
	}

1063
	cc->bs = bioset_create(MIN_IOS, 0);
M
Milan Broz 已提交
1064 1065 1066 1067 1068
	if (!cc->bs) {
		ti->error = "Cannot allocate crypt bioset";
		goto bad_bs;
	}

M
Milan Broz 已提交
1069
	if (crypto_ablkcipher_setkey(tfm, cc->key, key_size) < 0) {
1070
		ti->error = "Error setting key";
M
Milan Broz 已提交
1071
		goto bad_device;
L
Linus Torvalds 已提交
1072 1073
	}

A
Andrew Morton 已提交
1074
	if (sscanf(argv[2], "%llu", &tmpll) != 1) {
1075
		ti->error = "Invalid iv_offset sector";
M
Milan Broz 已提交
1076
		goto bad_device;
L
Linus Torvalds 已提交
1077
	}
A
Andrew Morton 已提交
1078
	cc->iv_offset = tmpll;
L
Linus Torvalds 已提交
1079

A
Andrew Morton 已提交
1080
	if (sscanf(argv[4], "%llu", &tmpll) != 1) {
1081
		ti->error = "Invalid device sector";
M
Milan Broz 已提交
1082
		goto bad_device;
L
Linus Torvalds 已提交
1083
	}
A
Andrew Morton 已提交
1084
	cc->start = tmpll;
L
Linus Torvalds 已提交
1085 1086

	if (dm_get_device(ti, argv[3], cc->start, ti->len,
M
Milan Broz 已提交
1087
			  dm_table_get_mode(ti->table), &cc->dev)) {
1088
		ti->error = "Device lookup failed";
M
Milan Broz 已提交
1089
		goto bad_device;
L
Linus Torvalds 已提交
1090 1091 1092 1093 1094 1095 1096
	}

	if (ivmode && cc->iv_gen_ops) {
		if (ivopts)
			*(ivopts - 1) = ':';
		cc->iv_mode = kmalloc(strlen(ivmode) + 1, GFP_KERNEL);
		if (!cc->iv_mode) {
1097
			ti->error = "Error kmallocing iv_mode string";
M
Milan Broz 已提交
1098
			goto bad_ivmode_string;
L
Linus Torvalds 已提交
1099 1100 1101 1102 1103
		}
		strcpy(cc->iv_mode, ivmode);
	} else
		cc->iv_mode = NULL;

M
Milan Broz 已提交
1104 1105 1106 1107 1108 1109 1110 1111
	cc->io_queue = create_singlethread_workqueue("kcryptd_io");
	if (!cc->io_queue) {
		ti->error = "Couldn't create kcryptd io queue";
		goto bad_io_queue;
	}

	cc->crypt_queue = create_singlethread_workqueue("kcryptd");
	if (!cc->crypt_queue) {
1112
		ti->error = "Couldn't create kcryptd queue";
M
Milan Broz 已提交
1113
		goto bad_crypt_queue;
1114 1115
	}

L
Linus Torvalds 已提交
1116 1117 1118
	ti->private = cc;
	return 0;

M
Milan Broz 已提交
1119 1120 1121
bad_crypt_queue:
	destroy_workqueue(cc->io_queue);
bad_io_queue:
1122
	kfree(cc->iv_mode);
M
Milan Broz 已提交
1123
bad_ivmode_string:
1124
	dm_put_device(ti, cc->dev);
M
Milan Broz 已提交
1125
bad_device:
M
Milan Broz 已提交
1126 1127
	bioset_free(cc->bs);
bad_bs:
L
Linus Torvalds 已提交
1128
	mempool_destroy(cc->page_pool);
M
Milan Broz 已提交
1129
bad_page_pool:
M
Milan Broz 已提交
1130 1131
	mempool_destroy(cc->req_pool);
bad_req_pool:
L
Linus Torvalds 已提交
1132
	mempool_destroy(cc->io_pool);
M
Milan Broz 已提交
1133
bad_slab_pool:
L
Linus Torvalds 已提交
1134 1135
	if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
		cc->iv_gen_ops->dtr(cc);
M
Milan Broz 已提交
1136
bad_ivmode:
M
Milan Broz 已提交
1137
	crypto_free_ablkcipher(tfm);
M
Milan Broz 已提交
1138
bad_cipher:
1139 1140
	/* Must zero key material before freeing */
	memset(cc, 0, sizeof(*cc) + cc->key_size * sizeof(u8));
L
Linus Torvalds 已提交
1141 1142 1143 1144 1145 1146 1147 1148
	kfree(cc);
	return -EINVAL;
}

static void crypt_dtr(struct dm_target *ti)
{
	struct crypt_config *cc = (struct crypt_config *) ti->private;

M
Milan Broz 已提交
1149 1150
	destroy_workqueue(cc->io_queue);
	destroy_workqueue(cc->crypt_queue);
M
Milan Broz 已提交
1151

M
Milan Broz 已提交
1152 1153 1154
	if (cc->req)
		mempool_free(cc->req, cc->req_pool);

M
Milan Broz 已提交
1155
	bioset_free(cc->bs);
L
Linus Torvalds 已提交
1156
	mempool_destroy(cc->page_pool);
M
Milan Broz 已提交
1157
	mempool_destroy(cc->req_pool);
L
Linus Torvalds 已提交
1158 1159
	mempool_destroy(cc->io_pool);

1160
	kfree(cc->iv_mode);
L
Linus Torvalds 已提交
1161 1162
	if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
		cc->iv_gen_ops->dtr(cc);
M
Milan Broz 已提交
1163
	crypto_free_ablkcipher(cc->tfm);
L
Linus Torvalds 已提交
1164
	dm_put_device(ti, cc->dev);
1165 1166 1167

	/* Must zero key material before freeing */
	memset(cc, 0, sizeof(*cc) + cc->key_size * sizeof(u8));
L
Linus Torvalds 已提交
1168 1169 1170 1171 1172 1173
	kfree(cc);
}

static int crypt_map(struct dm_target *ti, struct bio *bio,
		     union map_info *map_context)
{
A
Alasdair G Kergon 已提交
1174
	struct dm_crypt_io *io;
L
Linus Torvalds 已提交
1175

M
Milan Broz 已提交
1176
	io = crypt_io_alloc(ti, bio, bio->bi_sector - ti->begin);
M
Milan Broz 已提交
1177 1178 1179 1180 1181

	if (bio_data_dir(io->base_bio) == READ)
		kcryptd_queue_io(io);
	else
		kcryptd_queue_crypt(io);
L
Linus Torvalds 已提交
1182

1183
	return DM_MAPIO_SUBMITTED;
L
Linus Torvalds 已提交
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
}

static int crypt_status(struct dm_target *ti, status_type_t type,
			char *result, unsigned int maxlen)
{
	struct crypt_config *cc = (struct crypt_config *) ti->private;
	unsigned int sz = 0;

	switch (type) {
	case STATUSTYPE_INFO:
		result[0] = '\0';
		break;

	case STATUSTYPE_TABLE:
		if (cc->iv_mode)
1199 1200
			DMEMIT("%s-%s-%s ", cc->cipher, cc->chainmode,
			       cc->iv_mode);
L
Linus Torvalds 已提交
1201
		else
1202
			DMEMIT("%s-%s ", cc->cipher, cc->chainmode);
L
Linus Torvalds 已提交
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215

		if (cc->key_size > 0) {
			if ((maxlen - sz) < ((cc->key_size << 1) + 1))
				return -ENOMEM;

			crypt_encode_key(result + sz, cc->key, cc->key_size);
			sz += cc->key_size << 1;
		} else {
			if (sz >= maxlen)
				return -ENOMEM;
			result[sz++] = '-';
		}

A
Andrew Morton 已提交
1216 1217
		DMEMIT(" %llu %s %llu", (unsigned long long)cc->iv_offset,
				cc->dev->name, (unsigned long long)cc->start);
L
Linus Torvalds 已提交
1218 1219 1220 1221 1222
		break;
	}
	return 0;
}

M
Milan Broz 已提交
1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
static void crypt_postsuspend(struct dm_target *ti)
{
	struct crypt_config *cc = ti->private;

	set_bit(DM_CRYPT_SUSPENDED, &cc->flags);
}

static int crypt_preresume(struct dm_target *ti)
{
	struct crypt_config *cc = ti->private;

	if (!test_bit(DM_CRYPT_KEY_VALID, &cc->flags)) {
		DMERR("aborting resume - crypt key is not set.");
		return -EAGAIN;
	}

	return 0;
}

static void crypt_resume(struct dm_target *ti)
{
	struct crypt_config *cc = ti->private;

	clear_bit(DM_CRYPT_SUSPENDED, &cc->flags);
}

/* Message interface
 *	key set <key>
 *	key wipe
 */
static int crypt_message(struct dm_target *ti, unsigned argc, char **argv)
{
	struct crypt_config *cc = ti->private;

	if (argc < 2)
		goto error;

	if (!strnicmp(argv[0], MESG_STR("key"))) {
		if (!test_bit(DM_CRYPT_SUSPENDED, &cc->flags)) {
			DMWARN("not suspended during key manipulation.");
			return -EINVAL;
		}
		if (argc == 3 && !strnicmp(argv[1], MESG_STR("set")))
			return crypt_set_key(cc, argv[2]);
		if (argc == 2 && !strnicmp(argv[1], MESG_STR("wipe")))
			return crypt_wipe_key(cc);
	}

error:
	DMWARN("unrecognised message received.");
	return -EINVAL;
}

M
Milan Broz 已提交
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
static int crypt_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
		       struct bio_vec *biovec, int max_size)
{
	struct crypt_config *cc = ti->private;
	struct request_queue *q = bdev_get_queue(cc->dev->bdev);

	if (!q->merge_bvec_fn)
		return max_size;

	bvm->bi_bdev = cc->dev->bdev;
	bvm->bi_sector = cc->start + bvm->bi_sector - ti->begin;

	return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
}

L
Linus Torvalds 已提交
1291 1292
static struct target_type crypt_target = {
	.name   = "crypt",
M
Milan Broz 已提交
1293
	.version= {1, 6, 0},
L
Linus Torvalds 已提交
1294 1295 1296 1297 1298
	.module = THIS_MODULE,
	.ctr    = crypt_ctr,
	.dtr    = crypt_dtr,
	.map    = crypt_map,
	.status = crypt_status,
M
Milan Broz 已提交
1299 1300 1301 1302
	.postsuspend = crypt_postsuspend,
	.preresume = crypt_preresume,
	.resume = crypt_resume,
	.message = crypt_message,
M
Milan Broz 已提交
1303
	.merge  = crypt_merge,
L
Linus Torvalds 已提交
1304 1305 1306 1307 1308 1309
};

static int __init dm_crypt_init(void)
{
	int r;

A
Alasdair G Kergon 已提交
1310
	_crypt_io_pool = KMEM_CACHE(dm_crypt_io, 0);
L
Linus Torvalds 已提交
1311 1312 1313 1314 1315
	if (!_crypt_io_pool)
		return -ENOMEM;

	r = dm_register_target(&crypt_target);
	if (r < 0) {
1316
		DMERR("register failed %d", r);
1317
		kmem_cache_destroy(_crypt_io_pool);
L
Linus Torvalds 已提交
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
	}

	return r;
}

static void __exit dm_crypt_exit(void)
{
	int r = dm_unregister_target(&crypt_target);

	if (r < 0)
1328
		DMERR("unregister failed %d", r);
L
Linus Torvalds 已提交
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338

	kmem_cache_destroy(_crypt_io_pool);
}

module_init(dm_crypt_init);
module_exit(dm_crypt_exit);

MODULE_AUTHOR("Christophe Saout <christophe@saout.de>");
MODULE_DESCRIPTION(DM_NAME " target for transparent encryption / decryption");
MODULE_LICENSE("GPL");