blk-crypto-fallback.c (19123B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright 2019 Google LLC 4 */ 5 6/* 7 * Refer to Documentation/block/inline-encryption.rst for detailed explanation. 8 */ 9 10#define pr_fmt(fmt) "blk-crypto-fallback: " fmt 11 12#include <crypto/skcipher.h> 13#include <linux/blk-crypto.h> 14#include <linux/blk-crypto-profile.h> 15#include <linux/blkdev.h> 16#include <linux/crypto.h> 17#include <linux/mempool.h> 18#include <linux/module.h> 19#include <linux/random.h> 20#include <linux/scatterlist.h> 21 22#include "blk-cgroup.h" 23#include "blk-crypto-internal.h" 24 25static unsigned int num_prealloc_bounce_pg = 32; 26module_param(num_prealloc_bounce_pg, uint, 0); 27MODULE_PARM_DESC(num_prealloc_bounce_pg, 28 "Number of preallocated bounce pages for the blk-crypto crypto API fallback"); 29 30static unsigned int blk_crypto_num_keyslots = 100; 31module_param_named(num_keyslots, blk_crypto_num_keyslots, uint, 0); 32MODULE_PARM_DESC(num_keyslots, 33 "Number of keyslots for the blk-crypto crypto API fallback"); 34 35static unsigned int num_prealloc_fallback_crypt_ctxs = 128; 36module_param(num_prealloc_fallback_crypt_ctxs, uint, 0); 37MODULE_PARM_DESC(num_prealloc_crypt_fallback_ctxs, 38 "Number of preallocated bio fallback crypto contexts for blk-crypto to use during crypto API fallback"); 39 40struct bio_fallback_crypt_ctx { 41 struct bio_crypt_ctx crypt_ctx; 42 /* 43 * Copy of the bvec_iter when this bio was submitted. 44 * We only want to en/decrypt the part of the bio as described by the 45 * bvec_iter upon submission because bio might be split before being 46 * resubmitted 47 */ 48 struct bvec_iter crypt_iter; 49 union { 50 struct { 51 struct work_struct work; 52 struct bio *bio; 53 }; 54 struct { 55 void *bi_private_orig; 56 bio_end_io_t *bi_end_io_orig; 57 }; 58 }; 59}; 60 61static struct kmem_cache *bio_fallback_crypt_ctx_cache; 62static mempool_t *bio_fallback_crypt_ctx_pool; 63 64/* 65 * Allocating a crypto tfm during I/O can deadlock, so we have to preallocate 66 * all of a mode's tfms when that mode starts being used. Since each mode may 67 * need all the keyslots at some point, each mode needs its own tfm for each 68 * keyslot; thus, a keyslot may contain tfms for multiple modes. However, to 69 * match the behavior of real inline encryption hardware (which only supports a 70 * single encryption context per keyslot), we only allow one tfm per keyslot to 71 * be used at a time - the rest of the unused tfms have their keys cleared. 72 */ 73static DEFINE_MUTEX(tfms_init_lock); 74static bool tfms_inited[BLK_ENCRYPTION_MODE_MAX]; 75 76static struct blk_crypto_fallback_keyslot { 77 enum blk_crypto_mode_num crypto_mode; 78 struct crypto_skcipher *tfms[BLK_ENCRYPTION_MODE_MAX]; 79} *blk_crypto_keyslots; 80 81static struct blk_crypto_profile blk_crypto_fallback_profile; 82static struct workqueue_struct *blk_crypto_wq; 83static mempool_t *blk_crypto_bounce_page_pool; 84static struct bio_set crypto_bio_split; 85 86/* 87 * This is the key we set when evicting a keyslot. This *should* be the all 0's 88 * key, but AES-XTS rejects that key, so we use some random bytes instead. 89 */ 90static u8 blank_key[BLK_CRYPTO_MAX_KEY_SIZE]; 91 92static void blk_crypto_fallback_evict_keyslot(unsigned int slot) 93{ 94 struct blk_crypto_fallback_keyslot *slotp = &blk_crypto_keyslots[slot]; 95 enum blk_crypto_mode_num crypto_mode = slotp->crypto_mode; 96 int err; 97 98 WARN_ON(slotp->crypto_mode == BLK_ENCRYPTION_MODE_INVALID); 99 100 /* Clear the key in the skcipher */ 101 err = crypto_skcipher_setkey(slotp->tfms[crypto_mode], blank_key, 102 blk_crypto_modes[crypto_mode].keysize); 103 WARN_ON(err); 104 slotp->crypto_mode = BLK_ENCRYPTION_MODE_INVALID; 105} 106 107static int 108blk_crypto_fallback_keyslot_program(struct blk_crypto_profile *profile, 109 const struct blk_crypto_key *key, 110 unsigned int slot) 111{ 112 struct blk_crypto_fallback_keyslot *slotp = &blk_crypto_keyslots[slot]; 113 const enum blk_crypto_mode_num crypto_mode = 114 key->crypto_cfg.crypto_mode; 115 int err; 116 117 if (crypto_mode != slotp->crypto_mode && 118 slotp->crypto_mode != BLK_ENCRYPTION_MODE_INVALID) 119 blk_crypto_fallback_evict_keyslot(slot); 120 121 slotp->crypto_mode = crypto_mode; 122 err = crypto_skcipher_setkey(slotp->tfms[crypto_mode], key->raw, 123 key->size); 124 if (err) { 125 blk_crypto_fallback_evict_keyslot(slot); 126 return err; 127 } 128 return 0; 129} 130 131static int blk_crypto_fallback_keyslot_evict(struct blk_crypto_profile *profile, 132 const struct blk_crypto_key *key, 133 unsigned int slot) 134{ 135 blk_crypto_fallback_evict_keyslot(slot); 136 return 0; 137} 138 139static const struct blk_crypto_ll_ops blk_crypto_fallback_ll_ops = { 140 .keyslot_program = blk_crypto_fallback_keyslot_program, 141 .keyslot_evict = blk_crypto_fallback_keyslot_evict, 142}; 143 144static void blk_crypto_fallback_encrypt_endio(struct bio *enc_bio) 145{ 146 struct bio *src_bio = enc_bio->bi_private; 147 int i; 148 149 for (i = 0; i < enc_bio->bi_vcnt; i++) 150 mempool_free(enc_bio->bi_io_vec[i].bv_page, 151 blk_crypto_bounce_page_pool); 152 153 src_bio->bi_status = enc_bio->bi_status; 154 155 bio_uninit(enc_bio); 156 kfree(enc_bio); 157 bio_endio(src_bio); 158} 159 160static struct bio *blk_crypto_fallback_clone_bio(struct bio *bio_src) 161{ 162 unsigned int nr_segs = bio_segments(bio_src); 163 struct bvec_iter iter; 164 struct bio_vec bv; 165 struct bio *bio; 166 167 bio = bio_kmalloc(nr_segs, GFP_NOIO); 168 if (!bio) 169 return NULL; 170 bio_init(bio, bio_src->bi_bdev, bio->bi_inline_vecs, nr_segs, 171 bio_src->bi_opf); 172 if (bio_flagged(bio_src, BIO_REMAPPED)) 173 bio_set_flag(bio, BIO_REMAPPED); 174 bio->bi_ioprio = bio_src->bi_ioprio; 175 bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector; 176 bio->bi_iter.bi_size = bio_src->bi_iter.bi_size; 177 178 bio_for_each_segment(bv, bio_src, iter) 179 bio->bi_io_vec[bio->bi_vcnt++] = bv; 180 181 bio_clone_blkg_association(bio, bio_src); 182 183 return bio; 184} 185 186static bool 187blk_crypto_fallback_alloc_cipher_req(struct blk_crypto_keyslot *slot, 188 struct skcipher_request **ciph_req_ret, 189 struct crypto_wait *wait) 190{ 191 struct skcipher_request *ciph_req; 192 const struct blk_crypto_fallback_keyslot *slotp; 193 int keyslot_idx = blk_crypto_keyslot_index(slot); 194 195 slotp = &blk_crypto_keyslots[keyslot_idx]; 196 ciph_req = skcipher_request_alloc(slotp->tfms[slotp->crypto_mode], 197 GFP_NOIO); 198 if (!ciph_req) 199 return false; 200 201 skcipher_request_set_callback(ciph_req, 202 CRYPTO_TFM_REQ_MAY_BACKLOG | 203 CRYPTO_TFM_REQ_MAY_SLEEP, 204 crypto_req_done, wait); 205 *ciph_req_ret = ciph_req; 206 207 return true; 208} 209 210static bool blk_crypto_fallback_split_bio_if_needed(struct bio **bio_ptr) 211{ 212 struct bio *bio = *bio_ptr; 213 unsigned int i = 0; 214 unsigned int num_sectors = 0; 215 struct bio_vec bv; 216 struct bvec_iter iter; 217 218 bio_for_each_segment(bv, bio, iter) { 219 num_sectors += bv.bv_len >> SECTOR_SHIFT; 220 if (++i == BIO_MAX_VECS) 221 break; 222 } 223 if (num_sectors < bio_sectors(bio)) { 224 struct bio *split_bio; 225 226 split_bio = bio_split(bio, num_sectors, GFP_NOIO, 227 &crypto_bio_split); 228 if (!split_bio) { 229 bio->bi_status = BLK_STS_RESOURCE; 230 return false; 231 } 232 bio_chain(split_bio, bio); 233 submit_bio_noacct(bio); 234 *bio_ptr = split_bio; 235 } 236 237 return true; 238} 239 240union blk_crypto_iv { 241 __le64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE]; 242 u8 bytes[BLK_CRYPTO_MAX_IV_SIZE]; 243}; 244 245static void blk_crypto_dun_to_iv(const u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE], 246 union blk_crypto_iv *iv) 247{ 248 int i; 249 250 for (i = 0; i < BLK_CRYPTO_DUN_ARRAY_SIZE; i++) 251 iv->dun[i] = cpu_to_le64(dun[i]); 252} 253 254/* 255 * The crypto API fallback's encryption routine. 256 * Allocate a bounce bio for encryption, encrypt the input bio using crypto API, 257 * and replace *bio_ptr with the bounce bio. May split input bio if it's too 258 * large. Returns true on success. Returns false and sets bio->bi_status on 259 * error. 260 */ 261static bool blk_crypto_fallback_encrypt_bio(struct bio **bio_ptr) 262{ 263 struct bio *src_bio, *enc_bio; 264 struct bio_crypt_ctx *bc; 265 struct blk_crypto_keyslot *slot; 266 int data_unit_size; 267 struct skcipher_request *ciph_req = NULL; 268 DECLARE_CRYPTO_WAIT(wait); 269 u64 curr_dun[BLK_CRYPTO_DUN_ARRAY_SIZE]; 270 struct scatterlist src, dst; 271 union blk_crypto_iv iv; 272 unsigned int i, j; 273 bool ret = false; 274 blk_status_t blk_st; 275 276 /* Split the bio if it's too big for single page bvec */ 277 if (!blk_crypto_fallback_split_bio_if_needed(bio_ptr)) 278 return false; 279 280 src_bio = *bio_ptr; 281 bc = src_bio->bi_crypt_context; 282 data_unit_size = bc->bc_key->crypto_cfg.data_unit_size; 283 284 /* Allocate bounce bio for encryption */ 285 enc_bio = blk_crypto_fallback_clone_bio(src_bio); 286 if (!enc_bio) { 287 src_bio->bi_status = BLK_STS_RESOURCE; 288 return false; 289 } 290 291 /* 292 * Get a blk-crypto-fallback keyslot that contains a crypto_skcipher for 293 * this bio's algorithm and key. 294 */ 295 blk_st = blk_crypto_get_keyslot(&blk_crypto_fallback_profile, 296 bc->bc_key, &slot); 297 if (blk_st != BLK_STS_OK) { 298 src_bio->bi_status = blk_st; 299 goto out_put_enc_bio; 300 } 301 302 /* and then allocate an skcipher_request for it */ 303 if (!blk_crypto_fallback_alloc_cipher_req(slot, &ciph_req, &wait)) { 304 src_bio->bi_status = BLK_STS_RESOURCE; 305 goto out_release_keyslot; 306 } 307 308 memcpy(curr_dun, bc->bc_dun, sizeof(curr_dun)); 309 sg_init_table(&src, 1); 310 sg_init_table(&dst, 1); 311 312 skcipher_request_set_crypt(ciph_req, &src, &dst, data_unit_size, 313 iv.bytes); 314 315 /* Encrypt each page in the bounce bio */ 316 for (i = 0; i < enc_bio->bi_vcnt; i++) { 317 struct bio_vec *enc_bvec = &enc_bio->bi_io_vec[i]; 318 struct page *plaintext_page = enc_bvec->bv_page; 319 struct page *ciphertext_page = 320 mempool_alloc(blk_crypto_bounce_page_pool, GFP_NOIO); 321 322 enc_bvec->bv_page = ciphertext_page; 323 324 if (!ciphertext_page) { 325 src_bio->bi_status = BLK_STS_RESOURCE; 326 goto out_free_bounce_pages; 327 } 328 329 sg_set_page(&src, plaintext_page, data_unit_size, 330 enc_bvec->bv_offset); 331 sg_set_page(&dst, ciphertext_page, data_unit_size, 332 enc_bvec->bv_offset); 333 334 /* Encrypt each data unit in this page */ 335 for (j = 0; j < enc_bvec->bv_len; j += data_unit_size) { 336 blk_crypto_dun_to_iv(curr_dun, &iv); 337 if (crypto_wait_req(crypto_skcipher_encrypt(ciph_req), 338 &wait)) { 339 i++; 340 src_bio->bi_status = BLK_STS_IOERR; 341 goto out_free_bounce_pages; 342 } 343 bio_crypt_dun_increment(curr_dun, 1); 344 src.offset += data_unit_size; 345 dst.offset += data_unit_size; 346 } 347 } 348 349 enc_bio->bi_private = src_bio; 350 enc_bio->bi_end_io = blk_crypto_fallback_encrypt_endio; 351 *bio_ptr = enc_bio; 352 ret = true; 353 354 enc_bio = NULL; 355 goto out_free_ciph_req; 356 357out_free_bounce_pages: 358 while (i > 0) 359 mempool_free(enc_bio->bi_io_vec[--i].bv_page, 360 blk_crypto_bounce_page_pool); 361out_free_ciph_req: 362 skcipher_request_free(ciph_req); 363out_release_keyslot: 364 blk_crypto_put_keyslot(slot); 365out_put_enc_bio: 366 if (enc_bio) 367 bio_uninit(enc_bio); 368 kfree(enc_bio); 369 return ret; 370} 371 372/* 373 * The crypto API fallback's main decryption routine. 374 * Decrypts input bio in place, and calls bio_endio on the bio. 375 */ 376static void blk_crypto_fallback_decrypt_bio(struct work_struct *work) 377{ 378 struct bio_fallback_crypt_ctx *f_ctx = 379 container_of(work, struct bio_fallback_crypt_ctx, work); 380 struct bio *bio = f_ctx->bio; 381 struct bio_crypt_ctx *bc = &f_ctx->crypt_ctx; 382 struct blk_crypto_keyslot *slot; 383 struct skcipher_request *ciph_req = NULL; 384 DECLARE_CRYPTO_WAIT(wait); 385 u64 curr_dun[BLK_CRYPTO_DUN_ARRAY_SIZE]; 386 union blk_crypto_iv iv; 387 struct scatterlist sg; 388 struct bio_vec bv; 389 struct bvec_iter iter; 390 const int data_unit_size = bc->bc_key->crypto_cfg.data_unit_size; 391 unsigned int i; 392 blk_status_t blk_st; 393 394 /* 395 * Get a blk-crypto-fallback keyslot that contains a crypto_skcipher for 396 * this bio's algorithm and key. 397 */ 398 blk_st = blk_crypto_get_keyslot(&blk_crypto_fallback_profile, 399 bc->bc_key, &slot); 400 if (blk_st != BLK_STS_OK) { 401 bio->bi_status = blk_st; 402 goto out_no_keyslot; 403 } 404 405 /* and then allocate an skcipher_request for it */ 406 if (!blk_crypto_fallback_alloc_cipher_req(slot, &ciph_req, &wait)) { 407 bio->bi_status = BLK_STS_RESOURCE; 408 goto out; 409 } 410 411 memcpy(curr_dun, bc->bc_dun, sizeof(curr_dun)); 412 sg_init_table(&sg, 1); 413 skcipher_request_set_crypt(ciph_req, &sg, &sg, data_unit_size, 414 iv.bytes); 415 416 /* Decrypt each segment in the bio */ 417 __bio_for_each_segment(bv, bio, iter, f_ctx->crypt_iter) { 418 struct page *page = bv.bv_page; 419 420 sg_set_page(&sg, page, data_unit_size, bv.bv_offset); 421 422 /* Decrypt each data unit in the segment */ 423 for (i = 0; i < bv.bv_len; i += data_unit_size) { 424 blk_crypto_dun_to_iv(curr_dun, &iv); 425 if (crypto_wait_req(crypto_skcipher_decrypt(ciph_req), 426 &wait)) { 427 bio->bi_status = BLK_STS_IOERR; 428 goto out; 429 } 430 bio_crypt_dun_increment(curr_dun, 1); 431 sg.offset += data_unit_size; 432 } 433 } 434 435out: 436 skcipher_request_free(ciph_req); 437 blk_crypto_put_keyslot(slot); 438out_no_keyslot: 439 mempool_free(f_ctx, bio_fallback_crypt_ctx_pool); 440 bio_endio(bio); 441} 442 443/** 444 * blk_crypto_fallback_decrypt_endio - queue bio for fallback decryption 445 * 446 * @bio: the bio to queue 447 * 448 * Restore bi_private and bi_end_io, and queue the bio for decryption into a 449 * workqueue, since this function will be called from an atomic context. 450 */ 451static void blk_crypto_fallback_decrypt_endio(struct bio *bio) 452{ 453 struct bio_fallback_crypt_ctx *f_ctx = bio->bi_private; 454 455 bio->bi_private = f_ctx->bi_private_orig; 456 bio->bi_end_io = f_ctx->bi_end_io_orig; 457 458 /* If there was an IO error, don't queue for decrypt. */ 459 if (bio->bi_status) { 460 mempool_free(f_ctx, bio_fallback_crypt_ctx_pool); 461 bio_endio(bio); 462 return; 463 } 464 465 INIT_WORK(&f_ctx->work, blk_crypto_fallback_decrypt_bio); 466 f_ctx->bio = bio; 467 queue_work(blk_crypto_wq, &f_ctx->work); 468} 469 470/** 471 * blk_crypto_fallback_bio_prep - Prepare a bio to use fallback en/decryption 472 * 473 * @bio_ptr: pointer to the bio to prepare 474 * 475 * If bio is doing a WRITE operation, this splits the bio into two parts if it's 476 * too big (see blk_crypto_fallback_split_bio_if_needed()). It then allocates a 477 * bounce bio for the first part, encrypts it, and updates bio_ptr to point to 478 * the bounce bio. 479 * 480 * For a READ operation, we mark the bio for decryption by using bi_private and 481 * bi_end_io. 482 * 483 * In either case, this function will make the bio look like a regular bio (i.e. 484 * as if no encryption context was ever specified) for the purposes of the rest 485 * of the stack except for blk-integrity (blk-integrity and blk-crypto are not 486 * currently supported together). 487 * 488 * Return: true on success. Sets bio->bi_status and returns false on error. 489 */ 490bool blk_crypto_fallback_bio_prep(struct bio **bio_ptr) 491{ 492 struct bio *bio = *bio_ptr; 493 struct bio_crypt_ctx *bc = bio->bi_crypt_context; 494 struct bio_fallback_crypt_ctx *f_ctx; 495 496 if (WARN_ON_ONCE(!tfms_inited[bc->bc_key->crypto_cfg.crypto_mode])) { 497 /* User didn't call blk_crypto_start_using_key() first */ 498 bio->bi_status = BLK_STS_IOERR; 499 return false; 500 } 501 502 if (!__blk_crypto_cfg_supported(&blk_crypto_fallback_profile, 503 &bc->bc_key->crypto_cfg)) { 504 bio->bi_status = BLK_STS_NOTSUPP; 505 return false; 506 } 507 508 if (bio_data_dir(bio) == WRITE) 509 return blk_crypto_fallback_encrypt_bio(bio_ptr); 510 511 /* 512 * bio READ case: Set up a f_ctx in the bio's bi_private and set the 513 * bi_end_io appropriately to trigger decryption when the bio is ended. 514 */ 515 f_ctx = mempool_alloc(bio_fallback_crypt_ctx_pool, GFP_NOIO); 516 f_ctx->crypt_ctx = *bc; 517 f_ctx->crypt_iter = bio->bi_iter; 518 f_ctx->bi_private_orig = bio->bi_private; 519 f_ctx->bi_end_io_orig = bio->bi_end_io; 520 bio->bi_private = (void *)f_ctx; 521 bio->bi_end_io = blk_crypto_fallback_decrypt_endio; 522 bio_crypt_free_ctx(bio); 523 524 return true; 525} 526 527int blk_crypto_fallback_evict_key(const struct blk_crypto_key *key) 528{ 529 return __blk_crypto_evict_key(&blk_crypto_fallback_profile, key); 530} 531 532static bool blk_crypto_fallback_inited; 533static int blk_crypto_fallback_init(void) 534{ 535 int i; 536 int err; 537 struct blk_crypto_profile *profile = &blk_crypto_fallback_profile; 538 539 if (blk_crypto_fallback_inited) 540 return 0; 541 542 prandom_bytes(blank_key, BLK_CRYPTO_MAX_KEY_SIZE); 543 544 err = bioset_init(&crypto_bio_split, 64, 0, 0); 545 if (err) 546 goto out; 547 548 err = blk_crypto_profile_init(profile, blk_crypto_num_keyslots); 549 if (err) 550 goto fail_free_bioset; 551 err = -ENOMEM; 552 553 profile->ll_ops = blk_crypto_fallback_ll_ops; 554 profile->max_dun_bytes_supported = BLK_CRYPTO_MAX_IV_SIZE; 555 556 /* All blk-crypto modes have a crypto API fallback. */ 557 for (i = 0; i < BLK_ENCRYPTION_MODE_MAX; i++) 558 profile->modes_supported[i] = 0xFFFFFFFF; 559 profile->modes_supported[BLK_ENCRYPTION_MODE_INVALID] = 0; 560 561 blk_crypto_wq = alloc_workqueue("blk_crypto_wq", 562 WQ_UNBOUND | WQ_HIGHPRI | 563 WQ_MEM_RECLAIM, num_online_cpus()); 564 if (!blk_crypto_wq) 565 goto fail_destroy_profile; 566 567 blk_crypto_keyslots = kcalloc(blk_crypto_num_keyslots, 568 sizeof(blk_crypto_keyslots[0]), 569 GFP_KERNEL); 570 if (!blk_crypto_keyslots) 571 goto fail_free_wq; 572 573 blk_crypto_bounce_page_pool = 574 mempool_create_page_pool(num_prealloc_bounce_pg, 0); 575 if (!blk_crypto_bounce_page_pool) 576 goto fail_free_keyslots; 577 578 bio_fallback_crypt_ctx_cache = KMEM_CACHE(bio_fallback_crypt_ctx, 0); 579 if (!bio_fallback_crypt_ctx_cache) 580 goto fail_free_bounce_page_pool; 581 582 bio_fallback_crypt_ctx_pool = 583 mempool_create_slab_pool(num_prealloc_fallback_crypt_ctxs, 584 bio_fallback_crypt_ctx_cache); 585 if (!bio_fallback_crypt_ctx_pool) 586 goto fail_free_crypt_ctx_cache; 587 588 blk_crypto_fallback_inited = true; 589 590 return 0; 591fail_free_crypt_ctx_cache: 592 kmem_cache_destroy(bio_fallback_crypt_ctx_cache); 593fail_free_bounce_page_pool: 594 mempool_destroy(blk_crypto_bounce_page_pool); 595fail_free_keyslots: 596 kfree(blk_crypto_keyslots); 597fail_free_wq: 598 destroy_workqueue(blk_crypto_wq); 599fail_destroy_profile: 600 blk_crypto_profile_destroy(profile); 601fail_free_bioset: 602 bioset_exit(&crypto_bio_split); 603out: 604 return err; 605} 606 607/* 608 * Prepare blk-crypto-fallback for the specified crypto mode. 609 * Returns -ENOPKG if the needed crypto API support is missing. 610 */ 611int blk_crypto_fallback_start_using_mode(enum blk_crypto_mode_num mode_num) 612{ 613 const char *cipher_str = blk_crypto_modes[mode_num].cipher_str; 614 struct blk_crypto_fallback_keyslot *slotp; 615 unsigned int i; 616 int err = 0; 617 618 /* 619 * Fast path 620 * Ensure that updates to blk_crypto_keyslots[i].tfms[mode_num] 621 * for each i are visible before we try to access them. 622 */ 623 if (likely(smp_load_acquire(&tfms_inited[mode_num]))) 624 return 0; 625 626 mutex_lock(&tfms_init_lock); 627 if (tfms_inited[mode_num]) 628 goto out; 629 630 err = blk_crypto_fallback_init(); 631 if (err) 632 goto out; 633 634 for (i = 0; i < blk_crypto_num_keyslots; i++) { 635 slotp = &blk_crypto_keyslots[i]; 636 slotp->tfms[mode_num] = crypto_alloc_skcipher(cipher_str, 0, 0); 637 if (IS_ERR(slotp->tfms[mode_num])) { 638 err = PTR_ERR(slotp->tfms[mode_num]); 639 if (err == -ENOENT) { 640 pr_warn_once("Missing crypto API support for \"%s\"\n", 641 cipher_str); 642 err = -ENOPKG; 643 } 644 slotp->tfms[mode_num] = NULL; 645 goto out_free_tfms; 646 } 647 648 crypto_skcipher_set_flags(slotp->tfms[mode_num], 649 CRYPTO_TFM_REQ_FORBID_WEAK_KEYS); 650 } 651 652 /* 653 * Ensure that updates to blk_crypto_keyslots[i].tfms[mode_num] 654 * for each i are visible before we set tfms_inited[mode_num]. 655 */ 656 smp_store_release(&tfms_inited[mode_num], true); 657 goto out; 658 659out_free_tfms: 660 for (i = 0; i < blk_crypto_num_keyslots; i++) { 661 slotp = &blk_crypto_keyslots[i]; 662 crypto_free_skcipher(slotp->tfms[mode_num]); 663 slotp->tfms[mode_num] = NULL; 664 } 665out: 666 mutex_unlock(&tfms_init_lock); 667 return err; 668}