summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2013-01-19 03:19:39 +0000
committerkan <kan@FreeBSD.org>2013-01-19 03:19:39 +0000
commit404c93b66124e228cff11515450b5db58fa7fe0c (patch)
treee970e050939adc2f9dabd22c7a4a9404d735d015 /sys
parentc3e3cd888a40bf5ef4db38bead1b0b215e6483b6 (diff)
downloadFreeBSD-src-404c93b66124e228cff11515450b5db58fa7fe0c.zip
FreeBSD-src-404c93b66124e228cff11515450b5db58fa7fe0c.tar.gz
Do not pretend to have autosense data when no such data is available.
Make umass return an error code if SCSI sense retrieval request has failed. Make sure scsi_error_action honors SF_NO_RETRY and SF_NO_RECOVERY in all cases, even if it cannot parse sense bytes. Reviewed by: hselasky (umass), scottl (cam)
Diffstat (limited to 'sys')
-rw-r--r--sys/cam/scsi/scsi_all.c19
-rw-r--r--sys/dev/usb/storage/umass.c10
2 files changed, 16 insertions, 13 deletions
diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c
index a37ae19..0483d2d 100644
--- a/sys/cam/scsi/scsi_all.c
+++ b/sys/cam/scsi/scsi_all.c
@@ -3071,16 +3071,15 @@ scsi_error_action(struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data,
SSQ_PRINT_SENSE;
}
}
- if ((action & SS_MASK) >= SS_START &&
- (sense_flags & SF_NO_RECOVERY)) {
- action &= ~SS_MASK;
- action |= SS_FAIL;
- } else if ((action & SS_MASK) == SS_RETRY &&
- (sense_flags & SF_NO_RETRY)) {
- action &= ~SS_MASK;
- action |= SS_FAIL;
- }
-
+ }
+ if ((action & SS_MASK) >= SS_START &&
+ (sense_flags & SF_NO_RECOVERY)) {
+ action &= ~SS_MASK;
+ action |= SS_FAIL;
+ } else if ((action & SS_MASK) == SS_RETRY &&
+ (sense_flags & SF_NO_RETRY)) {
+ action &= ~SS_MASK;
+ action |= SS_FAIL;
}
if ((sense_flags & SF_PRINT_ALWAYS) != 0)
action |= SSQ_PRINT_SENSE;
diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c
index 0785940..a7feea7 100644
--- a/sys/dev/usb/storage/umass.c
+++ b/sys/dev/usb/storage/umass.c
@@ -2602,9 +2602,13 @@ umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue,
}
} else {
xpt_freeze_devq(ccb->ccb_h.path, 1);
- ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR
- | CAM_AUTOSNS_VALID | CAM_DEV_QFRZN;
- ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
+ if (key >= 0) {
+ ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR
+ | CAM_AUTOSNS_VALID | CAM_DEV_QFRZN;
+ ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
+ } else
+ ccb->ccb_h.status = CAM_AUTOSENSE_FAIL
+ | CAM_DEV_QFRZN;
}
xpt_done(ccb);
break;
OpenPOWER on IntegriCloud