Lines Matching refs:scmd

47 static void scsi_eh_done(struct scsi_cmnd *scmd);
56 static int scsi_eh_try_stu(struct scsi_cmnd *scmd);
119 struct scsi_cmnd *scmd = in scmd_eh_abort_handler() local
121 struct scsi_device *sdev = scmd->device; in scmd_eh_abort_handler()
126 scmd_printk(KERN_INFO, scmd, in scmd_eh_abort_handler()
130 scmd_printk(KERN_INFO, scmd, in scmd_eh_abort_handler()
132 rtn = scsi_try_to_abort_cmd(sdev->host->hostt, scmd); in scmd_eh_abort_handler()
134 set_host_byte(scmd, DID_TIME_OUT); in scmd_eh_abort_handler()
137 scmd_printk(KERN_INFO, scmd, in scmd_eh_abort_handler()
140 } else if (!scsi_noretry_cmd(scmd) && in scmd_eh_abort_handler()
141 (++scmd->retries <= scmd->allowed)) { in scmd_eh_abort_handler()
143 scmd_printk(KERN_WARNING, scmd, in scmd_eh_abort_handler()
145 scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY); in scmd_eh_abort_handler()
149 scmd_printk(KERN_WARNING, scmd, in scmd_eh_abort_handler()
151 scsi_finish_command(scmd); in scmd_eh_abort_handler()
156 scmd_printk(KERN_INFO, scmd, in scmd_eh_abort_handler()
163 if (!scsi_eh_scmd_add(scmd, 0)) { in scmd_eh_abort_handler()
165 scmd_printk(KERN_WARNING, scmd, in scmd_eh_abort_handler()
167 set_host_byte(scmd, DID_TIME_OUT); in scmd_eh_abort_handler()
168 scsi_finish_command(scmd); in scmd_eh_abort_handler()
179 scsi_abort_command(struct scsi_cmnd *scmd) in scsi_abort_command() argument
181 struct scsi_device *sdev = scmd->device; in scsi_abort_command()
185 if (scmd->eh_eflags & SCSI_EH_ABORT_SCHEDULED) { in scsi_abort_command()
189 scmd->eh_eflags &= ~SCSI_EH_ABORT_SCHEDULED; in scsi_abort_command()
191 scmd_printk(KERN_INFO, scmd, in scsi_abort_command()
193 BUG_ON(delayed_work_pending(&scmd->abort_work)); in scsi_abort_command()
205 scmd_printk(KERN_INFO, scmd, in scsi_abort_command()
214 scmd->eh_eflags |= SCSI_EH_ABORT_SCHEDULED; in scsi_abort_command()
216 scmd_printk(KERN_INFO, scmd, "abort scheduled\n")); in scsi_abort_command()
217 queue_delayed_work(shost->tmf_work_q, &scmd->abort_work, HZ / 100); in scsi_abort_command()
229 int scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag) in scsi_eh_scmd_add() argument
231 struct Scsi_Host *shost = scmd->device->host; in scsi_eh_scmd_add()
247 if (scmd->eh_eflags & SCSI_EH_ABORT_SCHEDULED) in scsi_eh_scmd_add()
249 scmd->eh_eflags |= eh_flag; in scsi_eh_scmd_add()
250 list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q); in scsi_eh_scmd_add()
270 struct scsi_cmnd *scmd = req->special; in scsi_times_out() local
272 struct Scsi_Host *host = scmd->device->host; in scsi_times_out()
274 trace_scsi_dispatch_cmd_timeout(scmd); in scsi_times_out()
275 scsi_log_completion(scmd, TIMEOUT_ERROR); in scsi_times_out()
281 rtn = host->transportt->eh_timed_out(scmd); in scsi_times_out()
283 rtn = host->hostt->eh_timed_out(scmd); in scsi_times_out()
287 scsi_abort_command(scmd) == SUCCESS) in scsi_times_out()
290 set_host_byte(scmd, DID_TIME_OUT); in scsi_times_out()
291 if (!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD)) in scsi_times_out()
333 struct scsi_cmnd *scmd; in scsi_eh_prt_fail_stats() local
341 list_for_each_entry(scmd, work_q, eh_entry) { in scsi_eh_prt_fail_stats()
342 if (scmd->device == sdev) { in scsi_eh_prt_fail_stats()
344 if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) in scsi_eh_prt_fail_stats()
449 static int scsi_check_sense(struct scsi_cmnd *scmd) in scsi_check_sense() argument
451 struct scsi_device *sdev = scmd->device; in scsi_check_sense()
454 if (! scsi_command_normalize_sense(scmd, &sshdr)) in scsi_check_sense()
472 if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done) in scsi_check_sense()
486 if (scmd->sense_buffer[2] & 0xe0) in scsi_check_sense()
495 (scmd->sense_buffer[8] == 0x4) && in scsi_check_sense()
496 (scmd->sense_buffer[11] & 0xe0)) in scsi_check_sense()
519 if (scmd->device->expecting_cc_ua) { in scsi_check_sense()
527 scmd->device->expecting_cc_ua = 0; in scsi_check_sense()
536 if (scmd->device->sdev_target->expecting_lun_change && in scsi_check_sense()
549 if (scmd->device->allow_restart && in scsi_check_sense()
562 set_host_byte(scmd, DID_ALLOC_FAILURE); in scsi_check_sense()
569 set_host_byte(scmd, DID_TARGET_FAILURE); in scsi_check_sense()
576 set_host_byte(scmd, DID_MEDIUM_ERROR); in scsi_check_sense()
582 if (scmd->device->retry_hwerror) in scsi_check_sense()
585 set_host_byte(scmd, DID_TARGET_FAILURE); in scsi_check_sense()
592 set_host_byte(scmd, DID_TARGET_FAILURE); in scsi_check_sense()
664 static int scsi_eh_completed_normally(struct scsi_cmnd *scmd) in scsi_eh_completed_normally() argument
670 if (host_byte(scmd->result) == DID_RESET) { in scsi_eh_completed_normally()
677 return scsi_check_sense(scmd); in scsi_eh_completed_normally()
679 if (host_byte(scmd->result) != DID_OK) in scsi_eh_completed_normally()
685 if (msg_byte(scmd->result) != COMMAND_COMPLETE) in scsi_eh_completed_normally()
692 switch (status_byte(scmd->result)) { in scsi_eh_completed_normally()
694 scsi_handle_queue_ramp_up(scmd->device); in scsi_eh_completed_normally()
698 return scsi_check_sense(scmd); in scsi_eh_completed_normally()
707 if (scmd->cmnd[0] == TEST_UNIT_READY) in scsi_eh_completed_normally()
714 scsi_handle_queue_full(scmd->device); in scsi_eh_completed_normally()
728 static void scsi_eh_done(struct scsi_cmnd *scmd) in scsi_eh_done() argument
732 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_eh_done()
733 "%s result: %x\n", __func__, scmd->result)); in scsi_eh_done()
735 eh_action = scmd->device->host->eh_action; in scsi_eh_done()
744 static int scsi_try_host_reset(struct scsi_cmnd *scmd) in scsi_try_host_reset() argument
748 struct Scsi_Host *host = scmd->device->host; in scsi_try_host_reset()
757 rtn = hostt->eh_host_reset_handler(scmd); in scsi_try_host_reset()
763 scsi_report_bus_reset(host, scmd_channel(scmd)); in scsi_try_host_reset()
774 static int scsi_try_bus_reset(struct scsi_cmnd *scmd) in scsi_try_bus_reset() argument
778 struct Scsi_Host *host = scmd->device->host; in scsi_try_bus_reset()
781 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_try_bus_reset()
787 rtn = hostt->eh_bus_reset_handler(scmd); in scsi_try_bus_reset()
793 scsi_report_bus_reset(host, scmd_channel(scmd)); in scsi_try_bus_reset()
816 static int scsi_try_target_reset(struct scsi_cmnd *scmd) in scsi_try_target_reset() argument
820 struct Scsi_Host *host = scmd->device->host; in scsi_try_target_reset()
826 rtn = hostt->eh_target_reset_handler(scmd); in scsi_try_target_reset()
829 __starget_for_each_device(scsi_target(scmd->device), NULL, in scsi_try_target_reset()
847 static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd) in scsi_try_bus_device_reset() argument
850 struct scsi_host_template *hostt = scmd->device->host->hostt; in scsi_try_bus_device_reset()
855 rtn = hostt->eh_device_reset_handler(scmd); in scsi_try_bus_device_reset()
857 __scsi_report_device_reset(scmd->device, NULL); in scsi_try_bus_device_reset()
879 struct scsi_cmnd *scmd) in scsi_try_to_abort_cmd() argument
884 return hostt->eh_abort_handler(scmd); in scsi_try_to_abort_cmd()
887 static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd) in scsi_abort_eh_cmnd() argument
889 if (scsi_try_to_abort_cmd(scmd->device->host->hostt, scmd) != SUCCESS) in scsi_abort_eh_cmnd()
890 if (scsi_try_bus_device_reset(scmd) != SUCCESS) in scsi_abort_eh_cmnd()
891 if (scsi_try_target_reset(scmd) != SUCCESS) in scsi_abort_eh_cmnd()
892 if (scsi_try_bus_reset(scmd) != SUCCESS) in scsi_abort_eh_cmnd()
893 scsi_try_host_reset(scmd); in scsi_abort_eh_cmnd()
910 void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses, in scsi_eh_prep_cmnd() argument
913 struct scsi_device *sdev = scmd->device; in scsi_eh_prep_cmnd()
922 ses->cmd_len = scmd->cmd_len; in scsi_eh_prep_cmnd()
923 ses->cmnd = scmd->cmnd; in scsi_eh_prep_cmnd()
924 ses->data_direction = scmd->sc_data_direction; in scsi_eh_prep_cmnd()
925 ses->sdb = scmd->sdb; in scsi_eh_prep_cmnd()
926 ses->next_rq = scmd->request->next_rq; in scsi_eh_prep_cmnd()
927 ses->result = scmd->result; in scsi_eh_prep_cmnd()
928 ses->underflow = scmd->underflow; in scsi_eh_prep_cmnd()
929 ses->prot_op = scmd->prot_op; in scsi_eh_prep_cmnd()
931 scmd->prot_op = SCSI_PROT_NORMAL; in scsi_eh_prep_cmnd()
932 scmd->eh_eflags = 0; in scsi_eh_prep_cmnd()
933 scmd->cmnd = ses->eh_cmnd; in scsi_eh_prep_cmnd()
934 memset(scmd->cmnd, 0, BLK_MAX_CDB); in scsi_eh_prep_cmnd()
935 memset(&scmd->sdb, 0, sizeof(scmd->sdb)); in scsi_eh_prep_cmnd()
936 scmd->request->next_rq = NULL; in scsi_eh_prep_cmnd()
937 scmd->result = 0; in scsi_eh_prep_cmnd()
940 scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, in scsi_eh_prep_cmnd()
942 sg_init_one(&ses->sense_sgl, scmd->sense_buffer, in scsi_eh_prep_cmnd()
943 scmd->sdb.length); in scsi_eh_prep_cmnd()
944 scmd->sdb.table.sgl = &ses->sense_sgl; in scsi_eh_prep_cmnd()
945 scmd->sc_data_direction = DMA_FROM_DEVICE; in scsi_eh_prep_cmnd()
946 scmd->sdb.table.nents = scmd->sdb.table.orig_nents = 1; in scsi_eh_prep_cmnd()
947 scmd->cmnd[0] = REQUEST_SENSE; in scsi_eh_prep_cmnd()
948 scmd->cmnd[4] = scmd->sdb.length; in scsi_eh_prep_cmnd()
949 scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); in scsi_eh_prep_cmnd()
951 scmd->sc_data_direction = DMA_NONE; in scsi_eh_prep_cmnd()
954 memcpy(scmd->cmnd, cmnd, cmnd_size); in scsi_eh_prep_cmnd()
955 scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); in scsi_eh_prep_cmnd()
959 scmd->underflow = 0; in scsi_eh_prep_cmnd()
962 scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) | in scsi_eh_prep_cmnd()
969 memset(scmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in scsi_eh_prep_cmnd()
980 void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses) in scsi_eh_restore_cmnd() argument
985 scmd->cmd_len = ses->cmd_len; in scsi_eh_restore_cmnd()
986 scmd->cmnd = ses->cmnd; in scsi_eh_restore_cmnd()
987 scmd->sc_data_direction = ses->data_direction; in scsi_eh_restore_cmnd()
988 scmd->sdb = ses->sdb; in scsi_eh_restore_cmnd()
989 scmd->request->next_rq = ses->next_rq; in scsi_eh_restore_cmnd()
990 scmd->result = ses->result; in scsi_eh_restore_cmnd()
991 scmd->underflow = ses->underflow; in scsi_eh_restore_cmnd()
992 scmd->prot_op = ses->prot_op; in scsi_eh_restore_cmnd()
1010 static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, in scsi_send_eh_cmnd() argument
1013 struct scsi_device *sdev = scmd->device; in scsi_send_eh_cmnd()
1022 scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes); in scsi_send_eh_cmnd()
1025 scsi_log_send(scmd); in scsi_send_eh_cmnd()
1026 scmd->scsi_done = scsi_eh_done; in scsi_send_eh_cmnd()
1027 rtn = shost->hostt->queuecommand(shost, scmd); in scsi_send_eh_cmnd()
1030 scsi_eh_restore_cmnd(scmd, &ses); in scsi_send_eh_cmnd()
1045 scsi_log_completion(scmd, rtn); in scsi_send_eh_cmnd()
1047 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_send_eh_cmnd()
1061 rtn = scsi_eh_completed_normally(scmd); in scsi_send_eh_cmnd()
1062 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_send_eh_cmnd()
1078 scsi_abort_eh_cmnd(scmd); in scsi_send_eh_cmnd()
1082 scsi_eh_restore_cmnd(scmd, &ses); in scsi_send_eh_cmnd()
1096 static int scsi_request_sense(struct scsi_cmnd *scmd) in scsi_request_sense() argument
1098 return scsi_send_eh_cmnd(scmd, NULL, 0, scmd->device->eh_timeout, ~0); in scsi_request_sense()
1101 static int scsi_eh_action(struct scsi_cmnd *scmd, int rtn) in scsi_eh_action() argument
1103 if (scmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { in scsi_eh_action()
1104 struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); in scsi_eh_action()
1106 rtn = sdrv->eh_action(scmd, rtn); in scsi_eh_action()
1123 void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q) in scsi_eh_finish_cmd() argument
1125 scmd->device->host->host_failed--; in scsi_eh_finish_cmd()
1126 scmd->eh_eflags = 0; in scsi_eh_finish_cmd()
1127 list_move_tail(&scmd->eh_entry, done_q); in scsi_eh_finish_cmd()
1154 struct scsi_cmnd *scmd, *next; in scsi_eh_get_sense() local
1158 list_for_each_entry_safe(scmd, next, work_q, eh_entry) { in scsi_eh_get_sense()
1159 if ((scmd->eh_eflags & SCSI_EH_CANCEL_CMD) || in scsi_eh_get_sense()
1160 SCSI_SENSE_VALID(scmd)) in scsi_eh_get_sense()
1163 shost = scmd->device->host; in scsi_eh_get_sense()
1166 scmd_printk(KERN_INFO, scmd, in scsi_eh_get_sense()
1171 if (status_byte(scmd->result) != CHECK_CONDITION) in scsi_eh_get_sense()
1180 SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, in scsi_eh_get_sense()
1183 rtn = scsi_request_sense(scmd); in scsi_eh_get_sense()
1187 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_eh_get_sense()
1188 "sense requested, result %x\n", scmd->result)); in scsi_eh_get_sense()
1189 SCSI_LOG_ERROR_RECOVERY(3, scsi_print_sense(scmd)); in scsi_eh_get_sense()
1191 rtn = scsi_decide_disposition(scmd); in scsi_eh_get_sense()
1202 scmd->retries = scmd->allowed; in scsi_eh_get_sense()
1206 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_get_sense()
1220 static int scsi_eh_tur(struct scsi_cmnd *scmd) in scsi_eh_tur() argument
1226 rtn = scsi_send_eh_cmnd(scmd, tur_command, 6, in scsi_eh_tur()
1227 scmd->device->eh_timeout, 0); in scsi_eh_tur()
1229 SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd, in scsi_eh_tur()
1261 struct scsi_cmnd *scmd, *next; in scsi_eh_test_devices() local
1266 scmd = list_entry(cmd_list->next, struct scsi_cmnd, eh_entry); in scsi_eh_test_devices()
1267 sdev = scmd->device; in scsi_eh_test_devices()
1281 finish_cmds = !scsi_device_online(scmd->device) || in scsi_eh_test_devices()
1282 (try_stu && !scsi_eh_try_stu(scmd) && in scsi_eh_test_devices()
1283 !scsi_eh_tur(scmd)) || in scsi_eh_test_devices()
1284 !scsi_eh_tur(scmd); in scsi_eh_test_devices()
1286 list_for_each_entry_safe(scmd, next, cmd_list, eh_entry) in scsi_eh_test_devices()
1287 if (scmd->device == sdev) { in scsi_eh_test_devices()
1290 scsi_eh_action(scmd, SUCCESS) == SUCCESS)) in scsi_eh_test_devices()
1291 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_test_devices()
1293 list_move_tail(&scmd->eh_entry, work_q); in scsi_eh_test_devices()
1315 struct scsi_cmnd *scmd, *next; in scsi_eh_abort_cmds() local
1320 list_for_each_entry_safe(scmd, next, work_q, eh_entry) { in scsi_eh_abort_cmds()
1321 if (!(scmd->eh_eflags & SCSI_EH_CANCEL_CMD)) in scsi_eh_abort_cmds()
1323 shost = scmd->device->host; in scsi_eh_abort_cmds()
1327 scmd_printk(KERN_INFO, scmd, in scsi_eh_abort_cmds()
1333 scmd_printk(KERN_INFO, scmd, in scsi_eh_abort_cmds()
1335 rtn = scsi_try_to_abort_cmd(shost->hostt, scmd); in scsi_eh_abort_cmds()
1338 scmd_printk(KERN_INFO, scmd, in scsi_eh_abort_cmds()
1344 scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD; in scsi_eh_abort_cmds()
1346 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_abort_cmds()
1348 list_move_tail(&scmd->eh_entry, &check_list); in scsi_eh_abort_cmds()
1361 static int scsi_eh_try_stu(struct scsi_cmnd *scmd) in scsi_eh_try_stu() argument
1365 if (scmd->device->allow_restart) { in scsi_eh_try_stu()
1369 rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, scmd->device->request_queue->rq_timeout, 0); in scsi_eh_try_stu()
1392 struct scsi_cmnd *scmd, *stu_scmd, *next; in scsi_eh_stu() local
1404 list_for_each_entry(scmd, work_q, eh_entry) in scsi_eh_stu()
1405 if (scmd->device == sdev && SCSI_SENSE_VALID(scmd) && in scsi_eh_stu()
1406 scsi_check_sense(scmd) == FAILED ) { in scsi_eh_stu()
1407 stu_scmd = scmd; in scsi_eh_stu()
1422 list_for_each_entry_safe(scmd, next, in scsi_eh_stu()
1424 if (scmd->device == sdev && in scsi_eh_stu()
1425 scsi_eh_action(scmd, SUCCESS) == SUCCESS) in scsi_eh_stu()
1426 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_stu()
1457 struct scsi_cmnd *scmd, *bdr_scmd, *next; in scsi_eh_bus_device_reset() local
1470 list_for_each_entry(scmd, work_q, eh_entry) in scsi_eh_bus_device_reset()
1471 if (scmd->device == sdev) { in scsi_eh_bus_device_reset()
1472 bdr_scmd = scmd; in scsi_eh_bus_device_reset()
1487 list_for_each_entry_safe(scmd, next, in scsi_eh_bus_device_reset()
1489 if (scmd->device == sdev && in scsi_eh_bus_device_reset()
1490 scsi_eh_action(scmd, rtn) != FAILED) in scsi_eh_bus_device_reset()
1491 scsi_eh_finish_cmd(scmd, in scsi_eh_bus_device_reset()
1524 struct scsi_cmnd *next, *scmd; in scsi_eh_target_reset() local
1539 scmd = list_entry(tmp_list.next, struct scsi_cmnd, eh_entry); in scsi_eh_target_reset()
1540 id = scmd_id(scmd); in scsi_eh_target_reset()
1546 rtn = scsi_try_target_reset(scmd); in scsi_eh_target_reset()
1553 list_for_each_entry_safe(scmd, next, &tmp_list, eh_entry) { in scsi_eh_target_reset()
1554 if (scmd_id(scmd) != id) in scsi_eh_target_reset()
1558 list_move_tail(&scmd->eh_entry, &check_list); in scsi_eh_target_reset()
1560 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_target_reset()
1563 list_move(&scmd->eh_entry, work_q); in scsi_eh_target_reset()
1580 struct scsi_cmnd *scmd, *chan_scmd, *next; in scsi_eh_bus_reset() local
1603 list_for_each_entry(scmd, work_q, eh_entry) { in scsi_eh_bus_reset()
1604 if (channel == scmd_channel(scmd)) { in scsi_eh_bus_reset()
1605 chan_scmd = scmd; in scsi_eh_bus_reset()
1622 list_for_each_entry_safe(scmd, next, work_q, eh_entry) { in scsi_eh_bus_reset()
1623 if (channel == scmd_channel(scmd)) { in scsi_eh_bus_reset()
1625 scsi_eh_finish_cmd(scmd, in scsi_eh_bus_reset()
1628 list_move_tail(&scmd->eh_entry, in scsi_eh_bus_reset()
1652 struct scsi_cmnd *scmd, *next; in scsi_eh_host_reset() local
1657 scmd = list_entry(work_q->next, in scsi_eh_host_reset()
1665 rtn = scsi_try_host_reset(scmd); in scsi_eh_host_reset()
1669 list_for_each_entry_safe(scmd, next, work_q, eh_entry) { in scsi_eh_host_reset()
1670 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_host_reset()
1690 struct scsi_cmnd *scmd, *next; in scsi_eh_offline_sdevs() local
1692 list_for_each_entry_safe(scmd, next, work_q, eh_entry) { in scsi_eh_offline_sdevs()
1693 sdev_printk(KERN_INFO, scmd->device, "Device offlined - " in scsi_eh_offline_sdevs()
1695 scsi_device_set_state(scmd->device, SDEV_OFFLINE); in scsi_eh_offline_sdevs()
1696 if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) { in scsi_eh_offline_sdevs()
1701 scsi_eh_finish_cmd(scmd, done_q); in scsi_eh_offline_sdevs()
1710 int scsi_noretry_cmd(struct scsi_cmnd *scmd) in scsi_noretry_cmd() argument
1712 switch (host_byte(scmd->result)) { in scsi_noretry_cmd()
1718 return (scmd->request->cmd_flags & REQ_FAILFAST_TRANSPORT); in scsi_noretry_cmd()
1720 return (scmd->request->cmd_flags & REQ_FAILFAST_DEV); in scsi_noretry_cmd()
1722 if (msg_byte(scmd->result) == COMMAND_COMPLETE && in scsi_noretry_cmd()
1723 status_byte(scmd->result) == RESERVATION_CONFLICT) in scsi_noretry_cmd()
1727 return (scmd->request->cmd_flags & REQ_FAILFAST_DRIVER); in scsi_noretry_cmd()
1730 if (status_byte(scmd->result) != CHECK_CONDITION) in scsi_noretry_cmd()
1738 if (scmd->request->cmd_flags & REQ_FAILFAST_DEV || in scsi_noretry_cmd()
1739 scmd->request->cmd_type == REQ_TYPE_BLOCK_PC) in scsi_noretry_cmd()
1759 int scsi_decide_disposition(struct scsi_cmnd *scmd) in scsi_decide_disposition() argument
1767 if (!scsi_device_online(scmd->device)) { in scsi_decide_disposition()
1768 SCSI_LOG_ERROR_RECOVERY(5, scmd_printk(KERN_INFO, scmd, in scsi_decide_disposition()
1777 switch (host_byte(scmd->result)) { in scsi_decide_disposition()
1784 scmd->result &= 0xff00ffff; in scsi_decide_disposition()
1792 if (scmd->eh_eflags & SCSI_EH_ABORT_SCHEDULED) { in scsi_decide_disposition()
1793 set_host_byte(scmd, DID_TIME_OUT); in scsi_decide_disposition()
1836 if (msg_byte(scmd->result) == COMMAND_COMPLETE && in scsi_decide_disposition()
1837 status_byte(scmd->result) == RESERVATION_CONFLICT) in scsi_decide_disposition()
1853 if ((scmd->cmnd[0] == TEST_UNIT_READY || in scsi_decide_disposition()
1854 scmd->cmnd[0] == INQUIRY)) { in scsi_decide_disposition()
1868 if (msg_byte(scmd->result) != COMMAND_COMPLETE) in scsi_decide_disposition()
1874 switch (status_byte(scmd->result)) { in scsi_decide_disposition()
1876 scsi_handle_queue_full(scmd->device); in scsi_decide_disposition()
1890 if (scmd->cmnd[0] == REPORT_LUNS) in scsi_decide_disposition()
1891 scmd->device->sdev_target->expecting_lun_change = 0; in scsi_decide_disposition()
1892 scsi_handle_queue_ramp_up(scmd->device); in scsi_decide_disposition()
1898 rtn = scsi_check_sense(scmd); in scsi_decide_disposition()
1916 sdev_printk(KERN_INFO, scmd->device, in scsi_decide_disposition()
1918 set_host_byte(scmd, DID_NEXUS_FAILURE); in scsi_decide_disposition()
1931 if ((++scmd->retries) <= scmd->allowed in scsi_decide_disposition()
1932 && !scsi_noretry_cmd(scmd)) { in scsi_decide_disposition()
2078 struct scsi_cmnd *scmd, *next; in scsi_eh_flush_done_q() local
2080 list_for_each_entry_safe(scmd, next, done_q, eh_entry) { in scsi_eh_flush_done_q()
2081 list_del_init(&scmd->eh_entry); in scsi_eh_flush_done_q()
2082 if (scsi_device_online(scmd->device) && in scsi_eh_flush_done_q()
2083 !scsi_noretry_cmd(scmd) && in scsi_eh_flush_done_q()
2084 (++scmd->retries <= scmd->allowed)) { in scsi_eh_flush_done_q()
2086 scmd_printk(KERN_INFO, scmd, in scsi_eh_flush_done_q()
2089 scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY); in scsi_eh_flush_done_q()
2096 if (!scmd->result) in scsi_eh_flush_done_q()
2097 scmd->result |= (DRIVER_TIMEOUT << 24); in scsi_eh_flush_done_q()
2099 scmd_printk(KERN_INFO, scmd, in scsi_eh_flush_done_q()
2102 scsi_finish_command(scmd); in scsi_eh_flush_done_q()
2307 scsi_reset_provider_done_command(struct scsi_cmnd *scmd) in scsi_reset_provider_done_command() argument
2319 struct scsi_cmnd *scmd; in scsi_ioctl_reset() local
2336 scmd = scsi_get_command(dev, GFP_KERNEL); in scsi_ioctl_reset()
2337 if (!scmd) in scsi_ioctl_reset()
2341 scmd->request = &req; in scsi_ioctl_reset()
2343 scmd->cmnd = req.cmd; in scsi_ioctl_reset()
2345 scmd->scsi_done = scsi_reset_provider_done_command; in scsi_ioctl_reset()
2346 memset(&scmd->sdb, 0, sizeof(scmd->sdb)); in scsi_ioctl_reset()
2348 scmd->cmd_len = 0; in scsi_ioctl_reset()
2350 scmd->sc_data_direction = DMA_BIDIRECTIONAL; in scsi_ioctl_reset()
2361 rtn = scsi_try_bus_device_reset(scmd); in scsi_ioctl_reset()
2366 rtn = scsi_try_target_reset(scmd); in scsi_ioctl_reset()
2371 rtn = scsi_try_bus_reset(scmd); in scsi_ioctl_reset()
2376 rtn = scsi_try_host_reset(scmd); in scsi_ioctl_reset()
2402 scsi_put_command(scmd); in scsi_ioctl_reset()