fs: ecryptfs: Use crypto_wait_req
This patch replaces the custom crypto completion function with crypto_req_done. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Родитель
30859e97e0
Коммит
20066bf700
|
@ -260,22 +260,6 @@ int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg,
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct extent_crypt_result {
|
|
||||||
struct completion completion;
|
|
||||||
int rc;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void extent_crypt_complete(struct crypto_async_request *req, int rc)
|
|
||||||
{
|
|
||||||
struct extent_crypt_result *ecr = req->data;
|
|
||||||
|
|
||||||
if (rc == -EINPROGRESS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ecr->rc = rc;
|
|
||||||
complete(&ecr->completion);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* crypt_scatterlist
|
* crypt_scatterlist
|
||||||
* @crypt_stat: Pointer to the crypt_stat struct to initialize.
|
* @crypt_stat: Pointer to the crypt_stat struct to initialize.
|
||||||
|
@ -293,7 +277,7 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
|
||||||
unsigned char *iv, int op)
|
unsigned char *iv, int op)
|
||||||
{
|
{
|
||||||
struct skcipher_request *req = NULL;
|
struct skcipher_request *req = NULL;
|
||||||
struct extent_crypt_result ecr;
|
DECLARE_CRYPTO_WAIT(ecr);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (unlikely(ecryptfs_verbosity > 0)) {
|
if (unlikely(ecryptfs_verbosity > 0)) {
|
||||||
|
@ -303,8 +287,6 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
|
||||||
crypt_stat->key_size);
|
crypt_stat->key_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_completion(&ecr.completion);
|
|
||||||
|
|
||||||
mutex_lock(&crypt_stat->cs_tfm_mutex);
|
mutex_lock(&crypt_stat->cs_tfm_mutex);
|
||||||
req = skcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
|
req = skcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
|
||||||
if (!req) {
|
if (!req) {
|
||||||
|
@ -315,7 +297,7 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
|
||||||
|
|
||||||
skcipher_request_set_callback(req,
|
skcipher_request_set_callback(req,
|
||||||
CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
|
CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
|
||||||
extent_crypt_complete, &ecr);
|
crypto_req_done, &ecr);
|
||||||
/* Consider doing this once, when the file is opened */
|
/* Consider doing this once, when the file is opened */
|
||||||
if (!(crypt_stat->flags & ECRYPTFS_KEY_SET)) {
|
if (!(crypt_stat->flags & ECRYPTFS_KEY_SET)) {
|
||||||
rc = crypto_skcipher_setkey(crypt_stat->tfm, crypt_stat->key,
|
rc = crypto_skcipher_setkey(crypt_stat->tfm, crypt_stat->key,
|
||||||
|
@ -334,13 +316,7 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
|
||||||
skcipher_request_set_crypt(req, src_sg, dst_sg, size, iv);
|
skcipher_request_set_crypt(req, src_sg, dst_sg, size, iv);
|
||||||
rc = op == ENCRYPT ? crypto_skcipher_encrypt(req) :
|
rc = op == ENCRYPT ? crypto_skcipher_encrypt(req) :
|
||||||
crypto_skcipher_decrypt(req);
|
crypto_skcipher_decrypt(req);
|
||||||
if (rc == -EINPROGRESS || rc == -EBUSY) {
|
rc = crypto_wait_req(rc, &ecr);
|
||||||
struct extent_crypt_result *ecr = req->base.data;
|
|
||||||
|
|
||||||
wait_for_completion(&ecr->completion);
|
|
||||||
rc = ecr->rc;
|
|
||||||
reinit_completion(&ecr->completion);
|
|
||||||
}
|
|
||||||
out:
|
out:
|
||||||
skcipher_request_free(req);
|
skcipher_request_free(req);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче