]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: talitos - move to generic async completion
authorGilad Ben-Yossef <gilad@benyossef.com>
Wed, 18 Oct 2017 07:00:49 +0000 (08:00 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 3 Nov 2017 14:11:22 +0000 (22:11 +0800)
The talitos driver starts several async crypto ops and  waits for their
completions. Move it over to generic code doing the same.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Tested-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/talitos.c

index 5bd8191405d88bbb8a385348d2fbfa5806d5313e..9c80e0cb16647035fbfeea22ea1b3c9e6bf0a1b1 100644 (file)
@@ -2160,22 +2160,6 @@ static int ahash_import(struct ahash_request *areq, const void *in)
        return 0;
 }
 
-struct keyhash_result {
-       struct completion completion;
-       int err;
-};
-
-static void keyhash_complete(struct crypto_async_request *req, int err)
-{
-       struct keyhash_result *res = req->data;
-
-       if (err == -EINPROGRESS)
-               return;
-
-       res->err = err;
-       complete(&res->completion);
-}
-
 static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
                   u8 *hash)
 {
@@ -2183,10 +2167,10 @@ static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
 
        struct scatterlist sg[1];
        struct ahash_request *req;
-       struct keyhash_result hresult;
+       struct crypto_wait wait;
        int ret;
 
-       init_completion(&hresult.completion);
+       crypto_init_wait(&wait);
 
        req = ahash_request_alloc(tfm, GFP_KERNEL);
        if (!req)
@@ -2195,25 +2179,13 @@ static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
        /* Keep tfm keylen == 0 during hash of the long key */
        ctx->keylen = 0;
        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
-                                  keyhash_complete, &hresult);
+                                  crypto_req_done, &wait);
 
        sg_init_one(&sg[0], key, keylen);
 
        ahash_request_set_crypt(req, sg, hash, keylen);
-       ret = crypto_ahash_digest(req);
-       switch (ret) {
-       case 0:
-               break;
-       case -EINPROGRESS:
-       case -EBUSY:
-               ret = wait_for_completion_interruptible(
-                       &hresult.completion);
-               if (!ret)
-                       ret = hresult.err;
-               break;
-       default:
-               break;
-       }
+       ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
+
        ahash_request_free(req);
 
        return ret;