dm-crypt.c 32.1 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
struct dm_crypt_request {
63
	struct convert_context *ctx;
64 65 66 67
	struct scatterlist sg_in;
	struct scatterlist sg_out;
};

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

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

78 79
struct iv_essiv_private {
	struct crypto_cipher *tfm;
80 81
	struct crypto_hash *hash_tfm;
	u8 *salt;
82 83 84 85 86 87
};

struct iv_benbi_private {
	int shift;
};

L
Linus Torvalds 已提交
88 89 90 91
/*
 * Crypt: maps a linear range of a block device
 * and encrypts / decrypts at the same time.
 */
M
Milan Broz 已提交
92
enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID };
L
Linus Torvalds 已提交
93 94 95 96 97
struct crypt_config {
	struct dm_dev *dev;
	sector_t start;

	/*
M
Milan Broz 已提交
98 99
	 * pool for per bio private data, crypto requests and
	 * encryption requeusts/buffer pages
L
Linus Torvalds 已提交
100 101
	 */
	mempool_t *io_pool;
M
Milan Broz 已提交
102
	mempool_t *req_pool;
L
Linus Torvalds 已提交
103
	mempool_t *page_pool;
M
Milan Broz 已提交
104
	struct bio_set *bs;
L
Linus Torvalds 已提交
105

M
Milan Broz 已提交
106 107
	struct workqueue_struct *io_queue;
	struct workqueue_struct *crypt_queue;
M
Milan Broz 已提交
108

L
Linus Torvalds 已提交
109 110 111 112 113
	/*
	 * crypto related data
	 */
	struct crypt_iv_operations *iv_gen_ops;
	char *iv_mode;
114
	union {
115 116
		struct iv_essiv_private essiv;
		struct iv_benbi_private benbi;
117
	} iv_gen_private;
L
Linus Torvalds 已提交
118 119 120
	sector_t iv_offset;
	unsigned int iv_size;

M
Milan Broz 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
	/*
	 * 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;

137 138
	char cipher[CRYPTO_MAX_ALG_NAME];
	char chainmode[CRYPTO_MAX_ALG_NAME];
M
Milan Broz 已提交
139
	struct crypto_ablkcipher *tfm;
M
Milan Broz 已提交
140
	unsigned long flags;
L
Linus Torvalds 已提交
141 142 143 144
	unsigned int key_size;
	u8 key[0];
};

M
Milan Broz 已提交
145
#define MIN_IOS        16
L
Linus Torvalds 已提交
146 147 148
#define MIN_POOL_PAGES 32
#define MIN_BIO_PAGES  8

149
static struct kmem_cache *_crypt_io_pool;
L
Linus Torvalds 已提交
150

A
Alasdair G Kergon 已提交
151
static void clone_init(struct dm_crypt_io *, struct bio *);
152
static void kcryptd_queue_crypt(struct dm_crypt_io *io);
O
Olaf Kirch 已提交
153

L
Linus Torvalds 已提交
154 155 156
/*
 * Different IV generation algorithms:
 *
157
 * plain: the initial vector is the 32-bit little-endian version of the sector
158
 *        number, padded with zeros if necessary.
L
Linus Torvalds 已提交
159
 *
160 161 162
 * 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 已提交
163
 *
164 165 166
 * 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 已提交
167 168 169
 * null: the initial vector is always zero.  Provides compatibility with
 *       obsolete loop_fish2 devices.  Do not use for new devices.
 *
L
Linus Torvalds 已提交
170 171 172 173 174 175 176 177 178 179 180 181
 * 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;
}

182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
/* Initialise ESSIV - compute salt but no local memory allocations */
static int crypt_iv_essiv_init(struct crypt_config *cc)
{
	struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv;
	struct hash_desc desc;
	struct scatterlist sg;
	int err;

	sg_init_one(&sg, cc->key, cc->key_size);
	desc.tfm = essiv->hash_tfm;
	desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;

	err = crypto_hash_digest(&desc, &sg, cc->key_size, essiv->salt);
	if (err)
		return err;

	return crypto_cipher_setkey(essiv->tfm, essiv->salt,
				    crypto_hash_digestsize(essiv->hash_tfm));
}

202 203 204 205 206 207
static void crypt_iv_essiv_dtr(struct crypt_config *cc)
{
	struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv;

	crypto_free_cipher(essiv->tfm);
	essiv->tfm = NULL;
208 209 210 211 212 213

	crypto_free_hash(essiv->hash_tfm);
	essiv->hash_tfm = NULL;

	kzfree(essiv->salt);
	essiv->salt = NULL;
214 215
}

L
Linus Torvalds 已提交
216
static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti,
M
Milan Broz 已提交
217
			      const char *opts)
L
Linus Torvalds 已提交
218
{
219 220 221
	struct crypto_cipher *essiv_tfm = NULL;
	struct crypto_hash *hash_tfm = NULL;
	u8 *salt = NULL;
222
	int err;
L
Linus Torvalds 已提交
223

224
	if (!opts) {
225
		ti->error = "Digest algorithm missing for ESSIV mode";
L
Linus Torvalds 已提交
226 227 228
		return -EINVAL;
	}

229
	/* Allocate hash algorithm */
230 231
	hash_tfm = crypto_alloc_hash(opts, 0, CRYPTO_ALG_ASYNC);
	if (IS_ERR(hash_tfm)) {
232
		ti->error = "Error initializing ESSIV hash";
233 234
		err = PTR_ERR(hash_tfm);
		goto bad;
L
Linus Torvalds 已提交
235 236
	}

237
	salt = kzalloc(crypto_hash_digestsize(hash_tfm), GFP_KERNEL);
238
	if (!salt) {
239
		ti->error = "Error kmallocing salt storage in ESSIV";
240 241
		err = -ENOMEM;
		goto bad;
L
Linus Torvalds 已提交
242 243
	}

244
	/* Allocate essiv_tfm */
245 246
	essiv_tfm = crypto_alloc_cipher(cc->cipher, 0, CRYPTO_ALG_ASYNC);
	if (IS_ERR(essiv_tfm)) {
247
		ti->error = "Error allocating crypto tfm for ESSIV";
248 249
		err = PTR_ERR(essiv_tfm);
		goto bad;
L
Linus Torvalds 已提交
250
	}
251
	if (crypto_cipher_blocksize(essiv_tfm) !=
M
Milan Broz 已提交
252
	    crypto_ablkcipher_ivsize(cc->tfm)) {
253
		ti->error = "Block size of ESSIV cipher does "
M
Milan Broz 已提交
254
			    "not match IV size of block cipher";
255 256
		err = -EINVAL;
		goto bad;
L
Linus Torvalds 已提交
257 258
	}

259
	cc->iv_gen_private.essiv.salt = salt;
260
	cc->iv_gen_private.essiv.tfm = essiv_tfm;
261 262
	cc->iv_gen_private.essiv.hash_tfm = hash_tfm;

L
Linus Torvalds 已提交
263
	return 0;
264 265 266 267 268 269

bad:
	if (essiv_tfm && !IS_ERR(essiv_tfm))
		crypto_free_cipher(essiv_tfm);
	if (hash_tfm && !IS_ERR(hash_tfm))
		crypto_free_hash(hash_tfm);
270
	kfree(salt);
271
	return err;
L
Linus Torvalds 已提交
272 273 274 275 276 277
}

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);
278
	crypto_cipher_encrypt_one(cc->iv_gen_private.essiv.tfm, iv, iv);
L
Linus Torvalds 已提交
279 280 281
	return 0;
}

282 283 284
static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti,
			      const char *opts)
{
M
Milan Broz 已提交
285
	unsigned bs = crypto_ablkcipher_blocksize(cc->tfm);
286
	int log = ilog2(bs);
287 288 289 290 291 292 293 294 295 296 297 298 299 300

	/* 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;
	}

301
	cc->iv_gen_private.benbi.shift = 9 - log;
302 303 304 305 306 307 308 309 310 311

	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)
{
312 313
	__be64 val;

314
	memset(iv, 0, cc->iv_size - sizeof(u64)); /* rest is cleared below */
315

316
	val = cpu_to_be64(((u64)sector << cc->iv_gen_private.benbi.shift) + 1);
317
	put_unaligned(val, (__be64 *)(iv + cc->iv_size - sizeof(u64)));
318

L
Linus Torvalds 已提交
319 320 321
	return 0;
}

L
Ludwig Nussel 已提交
322 323 324 325 326 327 328
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 已提交
329 330 331 332 333 334 335
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,
336
	.init      = crypt_iv_essiv_init,
L
Linus Torvalds 已提交
337 338 339
	.generator = crypt_iv_essiv_gen
};

340 341 342 343 344
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 已提交
345

L
Ludwig Nussel 已提交
346 347 348 349
static struct crypt_iv_operations crypt_iv_null_ops = {
	.generator = crypt_iv_null_gen
};

M
Milan Broz 已提交
350 351 352
static void crypt_convert_init(struct crypt_config *cc,
			       struct convert_context *ctx,
			       struct bio *bio_out, struct bio *bio_in,
353
			       sector_t sector)
L
Linus Torvalds 已提交
354 355 356 357 358 359 360 361
{
	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 已提交
362
	init_completion(&ctx->restart);
L
Linus Torvalds 已提交
363 364
}

365 366 367 368 369 370 371 372 373 374 375 376
static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc,
					     struct ablkcipher_request *req)
{
	return (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
}

static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc,
					       struct dm_crypt_request *dmreq)
{
	return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start);
}

377
static int crypt_convert_block(struct crypt_config *cc,
M
Milan Broz 已提交
378 379
			       struct convert_context *ctx,
			       struct ablkcipher_request *req)
380 381 382
{
	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 已提交
383 384 385 386
	struct dm_crypt_request *dmreq;
	u8 *iv;
	int r = 0;

387
	dmreq = dmreq_of_req(cc, req);
M
Milan Broz 已提交
388 389
	iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
			 crypto_ablkcipher_alignmask(cc->tfm) + 1);
390

391
	dmreq->ctx = ctx;
M
Milan Broz 已提交
392 393
	sg_init_table(&dmreq->sg_in, 1);
	sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
394 395
		    bv_in->bv_offset + ctx->offset_in);

M
Milan Broz 已提交
396 397
	sg_init_table(&dmreq->sg_out, 1);
	sg_set_page(&dmreq->sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT,
398 399 400 401 402 403 404 405 406 407 408 409 410 411
		    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 已提交
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
	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;
427 428
}

M
Milan Broz 已提交
429 430
static void kcryptd_async_done(struct crypto_async_request *async_req,
			       int error);
M
Milan Broz 已提交
431 432 433 434 435
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 已提交
436 437
	ablkcipher_request_set_tfm(cc->req, cc->tfm);
	ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
438 439 440
					CRYPTO_TFM_REQ_MAY_SLEEP,
					kcryptd_async_done,
					dmreq_of_req(cc, cc->req));
M
Milan Broz 已提交
441 442
}

L
Linus Torvalds 已提交
443 444 445 446
/*
 * 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 已提交
447
			 struct convert_context *ctx)
L
Linus Torvalds 已提交
448
{
M
Milan Broz 已提交
449
	int r;
L
Linus Torvalds 已提交
450

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

L
Linus Torvalds 已提交
453 454 455
	while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
	      ctx->idx_out < ctx->bio_out->bi_vcnt) {

M
Milan Broz 已提交
456 457
		crypt_alloc_req(cc, ctx);

M
Milan Broz 已提交
458 459
		atomic_inc(&ctx->pending);

M
Milan Broz 已提交
460 461 462
		r = crypt_convert_block(cc, ctx, cc->req);

		switch (r) {
M
Milan Broz 已提交
463
		/* async */
M
Milan Broz 已提交
464 465 466 467 468 469
		case -EBUSY:
			wait_for_completion(&ctx->restart);
			INIT_COMPLETION(ctx->restart);
			/* fall through*/
		case -EINPROGRESS:
			cc->req = NULL;
M
Milan Broz 已提交
470 471 472 473
			ctx->sector++;
			continue;

		/* sync */
M
Milan Broz 已提交
474
		case 0:
M
Milan Broz 已提交
475
			atomic_dec(&ctx->pending);
M
Milan Broz 已提交
476
			ctx->sector++;
M
Milan Broz 已提交
477
			cond_resched();
M
Milan Broz 已提交
478 479
			continue;

M
Milan Broz 已提交
480 481 482 483 484
		/* error */
		default:
			atomic_dec(&ctx->pending);
			return r;
		}
L
Linus Torvalds 已提交
485 486
	}

M
Milan Broz 已提交
487
	return 0;
L
Linus Torvalds 已提交
488 489
}

M
Milan Broz 已提交
490 491
static void dm_crypt_bio_destructor(struct bio *bio)
{
A
Alasdair G Kergon 已提交
492
	struct dm_crypt_io *io = bio->bi_private;
M
Milan Broz 已提交
493 494 495
	struct crypt_config *cc = io->target->private;

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

L
Linus Torvalds 已提交
498 499 500
/*
 * Generate a new unfragmented bio with the given size
 * This should never violate the device limitations
501 502
 * May return a smaller bio when running out of pages, indicated by
 * *out_of_pages set to 1.
L
Linus Torvalds 已提交
503
 */
504 505
static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size,
				      unsigned *out_of_pages)
L
Linus Torvalds 已提交
506
{
O
Olaf Kirch 已提交
507
	struct crypt_config *cc = io->target->private;
508
	struct bio *clone;
L
Linus Torvalds 已提交
509
	unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
510
	gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
M
Milan Broz 已提交
511 512
	unsigned i, len;
	struct page *page;
L
Linus Torvalds 已提交
513

O
Olaf Kirch 已提交
514
	clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs);
515
	if (!clone)
L
Linus Torvalds 已提交
516 517
		return NULL;

O
Olaf Kirch 已提交
518
	clone_init(io, clone);
519
	*out_of_pages = 0;
M
Milan Broz 已提交
520

521
	for (i = 0; i < nr_iovecs; i++) {
M
Milan Broz 已提交
522
		page = mempool_alloc(cc->page_pool, gfp_mask);
523 524
		if (!page) {
			*out_of_pages = 1;
L
Linus Torvalds 已提交
525
			break;
526
		}
L
Linus Torvalds 已提交
527 528 529 530 531 532

		/*
		 * 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
		 */
533
		if (i == (MIN_BIO_PAGES - 1))
L
Linus Torvalds 已提交
534 535
			gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT;

M
Milan Broz 已提交
536 537 538 539 540 541
		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 已提交
542

M
Milan Broz 已提交
543
		size -= len;
L
Linus Torvalds 已提交
544 545
	}

546 547
	if (!clone->bi_size) {
		bio_put(clone);
L
Linus Torvalds 已提交
548 549 550
		return NULL;
	}

551
	return clone;
L
Linus Torvalds 已提交
552 553
}

N
Neil Brown 已提交
554
static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone)
L
Linus Torvalds 已提交
555
{
N
Neil Brown 已提交
556
	unsigned int i;
L
Linus Torvalds 已提交
557 558
	struct bio_vec *bv;

N
Neil Brown 已提交
559
	for (i = 0; i < clone->bi_vcnt; i++) {
560
		bv = bio_iovec_idx(clone, i);
L
Linus Torvalds 已提交
561 562 563 564 565 566
		BUG_ON(!bv->bv_page);
		mempool_free(bv->bv_page, cc->page_pool);
		bv->bv_page = NULL;
	}
}

