diff options
Diffstat (limited to 'crypto/algapi.c')
| -rw-r--r-- | crypto/algapi.c | 32 | 
1 files changed, 25 insertions, 7 deletions
| diff --git a/crypto/algapi.c b/crypto/algapi.c index 69605e21af92..92abdf675992 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -403,7 +403,7 @@ static void crypto_wait_for_test(struct crypto_larval *larval)  	err = wait_for_completion_killable(&larval->completion);  	WARN_ON(err);  	if (!err) -		crypto_probing_notify(CRYPTO_MSG_ALG_LOADED, larval); +		crypto_notify(CRYPTO_MSG_ALG_LOADED, larval);  out:  	crypto_larval_kill(&larval->alg); @@ -716,17 +716,27 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn);  static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn)  { -	struct crypto_alg *alg; +	struct crypto_alg *alg = ERR_PTR(-EAGAIN); +	struct crypto_alg *target; +	bool shoot = false;  	down_read(&crypto_alg_sem); -	alg = spawn->alg; -	if (!spawn->dead && !crypto_mod_get(alg)) { -		alg->cra_flags |= CRYPTO_ALG_DYING; -		alg = NULL; +	if (!spawn->dead) { +		alg = spawn->alg; +		if (!crypto_mod_get(alg)) { +			target = crypto_alg_get(alg); +			shoot = true; +			alg = ERR_PTR(-EAGAIN); +		}  	}  	up_read(&crypto_alg_sem); -	return alg ?: ERR_PTR(-EAGAIN); +	if (shoot) { +		crypto_shoot_alg(target); +		crypto_alg_put(target); +	} + +	return alg;  }  struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, @@ -904,6 +914,14 @@ out:  }  EXPORT_SYMBOL_GPL(crypto_enqueue_request); +void crypto_enqueue_request_head(struct crypto_queue *queue, +				 struct crypto_async_request *request) +{ +	queue->qlen++; +	list_add(&request->list, &queue->list); +} +EXPORT_SYMBOL_GPL(crypto_enqueue_request_head); +  struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue)  {  	struct list_head *request; |