Author: mav
Date: Tue Sep 15 10:42:53 2015
New Revision: 287818
URL: https://svnweb.freebsd.org/changeset/base/287818

Log:
  Fix completion/error status reporting.

Modified:
  head/sys/cam/ctl/ctl_frontend_cam_sim.c

Modified: head/sys/cam/ctl/ctl_frontend_cam_sim.c
==============================================================================
--- head/sys/cam/ctl/ctl_frontend_cam_sim.c     Tue Sep 15 09:59:13 2015        
(r287817)
+++ head/sys/cam/ctl/ctl_frontend_cam_sim.c     Tue Sep 15 10:42:53 2015        
(r287818)
@@ -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);
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to