diff options
Diffstat (limited to 'drivers/scsi/scsi_error.c')
-rw-r--r-- | drivers/scsi/scsi_error.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 771c16bfdbac..f17aa7aa7879 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -189,6 +189,7 @@ scsi_abort_command(struct scsi_cmnd *scmd) | |||
189 | /* | 189 | /* |
190 | * Retry after abort failed, escalate to next level. | 190 | * Retry after abort failed, escalate to next level. |
191 | */ | 191 | */ |
192 | scmd->eh_eflags &= ~SCSI_EH_ABORT_SCHEDULED; | ||
192 | SCSI_LOG_ERROR_RECOVERY(3, | 193 | SCSI_LOG_ERROR_RECOVERY(3, |
193 | scmd_printk(KERN_INFO, scmd, | 194 | scmd_printk(KERN_INFO, scmd, |
194 | "scmd %p previous abort failed\n", scmd)); | 195 | "scmd %p previous abort failed\n", scmd)); |
@@ -920,10 +921,12 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses, | |||
920 | ses->prot_op = scmd->prot_op; | 921 | ses->prot_op = scmd->prot_op; |
921 | 922 | ||
922 | scmd->prot_op = SCSI_PROT_NORMAL; | 923 | scmd->prot_op = SCSI_PROT_NORMAL; |
924 | scmd->eh_eflags = 0; | ||
923 | scmd->cmnd = ses->eh_cmnd; | 925 | scmd->cmnd = ses->eh_cmnd; |
924 | memset(scmd->cmnd, 0, BLK_MAX_CDB); | 926 | memset(scmd->cmnd, 0, BLK_MAX_CDB); |
925 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); | 927 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); |
926 | scmd->request->next_rq = NULL; | 928 | scmd->request->next_rq = NULL; |
929 | scmd->result = 0; | ||
927 | 930 | ||
928 | if (sense_bytes) { | 931 | if (sense_bytes) { |
929 | scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, | 932 | scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, |
@@ -1157,6 +1160,15 @@ int scsi_eh_get_sense(struct list_head *work_q, | |||
1157 | __func__)); | 1160 | __func__)); |
1158 | break; | 1161 | break; |
1159 | } | 1162 | } |
1163 | if (status_byte(scmd->result) != CHECK_CONDITION) | ||
1164 | /* | ||
1165 | * don't request sense if there's no check condition | ||
1166 | * status because the error we're processing isn't one | ||
1167 | * that has a sense code (and some devices get | ||
1168 | * confused by sense requests out of the blue) | ||
1169 | */ | ||
1170 | continue; | ||
1171 | |||
1160 | SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, | 1172 | SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, |
1161 | "%s: requesting sense\n", | 1173 | "%s: requesting sense\n", |
1162 | current->comm)); | 1174 | current->comm)); |