Skip to content

Commit d7035b7

Browse files
mwilckmartinkpetersen
authored andcommitted
scsi: core: Don't wait for quiesce in scsi_stop_queue()
scsi_stop_queue() has just two callers, one with and one without "nowait". As blk_mq_quiesce_queue() comes down to blk_mq_quiesce_queue_nowait() followed by blk_mq_wait_quiesce_done(), we might as well open-code this in scsi_device_block(). Also, add a comment explaining why blk_mq_quiesce_queue_nowait() must be called with the state_mutex held, see https://lore.kernel.org/linux-scsi/[email protected]/. Signed-off-by: Martin Wilck <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent c5e46f7 commit d7035b7

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

drivers/scsi/scsi_lib.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,24 +2725,16 @@ void scsi_start_queue(struct scsi_device *sdev)
27252725
blk_mq_unquiesce_queue(sdev->request_queue);
27262726
}
27272727

2728-
static void scsi_stop_queue(struct scsi_device *sdev, bool nowait)
2728+
static void scsi_stop_queue(struct scsi_device *sdev)
27292729
{
27302730
/*
27312731
* The atomic variable of ->queue_stopped covers that
27322732
* blk_mq_quiesce_queue* is balanced with blk_mq_unquiesce_queue.
27332733
*
2734-
* However, we still need to wait until quiesce is done
2735-
* in case that queue has been stopped.
2734+
* The caller needs to wait until quiesce is done.
27362735
*/
2737-
if (!cmpxchg(&sdev->queue_stopped, 0, 1)) {
2738-
if (nowait)
2739-
blk_mq_quiesce_queue_nowait(sdev->request_queue);
2740-
else
2741-
blk_mq_quiesce_queue(sdev->request_queue);
2742-
} else {
2743-
if (!nowait)
2744-
blk_mq_wait_quiesce_done(sdev->request_queue->tag_set);
2745-
}
2736+
if (!cmpxchg(&sdev->queue_stopped, 0, 1))
2737+
blk_mq_quiesce_queue_nowait(sdev->request_queue);
27462738
}
27472739

27482740
/**
@@ -2769,7 +2761,7 @@ int scsi_internal_device_block_nowait(struct scsi_device *sdev)
27692761
* request queue.
27702762
*/
27712763
if (!ret)
2772-
scsi_stop_queue(sdev, true);
2764+
scsi_stop_queue(sdev);
27732765
return ret;
27742766
}
27752767
EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
@@ -2794,9 +2786,17 @@ static void scsi_device_block(struct scsi_device *sdev, void *data)
27942786

27952787
mutex_lock(&sdev->state_mutex);
27962788
err = __scsi_internal_device_block_nowait(sdev);
2797-
if (err == 0)
2798-
scsi_stop_queue(sdev, false);
2799-
mutex_unlock(&sdev->state_mutex);
2789+
if (err == 0) {
2790+
/*
2791+
* scsi_stop_queue() must be called with the state_mutex
2792+
* held. Otherwise a simultaneous scsi_start_queue() call
2793+
* might unquiesce the queue before we quiesce it.
2794+
*/
2795+
scsi_stop_queue(sdev);
2796+
mutex_unlock(&sdev->state_mutex);
2797+
blk_mq_wait_quiesce_done(sdev->request_queue->tag_set);
2798+
} else
2799+
mutex_unlock(&sdev->state_mutex);
28002800

28012801
WARN_ONCE(err, "__scsi_internal_device_block_nowait(%s) failed: err = %d\n",
28022802
dev_name(&sdev->sdev_gendev), err);

0 commit comments

Comments
 (0)