Commit 319382a6 authored by Herbert Xu's avatar Herbert Xu

crypto: api - Add instance free function to crypto_type

Currently the task of freeing an instance is given to the crypto
template.  However, it has no type information on the instance so
we have to resort to checking type information at runtime.

This patch introduces a free function to crypto_type that will be
used to free an instance.  This can then be used to free an instance
in a type-safe manner.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 23ad69aa
...@@ -67,12 +67,22 @@ static int crypto_check_alg(struct crypto_alg *alg) ...@@ -67,12 +67,22 @@ static int crypto_check_alg(struct crypto_alg *alg)
return crypto_set_driver_name(alg); return crypto_set_driver_name(alg);
} }
static void crypto_free_instance(struct crypto_instance *inst)
{
if (!inst->alg.cra_type->free) {
inst->tmpl->free(inst);
return;
}
inst->alg.cra_type->free(inst);
}
static void crypto_destroy_instance(struct crypto_alg *alg) static void crypto_destroy_instance(struct crypto_alg *alg)
{ {
struct crypto_instance *inst = (void *)alg; struct crypto_instance *inst = (void *)alg;
struct crypto_template *tmpl = inst->tmpl; struct crypto_template *tmpl = inst->tmpl;
tmpl->free(inst); crypto_free_instance(inst);
crypto_tmpl_put(tmpl); crypto_tmpl_put(tmpl);
} }
...@@ -481,7 +491,7 @@ void crypto_unregister_template(struct crypto_template *tmpl) ...@@ -481,7 +491,7 @@ void crypto_unregister_template(struct crypto_template *tmpl)
hlist_for_each_entry_safe(inst, n, list, list) { hlist_for_each_entry_safe(inst, n, list, list) {
BUG_ON(atomic_read(&inst->alg.cra_refcnt) != 1); BUG_ON(atomic_read(&inst->alg.cra_refcnt) != 1);
tmpl->free(inst); crypto_free_instance(inst);
} }
crypto_remove_final(&users); crypto_remove_final(&users);
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
struct crypto_aead; struct crypto_aead;
struct crypto_instance;
struct module; struct module;
struct rtattr; struct rtattr;
struct seq_file; struct seq_file;
...@@ -30,6 +31,7 @@ struct crypto_type { ...@@ -30,6 +31,7 @@ struct crypto_type {
void (*show)(struct seq_file *m, struct crypto_alg *alg); void (*show)(struct seq_file *m, struct crypto_alg *alg);
int (*report)(struct sk_buff *skb, struct crypto_alg *alg); int (*report)(struct sk_buff *skb, struct crypto_alg *alg);
struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask); struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask);
void (*free)(struct crypto_instance *inst);
unsigned int type; unsigned int type;
unsigned int maskclear; unsigned int maskclear;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment