summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds2008-07-10 19:10:02 +0200
committerLinus Torvalds2008-07-10 19:10:02 +0200
commit08405b8bd1795145e0f9cb8cb13949281efe9ec2 (patch)
tree3f81b1d535baf29d4b6793c9c46b3c911cddd6c9
parentMerge branch 'for-2.6.26' of git://neil.brown.name/md (diff)
parentcrypto: chainiv - Invoke completion function (diff)
downloadkernel-qcow2-linux-08405b8bd1795145e0f9cb8cb13949281efe9ec2.tar.gz
kernel-qcow2-linux-08405b8bd1795145e0f9cb8cb13949281efe9ec2.tar.xz
kernel-qcow2-linux-08405b8bd1795145e0f9cb8cb13949281efe9ec2.zip
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: crypto: chainiv - Invoke completion function
-rw-r--r--crypto/chainiv.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/crypto/chainiv.c b/crypto/chainiv.c
index 6da3f577e4db..9affadee3287 100644
--- a/crypto/chainiv.c
+++ b/crypto/chainiv.c
@@ -117,6 +117,7 @@ static int chainiv_init(struct crypto_tfm *tfm)
static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
{
int queued;
+ int err = ctx->err;
if (!ctx->queue.qlen) {
smp_mb__before_clear_bit();
@@ -131,7 +132,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
BUG_ON(!queued);
out:
- return ctx->err;
+ return err;
}
static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req)
@@ -227,6 +228,7 @@ static void async_chainiv_do_postponed(struct work_struct *work)
postponed);
struct skcipher_givcrypt_request *req;
struct ablkcipher_request *subreq;
+ int err;
/* Only handle one request at a time to avoid hogging keventd. */
spin_lock_bh(&ctx->lock);
@@ -241,7 +243,11 @@ static void async_chainiv_do_postponed(struct work_struct *work)
subreq = skcipher_givcrypt_reqctx(req);
subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP;
- async_chainiv_givencrypt_tail(req);
+ err = async_chainiv_givencrypt_tail(req);
+
+ local_bh_disable();
+ skcipher_givcrypt_complete(req, err);
+ local_bh_enable();
}
static int async_chainiv_init(struct crypto_tfm *tfm)