diff options
Diffstat (limited to 'drivers/scsi/scsi_error.c')
| -rw-r--r-- | drivers/scsi/scsi_error.c | 19 | 
1 files changed, 14 insertions, 5 deletions
| diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 7ad53fa4276..a5d630f5f51 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -39,6 +39,8 @@  #include "scsi_logging.h"  #include "scsi_transport_api.h" +#include <trace/events/scsi.h> +  #define SENSE_TIMEOUT		(10*HZ)  /* @@ -52,6 +54,7 @@  void scsi_eh_wakeup(struct Scsi_Host *shost)  {  	if (shost->host_busy == shost->host_failed) { +		trace_scsi_eh_wakeup(shost);  		wake_up_process(shost->ehandler);  		SCSI_LOG_ERROR_RECOVERY(5,  				printk("Waking error handler thread\n")); @@ -127,6 +130,7 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)  	struct scsi_cmnd *scmd = req->special;  	enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED; +	trace_scsi_dispatch_cmd_timeout(scmd);  	scsi_log_completion(scmd, TIMEOUT_ERROR);  	if (scmd->device->host->transportt->eh_timed_out) @@ -970,9 +974,10 @@ static int scsi_eh_abort_cmds(struct list_head *work_q,  						  "0x%p\n", current->comm,  						  scmd));  		rtn = scsi_try_to_abort_cmd(scmd); -		if (rtn == SUCCESS) { +		if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {  			scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD;  			if (!scsi_device_online(scmd->device) || +			    rtn == FAST_IO_FAIL ||  			    !scsi_eh_tur(scmd)) {  				scsi_eh_finish_cmd(scmd, done_q);  			} @@ -1099,8 +1104,9 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,  						  " 0x%p\n", current->comm,  						  sdev));  		rtn = scsi_try_bus_device_reset(bdr_scmd); -		if (rtn == SUCCESS) { +		if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {  			if (!scsi_device_online(sdev) || +			    rtn == FAST_IO_FAIL ||  			    !scsi_eh_tur(bdr_scmd)) {  				list_for_each_entry_safe(scmd, next,  							 work_q, eh_entry) { @@ -1163,10 +1169,11 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,  						  "to target %d\n",  						  current->comm, id));  		rtn = scsi_try_target_reset(tgtr_scmd); -		if (rtn == SUCCESS) { +		if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {  			list_for_each_entry_safe(scmd, next, work_q, eh_entry) {  				if (id == scmd_id(scmd))  					if (!scsi_device_online(scmd->device) || +					    rtn == FAST_IO_FAIL ||  					    !scsi_eh_tur(tgtr_scmd))  						scsi_eh_finish_cmd(scmd,  								   done_q); @@ -1222,10 +1229,11 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost,  						  " %d\n", current->comm,  						  channel));  		rtn = scsi_try_bus_reset(chan_scmd); -		if (rtn == SUCCESS) { +		if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {  			list_for_each_entry_safe(scmd, next, work_q, eh_entry) {  				if (channel == scmd_channel(scmd))  					if (!scsi_device_online(scmd->device) || +					    rtn == FAST_IO_FAIL ||  					    !scsi_eh_tur(scmd))  						scsi_eh_finish_cmd(scmd,  								   done_q); @@ -1259,9 +1267,10 @@ static int scsi_eh_host_reset(struct list_head *work_q,  						  , current->comm));  		rtn = scsi_try_host_reset(scmd); -		if (rtn == SUCCESS) { +		if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {  			list_for_each_entry_safe(scmd, next, work_q, eh_entry) {  				if (!scsi_device_online(scmd->device) || +				    rtn == FAST_IO_FAIL ||  				    (!scsi_eh_try_stu(scmd) && !scsi_eh_tur(scmd)) ||  				    !scsi_eh_tur(scmd))  					scsi_eh_finish_cmd(scmd, done_q); | 
