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,
|
static int omap_sham_handle_queue(struct omap_sham_dev *dd,
|
||||||
struct ahash_request *req)
|
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 omap_sham_reqctx *ctx;
|
||||||
struct ahash_request *prev_req;
|
struct ahash_request *prev_req;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -677,11 +677,10 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
|
||||||
spin_unlock_irqrestore(&dd->lock, flags);
|
spin_unlock_irqrestore(&dd->lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
async_req = crypto_dequeue_request(&dd->queue);
|
|
||||||
if (async_req) {
|
|
||||||
dd->flags |= FLAGS_BUSY;
|
|
||||||
backlog = crypto_get_backlog(&dd->queue);
|
backlog = crypto_get_backlog(&dd->queue);
|
||||||
}
|
async_req = crypto_dequeue_request(&dd->queue);
|
||||||
|
if (async_req)
|
||||||
|
dd->flags |= FLAGS_BUSY;
|
||||||
spin_unlock_irqrestore(&dd->lock, flags);
|
spin_unlock_irqrestore(&dd->lock, flags);
|
||||||
|
|
||||||
if (!async_req)
|
if (!async_req)
|
||||||
|
|
Loading…
Reference in New Issue