Skip to contentSkip to conversation

crypto: omap-sham backlog handling fix

PATCH In review Dmitry Kasatkin 2 participants 3 messages Dec 29, 2010 Crypto API

lore
Share & tools
lore
#0 lore raw

cover crypto: omap-sham backlog handling fix

Hi,

Please take this important fix.

- Dmitry

Dmitry Kasatkin (1):
omap-sham: backlog handling fix

 drivers/crypto/omap-sham.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
#1 lore raw

PATCH 1/1 omap-sham: backlog handling fix

Previous commit "removed redundant locking" introduced
a bug in handling backlog.
In certain cases, when async request complete callback will call complete() on -EINPROGRESS code, it will cause uncompleted requests. It does not happen in implementation similar to crypto test manager, but it will happen in implementation similar to dm-crypt. Backlog needs to be checked before dequeuing next request.

---
 drivers/crypto/omap-sham.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/crypto/omap-sham.c +3 -4
index eb988e7..2e71123 100644
@@ -664,7 +664,7 @@ static void omap_sham_finish_req(struct ahash_request *req, int err)
 static int omap_sham_handle_queue(struct omap_sham_dev *dd,
 				  struct ahash_request *req)
 {
-	struct crypto_async_request *async_req, *backlog = 0;
+	struct crypto_async_request *async_req, *backlog;
 	struct omap_sham_reqctx *ctx;
 	struct ahash_request *prev_req;
 	unsigned long flags;
@@ -677,11 +677,10 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
 		spin_unlock_irqrestore(&dd->lock, flags);
 		return ret;
 	}
+	backlog = crypto_get_backlog(&dd->queue);
 	async_req = crypto_dequeue_request(&dd->queue);
-	if (async_req) {
+	if (async_req)
 		dd->flags |= FLAGS_BUSY;
-		backlog = crypto_get_backlog(&dd->queue);
-	}
 	spin_unlock_irqrestore(&dd->lock, flags);
 
 	if (!async_req)
Signature · 1 line
1.7.0.4
maintainer
#2 lore raw

Re: [PATCH 1/1] omap-sham: backlog handling fix

Quoted 9 lines · Dmitry Kasatkin

Previous commit "removed redundant locking" introduced
a bug in handling backlog.
In certain cases, when async request complete callback will call complete() on -EINPROGRESS code, it will cause uncompleted requests. It does not happen in implementation similar to crypto test manager, but it will happen in implementation similar to dm-crypt. Backlog needs to be checked before dequeuing next request.

Patch applied. Thanks Dmitry.

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt