summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>1999-01-07 20:20:57 +0000
committermjacob <mjacob@FreeBSD.org>1999-01-07 20:20:57 +0000
commit4cb6632c89aa14d9544a8ffe3e463e6e21aec1f3 (patch)
tree1c6aa9912cd5a294a1c6adf828e2fcaca70e8cd1 /sys/cam
parent7511ca39c2727f7557d9bf659180888f03736488 (diff)
downloadFreeBSD-src-4cb6632c89aa14d9544a8ffe3e463e6e21aec1f3.zip
FreeBSD-src-4cb6632c89aa14d9544a8ffe3e463e6e21aec1f3.tar.gz
Like the problems just fixed in scsi_da.c, make sure
to release the probe ccb before taking down the periph. Also, don't do cdscheduling if you're not going to attach the device after all. Reviewed by: ken@freebsd.org
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/scsi/scsi_cd.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index 56f8785..486bbe3 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: scsi_cd.c,v 1.10 1998/12/04 22:54:43 archie Exp $
+ * $Id: scsi_cd.c,v 1.11 1998/12/22 20:05:22 eivind Exp $
*/
/*
* Portions of this driver taken from the original FreeBSD cd driver.
@@ -1813,14 +1813,23 @@ cddone(struct cam_periph *periph, union ccb *done_ccb)
}
}
free(rdcap, M_TEMP);
- if (announce_buf[0] != '\0')
+ if (announce_buf[0] != '\0') {
xpt_announce_periph(periph, announce_buf);
+ if (softc->flags & CD_FLAG_CHANGER)
+ cdchangerschedule(softc);
+ }
softc->state = CD_STATE_NORMAL;
- if (softc->flags & CD_FLAG_CHANGER)
- cdchangerschedule(softc);
+ /*
+ * Since our peripheral may be invalidated by an error
+ * above or an external event, we must release our CCB
+ * before releasing the probe lock on the peripheral.
+ * The peripheral will only go away once the last lock
+ * is removed, and we need it around for the CCB release
+ * operation.
+ */
+ xpt_release_ccb(done_ccb);
cam_periph_unlock(periph);
-
- break;
+ return;
}
case CD_CCB_WAITING:
{
@@ -1831,6 +1840,8 @@ cddone(struct cam_periph *periph, union ccb *done_ccb)
wakeup(&done_ccb->ccb_h.cbfcnp);
return;
}
+ default:
+ break;
}
xpt_release_ccb(done_ccb);
}
OpenPOWER on IntegriCloud