diff options
Diffstat (limited to 'crypto/rng.c')
-rw-r--r-- | crypto/rng.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/crypto/rng.c b/crypto/rng.c index 13155058b193..b81cffb13bab 100644 --- a/crypto/rng.c +++ b/crypto/rng.c @@ -155,14 +155,33 @@ EXPORT_SYMBOL_GPL(crypto_get_default_rng); void crypto_put_default_rng(void) { mutex_lock(&crypto_default_rng_lock); - if (!--crypto_default_rng_refcnt) { - crypto_free_rng(crypto_default_rng); - crypto_default_rng = NULL; - } + crypto_default_rng_refcnt--; mutex_unlock(&crypto_default_rng_lock); } EXPORT_SYMBOL_GPL(crypto_put_default_rng); +#if defined(CONFIG_CRYPTO_RNG) || defined(CONFIG_CRYPTO_RNG_MODULE) +int crypto_del_default_rng(void) +{ + int err = -EBUSY; + + mutex_lock(&crypto_default_rng_lock); + if (crypto_default_rng_refcnt) + goto out; + + crypto_free_rng(crypto_default_rng); + crypto_default_rng = NULL; + + err = 0; + +out: + mutex_unlock(&crypto_default_rng_lock); + + return err; +} +EXPORT_SYMBOL_GPL(crypto_del_default_rng); +#endif + int crypto_register_rng(struct rng_alg *alg) { struct crypto_alg *base = &alg->base; |