*/
 void blk_mq_quiesce_queue_nowait(struct request_queue *q)
 {
-       blk_queue_flag_set(QUEUE_FLAG_QUIESCED, q);
+       unsigned long flags;
+
+       spin_lock_irqsave(&q->queue_lock, flags);
+       if (!q->quiesce_depth++)
+               blk_queue_flag_set(QUEUE_FLAG_QUIESCED, q);
+       spin_unlock_irqrestore(&q->queue_lock, flags);
 }
 EXPORT_SYMBOL_GPL(blk_mq_quiesce_queue_nowait);
 
  */
 void blk_mq_unquiesce_queue(struct request_queue *q)
 {
-       blk_queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
+       unsigned long flags;
+       bool run_queue = false;
+
+       spin_lock_irqsave(&q->queue_lock, flags);
+       if (WARN_ON_ONCE(q->quiesce_depth <= 0)) {
+               ;
+       } else if (!--q->quiesce_depth) {
+               blk_queue_flag_clear(QUEUE_FLAG_QUIESCED, q);
+               run_queue = true;
+       }
+       spin_unlock_irqrestore(&q->queue_lock, flags);
 
        /* dispatch requests which are inserted during quiescing */
-       blk_mq_run_hw_queues(q, true);
+       if (run_queue)
+               blk_mq_run_hw_queues(q, true);
 }
 EXPORT_SYMBOL_GPL(blk_mq_unquiesce_queue);