}
EXPORT_SYMBOL(blk_mq_run_hw_queues);
-void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
+static void __blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx, bool sync)
{
- cancel_work(&hctx->run_work);
- cancel_delayed_work(&hctx->delay_work);
+ if (sync) {
+ cancel_work_sync(&hctx->run_work);
+ cancel_delayed_work_sync(&hctx->delay_work);
+ } else {
+ cancel_work(&hctx->run_work);
+ cancel_delayed_work(&hctx->delay_work);
+ }
set_bit(BLK_MQ_S_STOPPED, &hctx->state);
}
+
+void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx)
+{
+ __blk_mq_stop_hw_queue(hctx, false);
+}
EXPORT_SYMBOL(blk_mq_stop_hw_queue);
void blk_mq_stop_hw_queues(struct request_queue *q)
struct blk_mq_hw_ctx *hctx = hctxs[j];
if (hctx) {
+ __blk_mq_stop_hw_queue(hctx, true);
if (hctx->tags) {
blk_mq_free_rq_map(set, hctx->tags, j);
set->tags[j] = NULL;