|
@@ -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;
|