M
Milan Broz 已提交
567 568 569 570 571 572 573 574 575 576 577
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 已提交
578
	io->base_io = NULL;
M
Milan Broz 已提交
579 580 581 582 583
	atomic_set(&io->pending, 0);

	return io;
}

M
Milan Broz 已提交
584 585 586 587 588
static void crypt_inc_pending(struct dm_crypt_io *io)
{
	atomic_inc(&io->pending);
}

L
Linus Torvalds 已提交
589 590 591
/*
 * One of the bios was finished. Check for completion of
 * the whole request and correctly clean up the buffer.
M
Milan Broz 已提交
592
 * If base_io is set, wait for the last fragment to complete.
L
Linus Torvalds 已提交
593
 */
594
static void crypt_dec_pending(struct dm_crypt_io *io)
L
Linus Torvalds 已提交
595
{
596
	struct crypt_config *cc = io->target->private;
597 598 599
	struct bio *base_bio = io->base_bio;
	struct dm_crypt_io *base_io = io->base_io;
	int error = io->error;
L
Linus Torvalds 已提交
600 601 602 603

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

604 605 606 607
	mempool_free(io, cc->io_pool);

	if (likely(!base_io))
		bio_endio(base_bio, error);
M
Milan Broz 已提交
608
	else {
609 610 611
		if (error && !base_io->error)
			base_io->error = error;
		crypt_dec_pending(base_io);
M
Milan Broz 已提交
612
	}
L
Linus Torvalds 已提交
613 614 615
}

/*
M
Milan Broz 已提交
616
 * kcryptd/kcryptd_io:
L
Linus Torvalds 已提交
617 618
 *
 * Needed because it would be very unwise to do decryption in an
619
 * interrupt context.
M
Milan Broz 已提交
620 621 622 623 624 625 626 627
 *
 * 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 已提交
628
 */
629
static void crypt_endio(struct bio *clone, int error)
630
{
A
Alasdair G Kergon 已提交
631
	struct dm_crypt_io *io = clone->bi_private;
632
	struct crypt_config *cc = io->target->private;
M
Milan Broz 已提交
633
	unsigned rw = bio_data_dir(clone);
634

M
Milan Broz 已提交
635 636 637
	if (unlikely(!bio_flagged(clone, BIO_UPTODATE) && !error))
		error = -EIO;

638
	/*
639
	 * free the processed pages
640
	 */
M
Milan Broz 已提交
641
	if (rw == WRITE)
N
Neil Brown 已提交
642
		crypt_free_buffer_pages(cc, clone);
643 644 645

	bio_put(clone);

M
Milan Broz 已提交
646 647 648 649
	if (rw == READ && !error) {
		kcryptd_queue_crypt(io);
		return;
	}
650 651 652 653 654

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

	crypt_dec_pending(io);
655 656
}

A
Alasdair G Kergon 已提交
657
static void clone_init(struct dm_crypt_io *io, struct bio *clone)
658 659 660 661 662 663 664
{
	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 已提交
665
	clone->bi_destructor = dm_crypt_bio_destructor;
666 667
}

