svn commit: r249134 - in stable/9/sys/cam: . scsi
Alexander Motin
mav at FreeBSD.org
Fri Apr 5 08:51:06 UTC 2013
Author: mav
Date: Fri Apr 5 08:51:05 2013
New Revision: 249134
URL: http://svnweb.freebsd.org/changeset/base/249134
Log:
MFC r237478:
Add scsi_extract_sense_ccb() -- wrapper around scsi_extract_sense_len().
It allows to remove number of duplicate checks from several places.
Modified:
stable/9/sys/cam/cam_periph.c
stable/9/sys/cam/scsi/scsi_all.c
stable/9/sys/cam/scsi/scsi_all.h
stable/9/sys/cam/scsi/scsi_cd.c
stable/9/sys/cam/scsi/scsi_da.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/cam/cam_periph.c
==============================================================================
--- stable/9/sys/cam/cam_periph.c Fri Apr 5 08:46:20 2013 (r249133)
+++ stable/9/sys/cam/cam_periph.c Fri Apr 5 08:51:05 2013 (r249134)
@@ -1155,22 +1155,15 @@ camperiphdone(struct cam_periph *periph,
union ccb *saved_ccb;
cam_status status;
struct scsi_start_stop_unit *scsi_cmd;
+ int error_code, sense_key, asc, ascq;
scsi_cmd = (struct scsi_start_stop_unit *)
&done_ccb->csio.cdb_io.cdb_bytes;
status = done_ccb->ccb_h.status;
if ((status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
- if ((status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR &&
- (status & CAM_AUTOSNS_VALID)) {
- struct scsi_sense_data *sense;
- int error_code, sense_key, asc, ascq, sense_len;
-
- sense = &done_ccb->csio.sense_data;
- sense_len = done_ccb->csio.sense_len -
- done_ccb->csio.sense_resid;
- scsi_extract_sense_len(sense, sense_len, &error_code,
- &sense_key, &asc, &ascq, /*show_errors*/ 1);
+ if (scsi_extract_sense_ccb(done_ccb,
+ &error_code, &sense_key, &asc, &ascq)) {
/*
* If the error is "invalid field in CDB",
* and the load/eject flag is set, turn the
@@ -1432,12 +1425,8 @@ camperiphscsisenseerror(union ccb *ccb,
cgd.ccb_h.func_code = XPT_GDEV_TYPE;
xpt_action((union ccb *)&cgd);
- if ((ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0)
- err_action = scsi_error_action(&ccb->csio,
- &cgd.inq_data,
- sense_flags);
- else
- err_action = SS_RETRY|SSQ_DECREMENT_COUNT|EIO;
+ err_action = scsi_error_action(&ccb->csio, &cgd.inq_data,
+ sense_flags);
error = err_action & SS_ERRMASK;
/*
Modified: stable/9/sys/cam/scsi/scsi_all.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_all.c Fri Apr 5 08:46:20 2013 (r249133)
+++ stable/9/sys/cam/scsi/scsi_all.c Fri Apr 5 08:51:05 2013 (r249134)
@@ -3005,11 +3005,10 @@ scsi_error_action(struct ccb_scsiio *csi
int error_code, sense_key, asc, ascq;
scsi_sense_action action;
- scsi_extract_sense_len(&csio->sense_data, csio->sense_len -
- csio->sense_resid, &error_code,
- &sense_key, &asc, &ascq, /*show_errors*/ 1);
-
- if ((error_code == SSD_DEFERRED_ERROR)
+ if (!scsi_extract_sense_ccb((union ccb *)csio,
+ &error_code, &sense_key, &asc, &ascq)) {
+ action = SS_RETRY | SSQ_DECREMENT_COUNT | SSQ_PRINT_SENSE | EIO;
+ } else if ((error_code == SSD_DEFERRED_ERROR)
|| (error_code == SSD_DESC_DEFERRED_ERROR)) {
/*
* XXX dufault at FreeBSD.org
@@ -4793,6 +4792,36 @@ scsi_extract_sense(struct scsi_sense_dat
}
/*
+ * Extract basic sense information from SCSI I/O CCB structure.
+ */
+int
+scsi_extract_sense_ccb(union ccb *ccb,
+ int *error_code, int *sense_key, int *asc, int *ascq)
+{
+ struct scsi_sense_data *sense_data;
+
+ /* Make sure there are some sense data we can access. */
+ if (ccb->ccb_h.func_code != XPT_SCSI_IO ||
+ (ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR ||
+ (ccb->csio.scsi_status != SCSI_STATUS_CHECK_COND) ||
+ (ccb->ccb_h.status & CAM_AUTOSNS_VALID) == 0 ||
+ (ccb->ccb_h.flags & CAM_SENSE_PHYS))
+ return (0);
+
+ if (ccb->ccb_h.flags & CAM_SENSE_PTR)
+ bcopy(&ccb->csio.sense_data, &sense_data,
+ sizeof(struct scsi_sense_data *));
+ else
+ sense_data = &ccb->csio.sense_data;
+ scsi_extract_sense_len(sense_data,
+ ccb->csio.sense_len - ccb->csio.sense_resid,
+ error_code, sense_key, asc, ascq, 1);
+ if (*error_code == -1)
+ return (0);
+ return (1);
+}
+
+/*
* Extract basic sense information. If show_errors is set, sense values
* will be set to -1 if they are not present.
*/
Modified: stable/9/sys/cam/scsi/scsi_all.h
==============================================================================
--- stable/9/sys/cam/scsi/scsi_all.h Fri Apr 5 08:46:20 2013 (r249133)
+++ stable/9/sys/cam/scsi/scsi_all.h Fri Apr 5 08:51:05 2013 (r249134)
@@ -2389,6 +2389,8 @@ int scsi_devid_match(uint8_t *rhs, size
void scsi_extract_sense(struct scsi_sense_data *sense, int *error_code,
int *sense_key, int *asc, int *ascq);
+int scsi_extract_sense_ccb(union ccb *ccb, int *error_code, int *sense_key,
+ int *asc, int *ascq);
void scsi_extract_sense_len(struct scsi_sense_data *sense,
u_int sense_len, int *error_code, int *sense_key,
int *asc, int *ascq, int show_errors);
Modified: stable/9/sys/cam/scsi/scsi_cd.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_cd.c Fri Apr 5 08:46:20 2013 (r249133)
+++ stable/9/sys/cam/scsi/scsi_cd.c Fri Apr 5 08:51:05 2013 (r249134)
@@ -1691,7 +1691,6 @@ cddone(struct cam_periph *periph, union
*/
return;
} else {
- struct scsi_sense_data *sense;
int asc, ascq;
int sense_key, error_code;
int have_sense;
@@ -1714,20 +1713,12 @@ cddone(struct cam_periph *periph, union
cgd.ccb_h.func_code = XPT_GDEV_TYPE;
xpt_action((union ccb *)&cgd);
- if (((csio->ccb_h.flags & CAM_SENSE_PHYS) != 0)
- || ((csio->ccb_h.flags & CAM_SENSE_PTR) != 0)
- || ((status & CAM_AUTOSNS_VALID) == 0))
- have_sense = FALSE;
- else
+ if (scsi_extract_sense_ccb(done_ccb,
+ &error_code, &sense_key, &asc, &ascq))
have_sense = TRUE;
+ else
+ have_sense = FALSE;
- if (have_sense) {
- sense = &csio->sense_data;
- scsi_extract_sense_len(sense,
- csio->sense_len - csio->sense_resid,
- &error_code, &sense_key, &asc,
- &ascq, /*show_errors*/ 1);
- }
/*
* Attach to anything that claims to be a
* CDROM or WORM device, as long as it
@@ -3154,7 +3145,7 @@ cderror(union ccb *ccb, u_int32_t cam_fl
{
struct cd_softc *softc;
struct cam_periph *periph;
- int error;
+ int error, error_code, sense_key, asc, ascq;
periph = xpt_path_periph(ccb->ccb_h.path);
softc = (struct cd_softc *)periph->softc;
@@ -3168,19 +3159,10 @@ cderror(union ccb *ccb, u_int32_t cam_fl
*/
if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) {
error = cd6byteworkaround(ccb);
- } else if (((ccb->ccb_h.status & CAM_STATUS_MASK) ==
- CAM_SCSI_STATUS_ERROR)
- && (ccb->ccb_h.status & CAM_AUTOSNS_VALID)
- && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND)
- && ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0)
- && ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) {
- int sense_key, error_code, asc, ascq;
-
- scsi_extract_sense_len(&ccb->csio.sense_data,
- ccb->csio.sense_len - ccb->csio.sense_resid, &error_code,
- &sense_key, &asc, &ascq, /*show_errors*/ 1);
+ } else if (scsi_extract_sense_ccb(ccb,
+ &error_code, &sense_key, &asc, &ascq)) {
if (sense_key == SSD_KEY_ILLEGAL_REQUEST)
- error = cd6byteworkaround(ccb);
+ error = cd6byteworkaround(ccb);
}
if (error == ERESTART)
Modified: stable/9/sys/cam/scsi/scsi_da.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_da.c Fri Apr 5 08:46:20 2013 (r249133)
+++ stable/9/sys/cam/scsi/scsi_da.c Fri Apr 5 08:51:05 2013 (r249134)
@@ -2299,7 +2299,6 @@ dadone(struct cam_periph *periph, union
*/
return;
} else if (error != 0) {
- struct scsi_sense_data *sense;
int asc, ascq;
int sense_key, error_code;
int have_sense;
@@ -2322,20 +2321,12 @@ dadone(struct cam_periph *periph, union
cgd.ccb_h.func_code = XPT_GDEV_TYPE;
xpt_action((union ccb *)&cgd);
- if (((csio->ccb_h.flags & CAM_SENSE_PHYS) != 0)
- || ((csio->ccb_h.flags & CAM_SENSE_PTR) != 0)
- || ((status & CAM_AUTOSNS_VALID) == 0))
- have_sense = FALSE;
- else
+ if (scsi_extract_sense_ccb(done_ccb,
+ &error_code, &sense_key, &asc, &ascq))
have_sense = TRUE;
+ else
+ have_sense = FALSE;
- if (have_sense) {
- sense = &csio->sense_data;
- scsi_extract_sense_len(sense,
- csio->sense_len - csio->sense_resid,
- &error_code, &sense_key, &asc,
- &ascq, /*show_errors*/ 1);
- }
/*
* If we tried READ CAPACITY(16) and failed,
* fallback to READ CAPACITY(10).
@@ -2473,7 +2464,7 @@ daerror(union ccb *ccb, u_int32_t cam_fl
{
struct da_softc *softc;
struct cam_periph *periph;
- int error;
+ int error, error_code, sense_key, asc, ascq;
periph = xpt_path_periph(ccb->ccb_h.path);
softc = (struct da_softc *)periph->softc;
@@ -2485,16 +2476,8 @@ daerror(union ccb *ccb, u_int32_t cam_fl
error = 0;
if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) {
error = cmd6workaround(ccb);
- } else if (((ccb->ccb_h.status & CAM_STATUS_MASK) ==
- CAM_SCSI_STATUS_ERROR)
- && (ccb->ccb_h.status & CAM_AUTOSNS_VALID)
- && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND)
- && ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0)
- && ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) {
- int sense_key, error_code, asc, ascq;
-
- scsi_extract_sense(&ccb->csio.sense_data,
- &error_code, &sense_key, &asc, &ascq);
+ } else if (scsi_extract_sense_ccb(ccb,
+ &error_code, &sense_key, &asc, &ascq)) {
if (sense_key == SSD_KEY_ILLEGAL_REQUEST)
error = cmd6workaround(ccb);
/*
More information about the svn-src-stable-9
mailing list