Commit d85532ed authored by Jens Axboe's avatar Jens Axboe

block: fix requeue handling in blk_queue_invalidate_tags()

Credit goes to juergen.kadidlo@exasol.com for diagnosing this issue
and supplying the initial patch.

blk_queue_invalidate_tags() must use the proper requeueing paths instead
of open coding the re-add of the request, otherwise we bug out in rq
accounting. Just switch to using blk_requeue_request(), that takes care
of end-tag handling as well and also adds the blktrace REQUEUE notify
event that is also appropriate here.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 85780070
...@@ -1143,22 +1143,9 @@ EXPORT_SYMBOL(blk_queue_start_tag); ...@@ -1143,22 +1143,9 @@ EXPORT_SYMBOL(blk_queue_start_tag);
void blk_queue_invalidate_tags(struct request_queue *q) void blk_queue_invalidate_tags(struct request_queue *q)
{ {
struct list_head *tmp, *n; struct list_head *tmp, *n;
struct request *rq;
list_for_each_safe(tmp, n, &q->tag_busy_list) {
rq = list_entry_rq(tmp);
if (rq->tag == -1) { list_for_each_safe(tmp, n, &q->tag_busy_list)
printk(KERN_ERR blk_requeue_request(q, list_entry_rq(tmp));
"%s: bad tag found on list\n", __FUNCTION__);
list_del_init(&rq->queuelist);
rq->cmd_flags &= ~REQ_QUEUED;
} else
blk_queue_end_tag(q, rq);
rq->cmd_flags &= ~REQ_STARTED;
__elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 0);
}
} }
EXPORT_SYMBOL(blk_queue_invalidate_tags); EXPORT_SYMBOL(blk_queue_invalidate_tags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment