diff options
Diffstat (limited to 'drivers/scsi/scsi_error.c')
| -rw-r--r-- | drivers/scsi/scsi_error.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 946039117bf4..8932ae81a15a 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -38,6 +38,7 @@  #include <scsi/scsi_host.h>  #include <scsi/scsi_ioctl.h>  #include <scsi/scsi_dh.h> +#include <scsi/scsi_devinfo.h>  #include <scsi/sg.h>  #include "scsi_priv.h" @@ -282,7 +283,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)  enum blk_eh_timer_return scsi_times_out(struct request *req)  {  	struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(req); -	enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED; +	enum blk_eh_timer_return rtn = BLK_EH_DONE;  	struct Scsi_Host *host = scmd->device->host;  	trace_scsi_dispatch_cmd_timeout(scmd); @@ -294,7 +295,7 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)  	if (host->hostt->eh_timed_out)  		rtn = host->hostt->eh_timed_out(scmd); -	if (rtn == BLK_EH_NOT_HANDLED) { +	if (rtn == BLK_EH_DONE) {  		if (scsi_abort_command(scmd) != SUCCESS) {  			set_host_byte(scmd, DID_TIME_OUT);  			scsi_eh_scmd_add(scmd); @@ -525,6 +526,12 @@ int scsi_check_sense(struct scsi_cmnd *scmd)  		if (sshdr.asc == 0x10) /* DIF */  			return SUCCESS; +		if (sshdr.asc == 0x44 && sdev->sdev_bflags & BLIST_RETRY_ITF) +			return ADD_TO_MLQUEUE; +		if (sshdr.asc == 0xc1 && sshdr.ascq == 0x01 && +		    sdev->sdev_bflags & BLIST_RETRY_ASC_C1) +			return ADD_TO_MLQUEUE; +  		return NEEDS_RETRY;  	case NOT_READY:  	case UNIT_ATTENTION: @@ -1933,11 +1940,7 @@ static void scsi_eh_lock_door(struct scsi_device *sdev)  	struct request *req;  	struct scsi_request *rq; -	/* -	 * blk_get_request with GFP_KERNEL (__GFP_RECLAIM) sleeps until a -	 * request becomes available -	 */ -	req = blk_get_request(sdev->request_queue, REQ_OP_SCSI_IN, GFP_KERNEL); +	req = blk_get_request(sdev->request_queue, REQ_OP_SCSI_IN, 0);  	if (IS_ERR(req))  		return;  	rq = scsi_req(req);  | 
