config CRYPTO_GENIV
        tristate
        select CRYPTO_AEAD
-       select CRYPTO_NULL
        select CRYPTO_MANAGER
        select CRYPTO_RNG_DEFAULT
 
 
        u64 seqno;
        u8 *info;
        unsigned int ivsize = crypto_aead_ivsize(geniv);
-       int err;
 
        if (req->cryptlen < ivsize)
                return -EINVAL;
 
        info = req->iv;
 
-       if (req->src != req->dst) {
-               SYNC_SKCIPHER_REQUEST_ON_STACK(nreq, ctx->sknull);
-
-               skcipher_request_set_sync_tfm(nreq, ctx->sknull);
-               skcipher_request_set_callback(nreq, req->base.flags,
-                                             NULL, NULL);
-               skcipher_request_set_crypt(nreq, req->src, req->dst,
-                                          req->assoclen + req->cryptlen,
-                                          NULL);
-
-               err = crypto_skcipher_encrypt(nreq);
-               if (err)
-                       return err;
-       }
+       if (req->src != req->dst)
+               memcpy_sglist(req->dst, req->src,
+                             req->assoclen + req->cryptlen);
 
        aead_request_set_callback(subreq, req->base.flags,
                                  req->base.complete, req->base.data);
 
 
 #include <crypto/internal/geniv.h>
 #include <crypto/internal/rng.h>
-#include <crypto/null.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
        if (err)
                goto out;
 
-       ctx->sknull = crypto_get_default_null_skcipher();
-       err = PTR_ERR(ctx->sknull);
-       if (IS_ERR(ctx->sknull))
-               goto out;
-
        child = crypto_spawn_aead(aead_instance_ctx(inst));
        err = PTR_ERR(child);
        if (IS_ERR(child))
-               goto drop_null;
+               goto out;
 
        ctx->child = child;
        crypto_aead_set_reqsize(aead, crypto_aead_reqsize(child) +
 
 out:
        return err;
-
-drop_null:
-       crypto_put_default_null_skcipher();
-       goto out;
 }
 EXPORT_SYMBOL_GPL(aead_init_geniv);
 
        struct aead_geniv_ctx *ctx = crypto_aead_ctx(tfm);
 
        crypto_free_aead(ctx->child);
-       crypto_put_default_null_skcipher();
 }
 EXPORT_SYMBOL_GPL(aead_exit_geniv);
 
 
        data = req->base.data;
        info = req->iv;
 
-       if (req->src != req->dst) {
-               SYNC_SKCIPHER_REQUEST_ON_STACK(nreq, ctx->sknull);
-
-               skcipher_request_set_sync_tfm(nreq, ctx->sknull);
-               skcipher_request_set_callback(nreq, req->base.flags,
-                                             NULL, NULL);
-               skcipher_request_set_crypt(nreq, req->src, req->dst,
-                                          req->assoclen + req->cryptlen,
-                                          NULL);
-
-               err = crypto_skcipher_encrypt(nreq);
-               if (err)
-                       return err;
-       }
+       if (req->src != req->dst)
+               memcpy_sglist(req->dst, req->src,
+                             req->assoclen + req->cryptlen);
 
        if (unlikely(!IS_ALIGNED((unsigned long)info,
                                 crypto_aead_alignmask(geniv) + 1))) {
 
 struct aead_geniv_ctx {
        spinlock_t lock;
        struct crypto_aead *child;
-       struct crypto_sync_skcipher *sknull;
        u8 salt[] __attribute__ ((aligned(__alignof__(u32))));
 };