668
static void kcryptd_io_read(struct dm_crypt_io *io)
669 670 671 672
{
	struct crypt_config *cc = io->target->private;
	struct bio *base_bio = io->base_bio;
	struct bio *clone;
673

M
Milan Broz 已提交
674
	crypt_inc_pending(io);
675 676 677 678 679 680

	/*
	 * 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 已提交
681
	clone = bio_alloc_bioset(GFP_NOIO, bio_segments(base_bio), cc->bs);
682
	if (unlikely(!clone)) {
683 684
		io->error = -ENOMEM;
		crypt_dec_pending(io);
685
		return;
686
	}
687 688 689 690 691

	clone_init(io, clone);
	clone->bi_idx = 0;
	clone->bi_vcnt = bio_segments(base_bio);
	clone->bi_size = base_bio->bi_size;
692
	clone->bi_sector = cc->start + io->sector;
693 694 695
	memcpy(clone->bi_io_vec, bio_iovec(base_bio),
	       sizeof(struct bio_vec) * clone->bi_vcnt);

696
	generic_make_request(clone);
697 698
}

699 700
static void kcryptd_io_write(struct dm_crypt_io *io)
{
M
Milan Broz 已提交
701 702
	struct bio *clone = io->ctx.bio_out;
	generic_make_request(clone);
703 704
}

705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
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 已提交
723 724
static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io,
					  int error, int async)
725
{
M
Milan Broz 已提交
726 727 728 729 730 731 732
	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;
733
		crypt_dec_pending(io);
M
Milan Broz 已提交
734 735 736 737 738 739 740
		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 已提交
741

M
Milan Broz 已提交
742 743
	if (async)
		kcryptd_queue_io(io);
744
	else
M
Milan Broz 已提交
745
		generic_make_request(clone);
746 747
}

M
Milan Broz 已提交
748
static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
749 750 751
{
	struct crypt_config *cc = io->target->private;
	struct bio *clone;
M
Milan Broz 已提交
752
	struct dm_crypt_io *new_io;
M
Milan Broz 已提交
753
	int crypt_finished;
754
	unsigned out_of_pages = 0;
M
Milan Broz 已提交
755
	unsigned remaining = io->base_bio->bi_size;
M
Milan Broz 已提交
756
	sector_t sector = io->sector;
M
Milan Broz 已提交
757
	int r;
758

M
Milan Broz 已提交
759 760 761 762
	/*
	 * Prevent io from disappearing until this function completes.
	 */
	crypt_inc_pending(io);
M
Milan Broz 已提交
763
	crypt_convert_init(cc, &io->ctx, NULL, io->base_bio, sector);
M
Milan Broz 已提交
764

765 766 767 768 769
	/*
	 * The allocated buffers can be smaller than the whole bio,
	 * so repeat the whole process until all the data can be handled.
	 */
	while (remaining) {
770
		clone = crypt_alloc_buffer(io, remaining, &out_of_pages);
771
		if (unlikely(!clone)) {
772
			io->error = -ENOMEM;
M
Milan Broz 已提交
773
			break;
774
		}
775

776 777
		io->ctx.bio_out = clone;
		io->ctx.idx_out = 0;
778

M
Milan Broz 已提交
779
		remaining -= clone->bi_size;
M
Milan Broz 已提交
780
		sector += bio_sectors(clone);
781

M
Milan Broz 已提交
782
		crypt_inc_pending(io);
M
Milan Broz 已提交
783
		r = crypt_convert(cc, &io->ctx);
M
Milan Broz 已提交
784
		crypt_finished = atomic_dec_and_test(&io->ctx.pending);
785

M
Milan Broz 已提交
786 787
		/* Encryption was already finished, submit io now */
		if (crypt_finished) {
M
Milan Broz 已提交
788
			kcryptd_crypt_write_io_submit(io, r, 0);
M
Milan Broz 已提交
789 790 791 792 793

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

			io->sector = sector;
M
Milan Broz 已提交
798
		}
799

800 801 802 803 804
		/*
		 * Out of memory -> run queues
		 * But don't wait if split was due to the io size restriction
		 */
		if (unlikely(out_of_pages))
805
			congestion_wait(BLK_RW_ASYNC, HZ/100);
806

M
Milan Broz 已提交
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
		/*
		 * 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;
		}
834
	}
M
Milan Broz 已提交
835 836

	crypt_dec_pending(io);
837 838
}

839
static void kcryptd_crypt_read_done(struct dm_crypt_io *io, int error)
840 841 842 843 844 845 846
{
	if (unlikely(error < 0))
		io->error = -EIO;

	crypt_dec_pending(io);
}

847
static void kcryptd_crypt_read_convert(struct dm_crypt_io *io)
848 849
{
	struct crypt_config *cc = io->target->private;
850
	int r = 0;
L
Linus Torvalds 已提交
851

M
Milan Broz 已提交
852
	crypt_inc_pending(io);
M
Milan Broz 已提交
853

854
	crypt_convert_init(cc, &io->ctx, io->base_bio, io->base_bio,
855
			   io->sector);
L
Linus Torvalds 已提交
856

857 858
	r = crypt_convert(cc, &io->ctx);

M
Milan Broz 已提交
859
	if (atomic_dec_and_test(&io->ctx.pending))
M
Milan Broz 已提交
860 861 862
		kcryptd_crypt_read_done(io, r);

	crypt_dec_pending(io);
L
Linus Torvalds 已提交
863 864
}

M
Milan Broz 已提交
865 866 867
static void kcryptd_async_done(struct crypto_async_request *async_req,
			       int error)
{
868 869
	struct dm_crypt_request *dmreq = async_req->data;
	struct convert_context *ctx = dmreq->ctx;
M
Milan Broz 已提交
870 871 872 873 874 875 876 877
	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;
	}

878
	mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
M
Milan Broz 已提交
879 880 881 882 883 884 885 886 887 888

	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);
}

889
static void kcryptd_crypt(struct work_struct *work)
L
Linus Torvalds 已提交
890
{
A
Alasdair G Kergon 已提交
891
	struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work);
892

M
Milan Broz 已提交
893
	if (bio_data_dir(io->base_bio) == READ)
894
		kcryptd_crypt_read_convert(io);
895
	else
896
		kcryptd_crypt_write_convert(io);
M
Milan Broz 已提交
897 898
}

899
static void kcryptd_queue_crypt(struct dm_crypt_io *io)
M
Milan Broz 已提交
900
{
901
	struct crypt_config *cc = io->target->private;
M
Milan Broz 已提交
902

903 904
	INIT_WORK(&io->work, kcryptd_crypt);
	queue_work(cc->crypt_queue, &io->work);
L
Linus Torvalds 已提交
905 906 907 908 909 910 911 912 913 914 915 916 917
}

/*
 * 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';

918
	for (i = 0; i < size; i++) {
L
Linus Torvalds 已提交
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
		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;

941
	for (i = 0; i < size; i++) {
L
Linus Torvalds 已提交
942 943 944 945 946 947
		sprintf(hex, "%02x", *key);
		hex += 2;
		key++;
	}
}

M
Milan Broz 已提交
948 949 950 951 952 953 954 955 956 957
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 已提交
958
	   (key_size && crypt_decode_key(cc->key, key, key_size) < 0))
M
Milan Broz 已提交
959 960 961 962
		return -EINVAL;

	set_bit(DM_CRYPT_KEY_VALID, &cc->flags);

963
	return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size);
M
Milan Broz 已提交
964 965 966 967 968 969
}

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));
970
	return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size);
M
Milan Broz 已提交
971 972
}

L
Linus Torvalds 已提交
973 974 975 976 977 978 979
/*
 * 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 已提交
980
	struct crypto_ablkcipher *tfm;
L
Linus Torvalds 已提交
981 982 983 984 985 986
	char *tmp;
	char *cipher;
	char *chainmode;
	char *ivmode;
	char *ivopts;
	unsigned int key_size;
A
Andrew Morton 已提交
987
	unsigned long long tmpll;
L
Linus Torvalds 已提交
988 989

	if (argc != 5) {
990
		ti->error = "Not enough arguments";
L
Linus Torvalds 已提交
991 992 993 994 995 996 997 998 999 1000
		return -EINVAL;
	}

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

	if (tmp)
1001
		DMWARN("Unexpected additional cipher options");
L
Linus Torvalds 已提交
1002 1003 1004

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

M
Milan Broz 已提交
1005
 	cc = kzalloc(sizeof(*cc) + key_size * sizeof(u8), GFP_KERNEL);
L
Linus Torvalds 已提交
1006 1007
	if (cc == NULL) {
		ti->error =
1008
			"Cannot allocate transparent encryption context";
L
Linus Torvalds 已提交
1009 1010 1011
		return -ENOMEM;
	}

1012
	/* Compatibility mode for old dm-crypt cipher strings */
L
Linus Torvalds 已提交
1013 1014 1015 1016 1017
	if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) {
		chainmode = "cbc";
		ivmode = "plain";
	}

1018 1019
	if (strcmp(chainmode, "ecb") && !ivmode) {
		ti->error = "This chaining mode requires an IV mechanism";
M
Milan Broz 已提交
1020
		goto bad_cipher;
L
Linus Torvalds 已提交
1021 1022
	}

M
Milan Broz 已提交
1023 1024
	if (snprintf(cc->cipher, CRYPTO_MAX_ALG_NAME, "%s(%s)",
		     chainmode, cipher) >= CRYPTO_MAX_ALG_NAME) {
1025
		ti->error = "Chain mode + cipher name is too long";
M
Milan Broz 已提交
1026
		goto bad_cipher;
L
Linus Torvalds 已提交
1027 1028
	}

M
Milan Broz 已提交
1029
	tfm = crypto_alloc_ablkcipher(cc->cipher, 0, 0);
1030
	if (IS_ERR(tfm)) {
1031
		ti->error = "Error allocating crypto tfm";
M
Milan Broz 已提交
1032
		goto bad_cipher;
L
Linus Torvalds 已提交
1033 1034
	}

1035 1036
	strcpy(cc->cipher, cipher);
	strcpy(cc->chainmode, chainmode);
L
Linus Torvalds 已提交
1037 1038
	cc->tfm = tfm;

1039 1040 1041 1042 1043
	if (crypt_set_key(cc, argv[1]) < 0) {
		ti->error = "Error decoding and setting key";
		goto bad_ivmode;
	}

L
Linus Torvalds 已提交
1044
	/*
1045
	 * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi".
L
Linus Torvalds 已提交
1046 1047 1048 1049 1050 1051 1052 1053 1054
	 * 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;
1055 1056
	else if (strcmp(ivmode, "benbi") == 0)
		cc->iv_gen_ops = &crypt_iv_benbi_ops;
L
Ludwig Nussel 已提交
1057 1058
	else if (strcmp(ivmode, "null") == 0)
		cc->iv_gen_ops = &crypt_iv_null_ops;
L
Linus Torvalds 已提交
1059
	else {
1060
		ti->error = "Invalid IV mode";
M
Milan Broz 已提交
1061
		goto bad_ivmode;
L
Linus Torvalds 已提交
1062 1063 1064 1065
	}

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

1068 1069 1070 1071 1072 1073
	if (cc->iv_gen_ops && cc->iv_gen_ops->init &&
	    cc->iv_gen_ops->init(cc) < 0) {
		ti->error = "Error initialising IV";
		goto bad_slab_pool;
	}

M
Milan Broz 已提交
1074
	cc->iv_size = crypto_ablkcipher_ivsize(tfm);
1075
	if (cc->iv_size)
L
Linus Torvalds 已提交
1076
		/* at least a 64 bit sector number should fit in our buffer */
1077
		cc->iv_size = max(cc->iv_size,
M
Milan Broz 已提交
1078
				  (unsigned int)(sizeof(u64) / sizeof(u8)));
L
Linus Torvalds 已提交
1079 1080
	else {
		if (cc->iv_gen_ops) {
1081
			DMWARN("Selected cipher does not support IVs");
L
Linus Torvalds 已提交
1082 1083 1084 1085 1086 1087
			if (cc->iv_gen_ops->dtr)
				cc->iv_gen_ops->dtr(cc);
			cc->iv_gen_ops = NULL;
		}
	}

1088
	cc->io_pool = mempool_create_slab_pool(MIN_IOS, _crypt_io_pool);
L
Linus Torvalds 已提交
1089
	if (!cc->io_pool) {
1090
		ti->error = "Cannot allocate crypt io mempool";
M
Milan Broz 已提交
1091
		goto bad_slab_pool;
L
Linus Torvalds 已提交
1092 1093
	}

M
Milan Broz 已提交
1094
	cc->dmreq_start = sizeof(struct ablkcipher_request);
M
Milan Broz 已提交
1095
	cc->dmreq_start += crypto_ablkcipher_reqsize(tfm);
M
Milan Broz 已提交
1096
	cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment());
M
Milan Broz 已提交
1097 1098
	cc->dmreq_start += crypto_ablkcipher_alignmask(tfm) &
			   ~(crypto_tfm_ctx_alignment() - 1);
M
Milan Broz 已提交
1099 1100 1101 1102 1103 1104 1105 1106 1107

	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;

1108
	cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0);
L
Linus Torvalds 已提交
1109
	if (!cc->page_pool) {
1110
		ti->error = "Cannot allocate page mempool";
M
Milan Broz 已提交
1111
		goto bad_page_pool;
L
Linus Torvalds 已提交
1112 1113
	}

1114
	cc->bs = bioset_create(MIN_IOS, 0);
M
Milan Broz 已提交
1115 1116 1117 1118 1119
	if (!cc->bs) {
		ti->error = "Cannot allocate crypt bioset";
		goto bad_bs;
	}

A
Andrew Morton 已提交
1120
	if (sscanf(argv[2], "%llu", &tmpll) != 1) {
1121
		ti->error = "Invalid iv_offset sector";
M
Milan Broz 已提交
1122
		goto bad_device;
L
Linus Torvalds 已提交
1123
	}
A
Andrew Morton 已提交
1124
	cc->iv_offset = tmpll;
L
Linus Torvalds 已提交
1125

A
Andrew Morton 已提交
1126
	if (sscanf(argv[4], "%llu", &tmpll) != 1) {
1127
		ti->error = "Invalid device sector";
M
Milan Broz 已提交
1128
		goto bad_device;
L
Linus Torvalds 已提交
1129
	}
