svn commit: r203863 - stable/8/sys/dev/ciss

Alexander Motin mav at FreeBSD.org
Sun Feb 14 12:03:05 UTC 2010


Author: mav
Date: Sun Feb 14 12:03:04 2010
New Revision: 203863
URL: http://svn.freebsd.org/changeset/base/203863

Log:
  MFC r203489:
  Return CAM_RELEASE_SIMQ flag only when it is needed, when SIM really
  was frozen before and should be released.

Modified:
  stable/8/sys/dev/ciss/ciss.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/netinet/   (props changed)

Modified: stable/8/sys/dev/ciss/ciss.c
==============================================================================
--- stable/8/sys/dev/ciss/ciss.c	Sun Feb 14 12:00:42 2010	(r203862)
+++ stable/8/sys/dev/ciss/ciss.c	Sun Feb 14 12:03:04 2010	(r203863)
@@ -3101,6 +3101,7 @@ ciss_cam_action_io(struct cam_sim *sim, 
      */
     if ((error = ciss_get_request(sc, &cr)) != 0) {
 	xpt_freeze_simq(sim, 1);
+	csio->ccb_h.status |= CAM_RELEASE_SIMQ;
 	csio->ccb_h.status |= CAM_REQUEUE_REQ;
 	return(error);
     }
@@ -3152,8 +3153,8 @@ ciss_cam_action_io(struct cam_sim *sim, 
      */
     if ((error = ciss_start(cr)) != 0) {
 	xpt_freeze_simq(sim, 1);
+	csio->ccb_h.status |= CAM_RELEASE_SIMQ;
 	if (error == EINPROGRESS) {
-	    csio->ccb_h.status |= CAM_RELEASE_SIMQ;
 	    error = 0;
 	} else {
 	    csio->ccb_h.status |= CAM_REQUEUE_REQ;
@@ -3181,7 +3182,7 @@ ciss_cam_emulate(struct ciss_softc *sc, 
 
     if (CISS_IS_PHYSICAL(bus)) {
 	if (sc->ciss_physical[CISS_CAM_TO_PBUS(bus)][target].cp_online != 1) {
-	    csio->ccb_h.status = CAM_SEL_TIMEOUT;
+	    csio->ccb_h.status |= CAM_SEL_TIMEOUT;
 	    xpt_done((union ccb *)csio);
 	    return(1);
 	} else
@@ -3194,7 +3195,7 @@ ciss_cam_emulate(struct ciss_softc *sc, 
      * Other errors might be better.
      */
     if (sc->ciss_logical[bus][target].cl_status != CISS_LD_ONLINE) {
-	csio->ccb_h.status = CAM_SEL_TIMEOUT;
+	csio->ccb_h.status |= CAM_SEL_TIMEOUT;
 	xpt_done((union ccb *)csio);
 	return(1);
     }
@@ -3208,7 +3209,7 @@ ciss_cam_emulate(struct ciss_softc *sc, 
 	if (((csio->ccb_h.flags & CAM_CDB_POINTER) ?
 	     *(u_int8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes[0]) == SYNCHRONIZE_CACHE) {
 	    ciss_flush_adapter(sc);
-	    csio->ccb_h.status = CAM_REQ_CMP;
+	    csio->ccb_h.status |= CAM_REQ_CMP;
 	    xpt_done((union ccb *)csio);
 	    return(1);
 	}
@@ -3269,13 +3270,13 @@ ciss_cam_complete(struct ciss_request *c
 	/* no status due to adapter error */
     case -1:
 	debug(0, "adapter error");
-	csio->ccb_h.status = CAM_REQ_CMP_ERR;
+	csio->ccb_h.status |= CAM_REQ_CMP_ERR;
 	break;
 
 	/* no status due to command completed OK */
     case SCSI_STATUS_OK:		/* CISS_SCSI_STATUS_GOOD */
 	debug(2, "SCSI_STATUS_OK");
-	csio->ccb_h.status = CAM_REQ_CMP;
+	csio->ccb_h.status |= CAM_REQ_CMP;
 	break;
 
 	/* check condition, sense data included */
@@ -3286,7 +3287,7 @@ ciss_cam_complete(struct ciss_request *c
 	bcopy(&ce->sense_info[0], &csio->sense_data, ce->sense_length);
 	csio->sense_len = ce->sense_length;
 	csio->resid = ce->residual_count;
-	csio->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
+	csio->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
 #ifdef CISS_DEBUG
 	{
 	    struct scsi_sense_data	*sns = (struct scsi_sense_data *)&ce->sense_info[0];
@@ -3297,21 +3298,18 @@ ciss_cam_complete(struct ciss_request *c
 
     case SCSI_STATUS_BUSY:		/* CISS_SCSI_STATUS_BUSY */
 	debug(0, "SCSI_STATUS_BUSY");
-	csio->ccb_h.status = CAM_SCSI_BUSY;
+	csio->ccb_h.status |= CAM_SCSI_BUSY;
 	break;
 
     default:
 	debug(0, "unknown status 0x%x", csio->scsi_status);
-	csio->ccb_h.status = CAM_REQ_CMP_ERR;
+	csio->ccb_h.status |= CAM_REQ_CMP_ERR;
 	break;
     }
 
     /* handle post-command fixup */
     ciss_cam_complete_fixup(sc, csio);
 
-    /* tell CAM we're ready for more commands */
-    csio->ccb_h.status |= CAM_RELEASE_SIMQ;
-
     ciss_release_request(cr);
     xpt_done((union ccb *)csio);
 }


More information about the svn-src-all mailing list