summaryrefslogtreecommitdiffstats
path: root/block/blk-mq.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2017-01-19 07:58:59 -0700
committerJens Axboe <axboe@fb.com>2017-01-19 08:01:55 -0700
commit7e79dadce222e06e0c30a77280f3426014bee185 (patch)
tree5bc0b38c2eec503758700cc29d85cfdac8866405 /block/blk-mq.c
parent8cecb07d70e761eb0112f921d939b9ab2ea2171f (diff)
downloadlinux-7e79dadce222e06e0c30a77280f3426014bee185.tar.bz2
blk-mq: stop hardware queue in blk_mq_delay_queue()
The run handler we register for the delayed work requires that the queue be stopped, yet we leave that up to the caller. Let's move it into blk_mq_delay_queue() itself, so that the API is sane. This fixes a stall with SCSI, where it calls blk_mq_delay_queue() without having stopped the queue. Hence the queue is never run. Reported-by: Hannes Reinecke <hare@suse.com> Fixes: 70f4db639c5b ("blk-mq: add blk_mq_delay_queue") Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r--block/blk-mq.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index fa1f8619bfe7..b365cde4c909 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1170,6 +1170,7 @@ void blk_mq_delay_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs)
if (unlikely(!blk_mq_hw_queue_mapped(hctx)))
return;
+ blk_mq_stop_hw_queue(hctx);
kblockd_schedule_delayed_work_on(blk_mq_hctx_next_cpu(hctx),
&hctx->delay_work, msecs_to_jiffies(msecs));
}