diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 20189675677a..601b9f1de267 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -585,10 +585,17 @@ static bool scsi_end_request(struct request *req, blk_status_t error,  	if (!blk_rq_is_scsi(req)) {  		WARN_ON_ONCE(!(cmd->flags & SCMD_INITIALIZED));  		cmd->flags &= ~SCMD_INITIALIZED; -		destroy_rcu_head(&cmd->rcu);  	}  	/* +	 * Calling rcu_barrier() is not necessary here because the +	 * SCSI error handler guarantees that the function called by +	 * call_rcu() has been called before scsi_end_request() is +	 * called. +	 */ +	destroy_rcu_head(&cmd->rcu); + +	/*  	 * In the MQ case the command gets freed by __blk_mq_end_request,  	 * so we have to do all cleanup that depends on it earlier.  	 * @@ -2541,8 +2548,10 @@ void scsi_device_resume(struct scsi_device *sdev)  	 * device deleted during suspend)  	 */  	mutex_lock(&sdev->state_mutex); -	sdev->quiesced_by = NULL; -	blk_clear_pm_only(sdev->request_queue); +	if (sdev->quiesced_by) { +		sdev->quiesced_by = NULL; +		blk_clear_pm_only(sdev->request_queue); +	}  	if (sdev->sdev_state == SDEV_QUIESCE)  		scsi_device_set_state(sdev, SDEV_RUNNING);  	mutex_unlock(&sdev->state_mutex);  | 