A
Andrew Morton 已提交
1130
	cc->start = tmpll;
L
Linus Torvalds 已提交
1131 1132

	if (dm_get_device(ti, argv[3], cc->start, ti->len,
M
Milan Broz 已提交
1133
			  dm_table_get_mode(ti->table), &cc->dev)) {
1134
		ti->error = "Device lookup failed";
M
Milan Broz 已提交
1135
		goto bad_device;
L
Linus Torvalds 已提交
1136 1137 1138 1139 1140 1141 1142
	}

	if (ivmode && cc->iv_gen_ops) {
		if (ivopts)
			*(ivopts - 1) = ':';
		cc->iv_mode = kmalloc(strlen(ivmode) + 1, GFP_KERNEL);
		if (!cc->iv_mode) {
1143
			ti->error = "Error kmallocing iv_mode string";
M
Milan Broz 已提交
1144
			goto bad_ivmode_string;
L
Linus Torvalds 已提交
1145 1146 1147 1148 1149
		}
		strcpy(cc->iv_mode, ivmode);
	} else
		cc->iv_mode = NULL;

M
Milan Broz 已提交
1150 1151 1152 1153 1154 1155 1156 1157
	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) {
1158
		ti->error = "Couldn't create kcryptd queue";
M
Milan Broz 已提交
1159
		goto bad_crypt_queue;
1160 1161
	}

M
Mikulas Patocka 已提交
1162
	ti->num_flush_requests = 1;
L
Linus Torvalds 已提交
1163 1164 1165
	ti->private = cc;
	return 0;

M
Milan Broz 已提交
1166 1167 1168
bad_crypt_queue:
	destroy_workqueue(cc->io_queue);
bad_io_queue:
1169
	kfree(cc->iv_mode);
M
Milan Broz 已提交
1170
bad_ivmode_string:
1171
	dm_put_device(ti, cc->dev);
M
Milan Broz 已提交
1172
bad_device:
M
Milan Broz 已提交
1173 1174
	bioset_free(cc->bs);
bad_bs:
L
Linus Torvalds 已提交
1175
	mempool_destroy(cc->page_pool);
M
Milan Broz 已提交
1176
bad_page_pool:
M
Milan Broz 已提交
1177 1178
	mempool_destroy(cc->req_pool);
bad_req_pool:
L
Linus Torvalds 已提交
1179
	mempool_destroy(cc->io_pool);
M
Milan Broz 已提交
1180
bad_slab_pool:
L
Linus Torvalds 已提交
1181 1182
	if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
		cc->iv_gen_ops->dtr(cc);
