Message ID | 1490733472-3088-1-git-send-email-jbacik@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 <jbacik@fb.com> > --- > 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 <tom.leiming@gmail.com>
Looks good,
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
On 03/28/2017 02:37 PM, 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. I think this is purely a cosmetic issue, as it should cause no corruption. But it doesn't make sense to issue a requeue trace, for instance, if we're just going to end the IO anyway. I have applied it for 4.12.
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); }
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 <jbacik@fb.com> --- block/blk-mq.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)