summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-09-15 10:42:53 +0000
committermav <mav@FreeBSD.org>2015-09-15 10:42:53 +0000
commitff7a796ad382ea9465896e2f9d64e83646f5c579 (patch)
treecf51350f3b8361a3e493fb18cdb25c115bf5f0aa /sys/cam
parent6bfadefc076393364413af87908f25ac5734d6ae (diff)
downloadFreeBSD-src-ff7a796ad382ea9465896e2f9d64e83646f5c579.zip
FreeBSD-src-ff7a796ad382ea9465896e2f9d64e83646f5c579.tar.gz
Fix completion/error status reporting.
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/ctl/ctl_frontend_cam_sim.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/cam/ctl/ctl_frontend_cam_sim.c b/sys/cam/ctl/ctl_frontend_cam_sim.c
index f0a8b7a..5423a17 100644
--- a/sys/cam/ctl/ctl_frontend_cam_sim.c
+++ b/sys/cam/ctl/ctl_frontend_cam_sim.c
@@ -438,7 +438,8 @@ cfcs_datamove(union ctl_io *io)
if ((io->io_hdr.status & CTL_STATUS_MASK) == CTL_SUCCESS) {
io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = NULL;
io->io_hdr.flags |= CTL_FLAG_STATUS_SENT;
- ccb->ccb_h.status = CAM_REQ_CMP;
+ ccb->ccb_h.status &= ~CAM_STATUS_MASK;
+ ccb->ccb_h.status |= CAM_REQ_CMP;
xpt_done(ccb);
}
@@ -465,12 +466,13 @@ cfcs_done(union ctl_io *io)
/*
* Translate CTL status to CAM status.
*/
+ ccb->ccb_h.status &= ~CAM_STATUS_MASK;
switch (io->io_hdr.status & CTL_STATUS_MASK) {
case CTL_SUCCESS:
- ccb->ccb_h.status = CAM_REQ_CMP;
+ ccb->ccb_h.status |= CAM_REQ_CMP;
break;
case CTL_SCSI_ERROR:
- ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
+ ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
ccb->csio.scsi_status = io->scsiio.scsi_status;
bcopy(&io->scsiio.sense_data, &ccb->csio.sense_data,
min(io->scsiio.sense_len, ccb->csio.sense_len));
@@ -486,14 +488,18 @@ cfcs_done(union ctl_io *io)
}
break;
case CTL_CMD_ABORTED:
- ccb->ccb_h.status = CAM_REQ_ABORTED;
+ ccb->ccb_h.status |= CAM_REQ_ABORTED;
break;
case CTL_ERROR:
default:
- ccb->ccb_h.status = CAM_REQ_CMP_ERR;
+ ccb->ccb_h.status |= CAM_REQ_CMP_ERR;
break;
}
-
+ if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP &&
+ (ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) {
+ xpt_freeze_devq(ccb->ccb_h.path, 1);
+ ccb->ccb_h.status |= CAM_DEV_QFRZN;
+ }
xpt_done(ccb);
ctl_free_io(io);
}
OpenPOWER on IntegriCloud