inst->alg.base.cra_ctxsize = sizeof(struct aead_geniv_ctx);
        inst->alg.base.cra_ctxsize += inst->alg.ivsize;
 
-       inst->free = aead_geniv_free;
-
        err = aead_register_instance(tmpl, inst);
-       if (err)
-               goto free_inst;
-
-out:
-       return err;
-
+       if (err) {
 free_inst:
-       aead_geniv_free(inst);
-       goto out;
-}
-
-static void echainiv_free(struct crypto_instance *inst)
-{
-       aead_geniv_free(aead_instance(inst));
+               inst->free(inst);
+       }
+       return err;
 }
 
 static struct crypto_template echainiv_tmpl = {
        .name = "echainiv",
        .create = echainiv_aead_create,
-       .free = echainiv_free,
        .module = THIS_MODULE,
 };
 
 
        return crypto_aead_setauthsize(ctx->child, authsize);
 }
 
+static void aead_geniv_free(struct aead_instance *inst)
+{
+       crypto_drop_aead(aead_instance_ctx(inst));
+       kfree(inst);
+}
+
 struct aead_instance *aead_geniv_alloc(struct crypto_template *tmpl,
                                       struct rtattr **tb, u32 type, u32 mask)
 {
        inst->alg.ivsize = ivsize;
        inst->alg.maxauthsize = maxauthsize;
 
+       inst->free = aead_geniv_free;
+
 out:
        return inst;
 
 }
 EXPORT_SYMBOL_GPL(aead_geniv_alloc);
 
-void aead_geniv_free(struct aead_instance *inst)
-{
-       crypto_drop_aead(aead_instance_ctx(inst));
-       kfree(inst);
-}
-EXPORT_SYMBOL_GPL(aead_geniv_free);
-
 int aead_init_geniv(struct crypto_aead *aead)
 {
        struct aead_geniv_ctx *ctx = crypto_aead_ctx(aead);
 
 #include <linux/slab.h>
 #include <linux/string.h>
 
-static void seqiv_free(struct crypto_instance *inst);
-
 static void seqiv_aead_encrypt_complete2(struct aead_request *req, int err)
 {
        struct aead_request *subreq = aead_request_ctx(req);
        inst->alg.base.cra_ctxsize += inst->alg.ivsize;
 
        err = aead_register_instance(tmpl, inst);
-       if (err)
-               goto free_inst;
-
-out:
-       return err;
-
+       if (err) {
 free_inst:
-       aead_geniv_free(inst);
-       goto out;
+               inst->free(inst);
+       }
+       return err;
 }
 
 static int seqiv_create(struct crypto_template *tmpl, struct rtattr **tb)
        return seqiv_aead_create(tmpl, tb);
 }
 
-static void seqiv_free(struct crypto_instance *inst)
-{
-       aead_geniv_free(aead_instance(inst));
-}
-
 static struct crypto_template seqiv_tmpl = {
        .name = "seqiv",
        .create = seqiv_create,
-       .free = seqiv_free,
        .module = THIS_MODULE,
 };
 
 
 
 struct aead_instance *aead_geniv_alloc(struct crypto_template *tmpl,
                                       struct rtattr **tb, u32 type, u32 mask);
-void aead_geniv_free(struct aead_instance *inst);
 int aead_init_geniv(struct crypto_aead *tfm);
 void aead_exit_geniv(struct crypto_aead *tfm);