aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/scsi_lib.c136
1 files changed, 77 insertions, 59 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 148d3af92ae..ecfbbd30dce 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -875,16 +875,24 @@ static void scsi_end_bidi_request(struct scsi_cmnd *cmd)
875 * (the normal case for most drivers), we don't need 875 * (the normal case for most drivers), we don't need
876 * the logic to deal with cleaning up afterwards. 876 * the logic to deal with cleaning up afterwards.
877 * 877 *
878 * We must do one of several things here: 878 * We must call scsi_end_request(). This will finish off
879 * 879 * the specified number of sectors. If we are done, the
880 * a) Call scsi_end_request. This will finish off the 880 * command block will be released and the queue function
881 * specified number of sectors. If we are done, the 881 * will be goosed. If we are not done then we have to
882 * command block will be released, and the queue 882 * figure out what to do next:
883 * function will be goosed. If we are not done, then 883 *
884 * scsi_end_request will directly goose the queue. 884 * a) We can call scsi_requeue_command(). The request
885 * 885 * will be unprepared and put back on the queue. Then
886 * b) We can just use scsi_requeue_command() here. This would 886 * a new command will be created for it. This should
887 * be used if we just wanted to retry, for example. 887 * be used if we made forward progress, or if we want
888 * to switch from READ(10) to READ(6) for example.
889 *
890 * b) We can call scsi_queue_insert(). The request will
891 * be put back on the queue and retried using the same
892 * command as before, possibly after a delay.
893 *
894 * c) We can call blk_end_request() with -EIO to fail
895 * the remainder of the request.
888 */ 896 */
889void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) 897void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
890{ 898{
@@ -896,6 +904,9 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
896 struct scsi_sense_hdr sshdr; 904 struct scsi_sense_hdr sshdr;
897 int sense_valid = 0; 905 int sense_valid = 0;
898 int sense_deferred = 0; 906 int sense_deferred = 0;
907 enum {ACTION_FAIL, ACTION_REPREP, ACTION_RETRY,
908 ACTION_DELAYED_RETRY} action;
909 char *description = NULL;
899 910
900 if (result) { 911 if (result) {
901 sense_valid = scsi_command_normalize_sense(cmd, &sshdr); 912 sense_valid = scsi_command_normalize_sense(cmd, &sshdr);
@@ -947,10 +958,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
947 return; 958 return;
948 this_count = blk_rq_bytes(req); 959 this_count = blk_rq_bytes(req);
949 960
950 /* good_bytes = 0, or (inclusive) there were leftovers and 961 if (host_byte(result) == DID_RESET) {
951 * result = 0, so scsi_end_request couldn't retry. 962 /* Third party bus reset or reset for error recovery
952 */ 963 * reasons. Just retry the command and see what
953 if (sense_valid && !sense_deferred) { 964 * happens.
965 */
966 action = ACTION_RETRY;
967 } else if (sense_valid && !sense_deferred) {
954 switch (sshdr.sense_key) { 968 switch (sshdr.sense_key) {
955 case UNIT_ATTENTION: 969 case UNIT_ATTENTION:
956 if (cmd->device->removable) { 970 if (cmd->device->removable) {
@@ -958,16 +972,15 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
958 * and quietly refuse further access. 972 * and quietly refuse further access.
959 */ 973 */
960 cmd->device->changed = 1; 974 cmd->device->changed = 1;
961 scsi_end_request(cmd, -EIO, this_count, 1); 975 description = "Media Changed";
962 return; 976 action = ACTION_FAIL;
963 } else { 977 } else {
964 /* Must have been a power glitch, or a 978 /* Must have been a power glitch, or a
965 * bus reset. Could not have been a 979 * bus reset. Could not have been a
966 * media change, so we just retry the 980 * media change, so we just retry the
967 * request and see what happens. 981 * command and see what happens.
968 */ 982 */
969 scsi_requeue_command(q, cmd); 983 action = ACTION_RETRY;
970 return;
971 } 984 }
972 break; 985 break;
973 case ILLEGAL_REQUEST: 986 case ILLEGAL_REQUEST:
@@ -983,21 +996,18 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
983 sshdr.asc == 0x20 && sshdr.ascq == 0x00) && 996 sshdr.asc == 0x20 && sshdr.ascq == 0x00) &&
984 (cmd->cmnd[0] == READ_10 || 997 (cmd->cmnd[0] == READ_10 ||
985 cmd->cmnd[0] == WRITE_10)) { 998 cmd->cmnd[0] == WRITE_10)) {
999 /* This will issue a new 6-byte command. */
986 cmd->device->use_10_for_rw = 0; 1000 cmd->device->use_10_for_rw = 0;
987 /* This will cause a retry with a 1001 action = ACTION_REPREP;
988 * 6-byte command. 1002 } else
989 */ 1003 action = ACTION_FAIL;
990 scsi_requeue_command(q, cmd); 1004 break;
991 } else if (sshdr.asc == 0x10) /* DIX */
992 scsi_end_request(cmd, -EIO, this_count, 0);
993 else
994 scsi_end_request(cmd, -EIO, this_count, 1);
995 return;
996 case ABORTED_COMMAND: 1005 case ABORTED_COMMAND:
997 if (sshdr.asc == 0x10) { /* DIF */ 1006 if (sshdr.asc == 0x10) { /* DIF */
998 scsi_end_request(cmd, -EIO, this_count, 0); 1007 action = ACTION_FAIL;
999 return; 1008 description = "Data Integrity Failure";
1000 } 1009 } else
1010 action = ACTION_RETRY;
1001 break; 1011 break;
1002 case NOT_READY: 1012 case NOT_READY:
1003 /* If the device is in the process of becoming 1013 /* If the device is in the process of becoming
@@ -1012,49 +1022,57 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
1012 case 0x07: /* operation in progress */ 1022 case 0x07: /* operation in progress */
1013 case 0x08: /* Long write in progress */ 1023 case 0x08: /* Long write in progress */
1014 case 0x09: /* self test in progress */ 1024 case 0x09: /* self test in progress */
1015 scsi_requeue_command(q, cmd); 1025 action = ACTION_DELAYED_RETRY;
1016 return;
1017 default:
1018 break; 1026 break;
1019 } 1027 }
1028 } else {
1029 description = "Device not ready";
1030 action = ACTION_FAIL;
1020 } 1031 }
1021 if (!(req->cmd_flags & REQ_QUIET)) 1032 break;
1022 scsi_cmd_print_sense_hdr(cmd,
1023 "Device not ready",
1024 &sshdr);
1025
1026 scsi_end_request(cmd, -EIO, this_count, 1);
1027 return;
1028 case VOLUME_OVERFLOW: 1033 case VOLUME_OVERFLOW:
1029 if (!(req->cmd_flags & REQ_QUIET)) {
1030 scmd_printk(KERN_INFO, cmd,
1031 "Volume overflow, CDB: ");
1032 __scsi_print_command(cmd->cmnd);
1033 scsi_print_sense("", cmd);
1034 }
1035 /* See SSC3rXX or current. */ 1034 /* See SSC3rXX or current. */
1036 scsi_end_request(cmd, -EIO, this_count, 1); 1035 action = ACTION_FAIL;
1037 return; 1036 break;
1038 default: 1037 default:
1038 description = "Unhandled sense code";
1039 action = ACTION_FAIL;
1039 break; 1040 break;
1040 } 1041 }
1042 } else {
1043 description = "Unhandled error code";
1044 action = ACTION_FAIL;
1041 } 1045 }
1042 if (host_byte(result) == DID_RESET) { 1046
1043 /* Third party bus reset or reset for error recovery 1047 switch (action) {
1044 * reasons. Just retry the request and see what 1048 case ACTION_FAIL:
1045 * happens. 1049 /* Give up and fail the remainder of the request */
1046 */
1047 scsi_requeue_command(q, cmd);
1048 return;
1049 }
1050 if (result) {
1051 if (!(req->cmd_flags & REQ_QUIET)) { 1050 if (!(req->cmd_flags & REQ_QUIET)) {
1051 if (description)
1052 scmd_printk(KERN_INFO, cmd, "%s",
1053 description);
1052 scsi_print_result(cmd); 1054 scsi_print_result(cmd);
1053 if (driver_byte(result) & DRIVER_SENSE) 1055 if (driver_byte(result) & DRIVER_SENSE)
1054 scsi_print_sense("", cmd); 1056 scsi_print_sense("", cmd);
1055 } 1057 }
1058 blk_end_request(req, -EIO, blk_rq_bytes(req));
1059 scsi_next_command(cmd);
1060 break;
1061 case ACTION_REPREP:
1062 /* Unprep the request and put it back at the head of the queue.
1063 * A new command will be prepared and issued.
1064 */
1065 scsi_requeue_command(q, cmd);
1066 break;
1067 case ACTION_RETRY:
1068 /* Retry the same command immediately */
1069 scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY);
1070 break;
1071 case ACTION_DELAYED_RETRY:
1072 /* Retry the same command after a delay */
1073 scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
1074 break;
1056 } 1075 }
1057 scsi_end_request(cmd, -EIO, this_count, !result);
1058} 1076}
1059 1077
1060static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb, 1078static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb,