aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2006-05-23 23:02:26 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2006-06-26 03:34:40 -0400
commitc7fc05992afcf1d63d6d5fb6142c8d39094dbca9 (patch)
tree201d72844c0b27269e34bf3172d579b9e556e10c /crypto
parent110bf1c0e932615cbe43a8af8a07bc3750ae4295 (diff)
[CRYPTO] api: Added cra_init/cra_exit
This patch adds the hooks cra_init/cra_exit which are called during a tfm's construction and destruction respectively. This will be used by the instances to allocate child tfm's. For now this lets us get rid of the coa_init/coa_exit functions which are used for exactly that purpose (unlike the dia_init function which is called for each transaction). In fact the coa_exit path is currently buggy as it may get called twice when an error is encountered during initialisation. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/api.c11
-rw-r--r--crypto/compress.c9
-rw-r--r--crypto/deflate.c4
3 files changed, 11 insertions, 13 deletions
diff --git a/crypto/api.c b/crypto/api.c
index 80bba637fba7..8145310d7985 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -188,13 +188,16 @@ struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags)
188 if (crypto_init_flags(tfm, flags)) 188 if (crypto_init_flags(tfm, flags))
189 goto out_free_tfm; 189 goto out_free_tfm;
190 190
191 if (crypto_init_ops(tfm)) { 191 if (crypto_init_ops(tfm))
192 crypto_exit_ops(tfm);
193 goto out_free_tfm; 192 goto out_free_tfm;
194 } 193
194 if (alg->cra_init && alg->cra_init(tfm))
195 goto cra_init_failed;
195 196
196 goto out; 197 goto out;
197 198
199cra_init_failed:
200 crypto_exit_ops(tfm);
198out_free_tfm: 201out_free_tfm:
199 kfree(tfm); 202 kfree(tfm);
200 tfm = NULL; 203 tfm = NULL;
@@ -215,6 +218,8 @@ void crypto_free_tfm(struct crypto_tfm *tfm)
215 alg = tfm->__crt_alg; 218 alg = tfm->__crt_alg;
216 size = sizeof(*tfm) + alg->cra_ctxsize; 219 size = sizeof(*tfm) + alg->cra_ctxsize;
217 220
221 if (alg->cra_exit)
222 alg->cra_exit(tfm);
218 crypto_exit_ops(tfm); 223 crypto_exit_ops(tfm);
219 crypto_alg_put(alg); 224 crypto_alg_put(alg);
220 memset(tfm, 0, size); 225 memset(tfm, 0, size);
diff --git a/crypto/compress.c b/crypto/compress.c
index f3e07334afd0..eca182aa3380 100644
--- a/crypto/compress.c
+++ b/crypto/compress.c
@@ -41,21 +41,14 @@ int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags)
41 41
42int crypto_init_compress_ops(struct crypto_tfm *tfm) 42int crypto_init_compress_ops(struct crypto_tfm *tfm)
43{ 43{
44 int ret = 0;
45 struct compress_tfm *ops = &tfm->crt_compress; 44 struct compress_tfm *ops = &tfm->crt_compress;
46
47 ret = tfm->__crt_alg->cra_compress.coa_init(tfm);
48 if (ret)
49 goto out;
50 45
51 ops->cot_compress = crypto_compress; 46 ops->cot_compress = crypto_compress;
52 ops->cot_decompress = crypto_decompress; 47 ops->cot_decompress = crypto_decompress;
53 48
54out: 49 return 0;
55 return ret;
56} 50}
57 51
58void crypto_exit_compress_ops(struct crypto_tfm *tfm) 52void crypto_exit_compress_ops(struct crypto_tfm *tfm)
59{ 53{
60 tfm->__crt_alg->cra_compress.coa_exit(tfm);
61} 54}
diff --git a/crypto/deflate.c b/crypto/deflate.c
index 5dd2404ae5b2..6588bbf82e9b 100644
--- a/crypto/deflate.c
+++ b/crypto/deflate.c
@@ -201,9 +201,9 @@ static struct crypto_alg alg = {
201 .cra_ctxsize = sizeof(struct deflate_ctx), 201 .cra_ctxsize = sizeof(struct deflate_ctx),
202 .cra_module = THIS_MODULE, 202 .cra_module = THIS_MODULE,
203 .cra_list = LIST_HEAD_INIT(alg.cra_list), 203 .cra_list = LIST_HEAD_INIT(alg.cra_list),
204 .cra_init = deflate_init,
205 .cra_exit = deflate_exit,
204 .cra_u = { .compress = { 206 .cra_u = { .compress = {
205 .coa_init = deflate_init,
206 .coa_exit = deflate_exit,
207 .coa_compress = deflate_compress, 207 .coa_compress = deflate_compress,
208 .coa_decompress = deflate_decompress } } 208 .coa_decompress = deflate_decompress } }
209}; 209};