On Tue, Mar 28, 2017 at 04:37:52PM -0400, Josef Bacik wrote:
> When try to issue a request directly and we fail we will requeue the
> request, but call blk_mq_end_request() as well.  This leads to the
> completed request being on a queuelist and getting ended twice, which
> causes list corruption in schedulers and other shenanigans.
> 
> Signed-off-by: Josef Bacik <[email protected]>
> ---
>  block/blk-mq.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 08a49c6..c5a6985 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -1457,8 +1457,6 @@ static void blk_mq_try_issue_directly(struct request 
> *rq, blk_qc_t *cookie,
>               return;
>       }
>  
> -     __blk_mq_requeue_request(rq);
> -
>       if (ret == BLK_MQ_RQ_QUEUE_ERROR) {
>               *cookie = BLK_QC_T_NONE;
>               rq->errors = -EIO;
> @@ -1466,6 +1464,7 @@ static void blk_mq_try_issue_directly(struct request 
> *rq, blk_qc_t *cookie,
>               return;
>       }
>  
> +     __blk_mq_requeue_request(rq);
>  insert:
>       blk_mq_sched_insert_request(rq, false, true, false, may_sleep);
>  }

Reviewed-by: Ming Lei <[email protected]>

-- 
Ming

Reply via email to