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: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
@@ -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) {
|
list_for_each_safe(tmp, n, &q->tag_busy_list)
|
||||||
rq = list_entry_rq(tmp);
|
blk_requeue_request(q, list_entry_rq(tmp));
|
||||||
|
|
||||||
if (rq->tag == -1) {
|
|
||||||
printk(KERN_ERR
|
|
||||||
"%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);
|
||||||
|
Reference in New Issue
Block a user