diff options
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/algapi.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/crypto/algapi.c b/crypto/algapi.c index 1462c68492ea..2d0a1c64ce39 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c | |||
@@ -523,7 +523,10 @@ int crypto_register_instance(struct crypto_template *tmpl, | |||
523 | 523 | ||
524 | err = crypto_check_alg(&inst->alg); | 524 | err = crypto_check_alg(&inst->alg); |
525 | if (err) | 525 | if (err) |
526 | goto err; | 526 | return err; |
527 | |||
528 | if (unlikely(!crypto_mod_get(&inst->alg))) | ||
529 | return -EAGAIN; | ||
527 | 530 | ||
528 | inst->alg.cra_module = tmpl->module; | 531 | inst->alg.cra_module = tmpl->module; |
529 | inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE; | 532 | inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE; |
@@ -545,9 +548,14 @@ unlock: | |||
545 | goto err; | 548 | goto err; |
546 | 549 | ||
547 | crypto_wait_for_test(larval); | 550 | crypto_wait_for_test(larval); |
551 | |||
552 | /* Remove instance if test failed */ | ||
553 | if (!(inst->alg.cra_flags & CRYPTO_ALG_TESTED)) | ||
554 | crypto_unregister_instance(inst); | ||
548 | err = 0; | 555 | err = 0; |
549 | 556 | ||
550 | err: | 557 | err: |
558 | crypto_mod_put(&inst->alg); | ||
551 | return err; | 559 | return err; |
552 | } | 560 | } |
553 | EXPORT_SYMBOL_GPL(crypto_register_instance); | 561 | EXPORT_SYMBOL_GPL(crypto_register_instance); |