diff options
Diffstat (limited to 'crypto/algboss.c')
-rw-r--r-- | crypto/algboss.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/crypto/algboss.c b/crypto/algboss.c index 791d194958fa..769219b29309 100644 --- a/crypto/algboss.c +++ b/crypto/algboss.c | |||
@@ -11,6 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <crypto/internal/aead.h> | 13 | #include <crypto/internal/aead.h> |
14 | #include <linux/completion.h> | ||
14 | #include <linux/ctype.h> | 15 | #include <linux/ctype.h> |
15 | #include <linux/err.h> | 16 | #include <linux/err.h> |
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
@@ -47,6 +48,8 @@ struct cryptomgr_param { | |||
47 | char larval[CRYPTO_MAX_ALG_NAME]; | 48 | char larval[CRYPTO_MAX_ALG_NAME]; |
48 | char template[CRYPTO_MAX_ALG_NAME]; | 49 | char template[CRYPTO_MAX_ALG_NAME]; |
49 | 50 | ||
51 | struct completion *completion; | ||
52 | |||
50 | u32 otype; | 53 | u32 otype; |
51 | u32 omask; | 54 | u32 omask; |
52 | }; | 55 | }; |
@@ -66,7 +69,7 @@ static int cryptomgr_probe(void *data) | |||
66 | 69 | ||
67 | tmpl = crypto_lookup_template(param->template); | 70 | tmpl = crypto_lookup_template(param->template); |
68 | if (!tmpl) | 71 | if (!tmpl) |
69 | goto err; | 72 | goto out; |
70 | 73 | ||
71 | do { | 74 | do { |
72 | if (tmpl->create) { | 75 | if (tmpl->create) { |
@@ -83,16 +86,10 @@ static int cryptomgr_probe(void *data) | |||
83 | 86 | ||
84 | crypto_tmpl_put(tmpl); | 87 | crypto_tmpl_put(tmpl); |
85 | 88 | ||
86 | if (err) | ||
87 | goto err; | ||
88 | |||
89 | out: | 89 | out: |
90 | complete_all(param->completion); | ||
90 | kfree(param); | 91 | kfree(param); |
91 | module_put_and_exit(0); | 92 | module_put_and_exit(0); |
92 | |||
93 | err: | ||
94 | crypto_larval_error(param->larval, param->otype, param->omask); | ||
95 | goto out; | ||
96 | } | 93 | } |
97 | 94 | ||
98 | static int cryptomgr_schedule_probe(struct crypto_larval *larval) | 95 | static int cryptomgr_schedule_probe(struct crypto_larval *larval) |
@@ -192,10 +189,14 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval) | |||
192 | 189 | ||
193 | memcpy(param->larval, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME); | 190 | memcpy(param->larval, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME); |
194 | 191 | ||
192 | param->completion = &larval->completion; | ||
193 | |||
195 | thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe"); | 194 | thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe"); |
196 | if (IS_ERR(thread)) | 195 | if (IS_ERR(thread)) |
197 | goto err_free_param; | 196 | goto err_free_param; |
198 | 197 | ||
198 | wait_for_completion_interruptible(&larval->completion); | ||
199 | |||
199 | return NOTIFY_STOP; | 200 | return NOTIFY_STOP; |
200 | 201 | ||
201 | err_free_param: | 202 | err_free_param: |