crypto: 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. Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@nokia.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
8ad225e8e4
commit
6c39d116ba
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue