diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ba2286652ff6..e5a2d590a104 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -496,7 +496,7 @@ static void scsi_run_queue(struct request_queue *q)  		scsi_starved_list_run(sdev->host);  	if (q->mq_ops) -		blk_mq_start_stopped_hw_queues(q, false); +		blk_mq_run_hw_queues(q, false);  	else  		blk_run_queue(q);  } @@ -667,7 +667,7 @@ static bool scsi_end_request(struct request *req, int error,  		    !list_empty(&sdev->host->starved_list))  			kblockd_schedule_work(&sdev->requeue_work);  		else -			blk_mq_start_stopped_hw_queues(q, true); +			blk_mq_run_hw_queues(q, true);  	} else {  		unsigned long flags; @@ -1974,7 +1974,7 @@ out:  	case BLK_MQ_RQ_QUEUE_BUSY:  		if (atomic_read(&sdev->device_busy) == 0 &&  		    !scsi_device_blocked(sdev)) -			blk_mq_delay_queue(hctx, SCSI_QUEUE_DELAY); +			blk_mq_delay_run_hw_queue(hctx, SCSI_QUEUE_DELAY);  		break;  	case BLK_MQ_RQ_QUEUE_ERROR:  		/* @@ -2932,6 +2932,8 @@ EXPORT_SYMBOL(scsi_target_resume);  /**   * scsi_internal_device_block - internal function to put a device temporarily into the SDEV_BLOCK state   * @sdev:	device to block + * @wait:	Whether or not to wait until ongoing .queuecommand() / + *		.queue_rq() calls have finished.   *   * Block request made by scsi lld's to temporarily stop all   * scsi commands on the specified device. May sleep. @@ -2949,7 +2951,7 @@ EXPORT_SYMBOL(scsi_target_resume);   * remove the rport mutex lock and unlock calls from srp_queuecommand().   */  int -scsi_internal_device_block(struct scsi_device *sdev) +scsi_internal_device_block(struct scsi_device *sdev, bool wait)  {  	struct request_queue *q = sdev->request_queue;  	unsigned long flags; @@ -2969,12 +2971,16 @@ scsi_internal_device_block(struct scsi_device *sdev)  	 * request queue.   	 */  	if (q->mq_ops) { -		blk_mq_quiesce_queue(q); +		if (wait) +			blk_mq_quiesce_queue(q); +		else +			blk_mq_stop_hw_queues(q);  	} else {  		spin_lock_irqsave(q->queue_lock, flags);  		blk_stop_queue(q);  		spin_unlock_irqrestore(q->queue_lock, flags); -		scsi_wait_for_queuecommand(sdev); +		if (wait) +			scsi_wait_for_queuecommand(sdev);  	}  	return 0; @@ -3036,7 +3042,7 @@ EXPORT_SYMBOL_GPL(scsi_internal_device_unblock);  static void  device_block(struct scsi_device *sdev, void *data)  { -	scsi_internal_device_block(sdev); +	scsi_internal_device_block(sdev, true);  }  static int  | 
