diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 20189675677a..f0db2dd0be75 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.  	 *  |