Avoid that it can take 200 ms too long to wait for ongoing requests
to finish. Note: blk_mq_freeze_queue() uses a wait queue to wait
for ongoing requests to finish.
Signed-off-by: Bart Van Assche <redacted>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Ming Lei <redacted>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <redacted>
---
drivers/scsi/scsi_lib.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index e76fd6e89a81..34e5f0f95d01 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2901,10 +2901,15 @@ scsi_device_quiesce(struct scsi_device *sdev)
if (err)
return err;
- scsi_run_queue(q);
- while (atomic_read(&sdev->device_busy)) {
- msleep_interruptible(200);
+ if (q->mq_ops) {
+ blk_mq_freeze_queue(q);
+ blk_mq_unfreeze_queue(q);
+ } else {
scsi_run_queue(q);
+ while (atomic_read(&sdev->device_busy)) {
+ msleep_interruptible(200);
+ scsi_run_queue(q);
+ }
}
return 0;
}--
2.14.1