M
Milan Broz 已提交
1183
bad_ivmode:
M
Milan Broz 已提交
1184
	crypto_free_ablkcipher(tfm);
M
Milan Broz 已提交
1185
bad_cipher:
1186
	/* Must zero key material before freeing */
J
Johannes Weiner 已提交
1187
	kzfree(cc);
L
Linus Torvalds 已提交
1188 1189 1190 1191 1192 1193 1194
	return -EINVAL;
}

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

M
Milan Broz 已提交
1195 1196
	destroy_workqueue(cc->io_queue);
	destroy_workqueue(cc->crypt_queue);
M
Milan Broz 已提交
1197

M
Milan Broz 已提交
1198 1199 1200
	if (cc->req)
		mempool_free(cc->req, cc->req_pool);

M
Milan Broz 已提交
1201
	bioset_free(cc->bs);
L
Linus Torvalds 已提交
1202
	mempool_destroy(cc->page_pool);
M
Milan Broz 已提交
1203
	mempool_destroy(cc->req_pool);
L
Linus Torvalds 已提交
1204 1205
	mempool_destroy(cc->io_pool);

1206
	kfree(cc->iv_mode);
L
Linus Torvalds 已提交
1207 1208
	if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
		cc->iv_gen_ops->dtr(cc);
M
Milan Broz 已提交
1209
	crypto_free_ablkcipher(cc->tfm);
L
Linus Torvalds 已提交
1210
	dm_put_device(ti, cc->dev);
1211 1212

	/* Must zero key material before freeing */
J
Johannes Weiner 已提交
1213
	kzfree(cc);
L
Linus Torvalds 已提交
1214 1215 1216 1217 1218
}

static int crypt_map(struct dm_target *ti, struct bio *bio,
		     union map_info *map_context)
{
A
Alasdair G Kergon 已提交
1219
	struct dm_crypt_io *io;
M
Mikulas Patocka 已提交
1220 1221 1222 1223 1224 1225 1226
	struct crypt_config *cc;

	if (unlikely(bio_empty_barrier(bio))) {
		cc = ti->private;
		bio->bi_bdev = cc->dev->bdev;
		return DM_MAPIO_REMAPPED;
	}
L
Linus Torvalds 已提交
1227

M
Milan Broz 已提交
1228
	io = crypt_io_alloc(ti, bio, bio->bi_sector - ti->begin);
M
Milan Broz 已提交
1229 1230 1231 1232 1233

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

1235
	return DM_MAPIO_SUBMITTED;
L
Linus Torvalds 已提交
1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
}

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)
1251 1252
			DMEMIT("%s-%s-%s ", cc->cipher, cc->chainmode,
			       cc->iv_mode);
L
Linus Torvalds 已提交
1253
		else
1254
			DMEMIT("%s-%s ", cc->cipher, cc->chainmode);
L
Linus Torvalds 已提交
1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267

		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 已提交
1268 1269
		DMEMIT(" %llu %s %llu", (unsigned long long)cc->iv_offset,
				cc->dev->name, (unsigned long long)cc->start);
L
Linus Torvalds 已提交
1270 1271 1272 1273 1274
		break;
	}
	return 0;
}

M
Milan Broz 已提交
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
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 已提交
1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342
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));
}

1343 1344 1345 1346 1347
static int crypt_iterate_devices(struct dm_target *ti,
				 iterate_devices_callout_fn fn, void *data)
{
	struct crypt_config *cc = ti->private;

1348
	return fn(ti, cc->dev, cc->start, ti->len, data);
1349 1350
}

L
Linus Torvalds 已提交
1351 1352
static struct target_type crypt_target = {
	.name   = "crypt",
1353
	.version = {1, 7, 0},
L
Linus Torvalds 已提交
1354 1355 1356 1357 1358
	.module = THIS_MODULE,
	.ctr    = crypt_ctr,
	.dtr    = crypt_dtr,
	.map    = crypt_map,
	.status = crypt_status,
M
Milan Broz 已提交
1359 1360 1361 1362
	.postsuspend = crypt_postsuspend,
	.preresume = crypt_preresume,
	.resume = crypt_resume,
	.message = crypt_message,
M
Milan Broz 已提交
1363
	.merge  = crypt_merge,
1364
	.iterate_devices = crypt_iterate_devices,
L
Linus Torvalds 已提交
1365 1366 1367 1368 1369 1370
};

static int __init dm_crypt_init(void)
{
	int r;

A
Alasdair G Kergon 已提交
1371
	_crypt_io_pool = KMEM_CACHE(dm_crypt_io, 0);
L
Linus Torvalds 已提交
1372 1373 1374 1375 1376
	if (!_crypt_io_pool)
		return -ENOMEM;

	r = dm_register_target(&crypt_target);
	if (r < 0) {
1377
		DMERR("register failed %d", r);
1378
		kmem_cache_destroy(_crypt_io_pool);
L
Linus Torvalds 已提交
1379 1380 1381 1382 1383 1384 1385
	}

	return r;
}

static void __exit dm_crypt_exit(void)
{
1386
	dm_unregister_target(&crypt_target);
L
Linus Torvalds 已提交
1387 1388 1389 1390 1391 1392 1393 1394 1395
	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");