diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 43f34c73df12..c9e1242eaf25 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1049,7 +1049,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1049 | good_bytes = sd_completed_bytes(SCpnt); | 1049 | good_bytes = sd_completed_bytes(SCpnt); |
1050 | break; | 1050 | break; |
1051 | case RECOVERED_ERROR: | 1051 | case RECOVERED_ERROR: |
1052 | case NO_SENSE: | ||
1053 | /* Inform the user, but make sure that it's not treated | 1052 | /* Inform the user, but make sure that it's not treated |
1054 | * as a hard error. | 1053 | * as a hard error. |
1055 | */ | 1054 | */ |
@@ -1058,6 +1057,15 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1058 | memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); | 1057 | memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); |
1059 | good_bytes = scsi_bufflen(SCpnt); | 1058 | good_bytes = scsi_bufflen(SCpnt); |
1060 | break; | 1059 | break; |
1060 | case NO_SENSE: | ||
1061 | /* This indicates a false check condition, so ignore it. An | ||
1062 | * unknown amount of data was transferred so treat it as an | ||
1063 | * error. | ||
1064 | */ | ||
1065 | scsi_print_sense("sd", SCpnt); | ||
1066 | SCpnt->result = 0; | ||
1067 | memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); | ||
1068 | break; | ||
1061 | case ABORTED_COMMAND: | 1069 | case ABORTED_COMMAND: |
1062 | if (sshdr.asc == 0x10) { /* DIF: Disk detected corruption */ | 1070 | if (sshdr.asc == 0x10) { /* DIF: Disk detected corruption */ |
1063 | scsi_print_result(SCpnt); | 1071 | scsi_print_result(SCpnt); |
@@ -1071,15 +1079,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1071 | scsi_print_sense("sd", SCpnt); | 1079 | scsi_print_sense("sd", SCpnt); |
1072 | good_bytes = sd_completed_bytes(SCpnt); | 1080 | good_bytes = sd_completed_bytes(SCpnt); |
1073 | } | 1081 | } |
1074 | if (!scsi_device_protection(SCpnt->device) && | ||
1075 | SCpnt->device->use_10_for_rw && | ||
1076 | (SCpnt->cmnd[0] == READ_10 || | ||
1077 | SCpnt->cmnd[0] == WRITE_10)) | ||
1078 | SCpnt->device->use_10_for_rw = 0; | ||
1079 | if (SCpnt->device->use_10_for_ms && | ||
1080 | (SCpnt->cmnd[0] == MODE_SENSE_10 || | ||
1081 | SCpnt->cmnd[0] == MODE_SELECT_10)) | ||
1082 | SCpnt->device->use_10_for_ms = 0; | ||
1083 | break; | 1082 | break; |
1084 | default: | 1083 | default: |
1085 | break; | 1084 | break; |
@@ -1432,7 +1431,7 @@ got_data: | |||
1432 | 1431 | ||
1433 | { | 1432 | { |
1434 | char cap_str_2[10], cap_str_10[10]; | 1433 | char cap_str_2[10], cap_str_10[10]; |
1435 | u64 sz = sdkp->capacity << ffz(~sector_size); | 1434 | u64 sz = (u64)sdkp->capacity << ilog2(sector_size); |
1436 | 1435 | ||
1437 | string_get_size(sz, STRING_UNITS_2, cap_str_2, | 1436 | string_get_size(sz, STRING_UNITS_2, cap_str_2, |
1438 | sizeof(cap_str_2)); | 1437 | sizeof(cap_str_2)); |