svn commit: r186371 - head/sys/cam/scsi
Scott Long
scottl at FreeBSD.org
Sun Dec 21 06:20:11 UTC 2008
Author: scottl
Date: Sun Dec 21 06:20:11 2008
New Revision: 186371
URL: http://svn.freebsd.org/changeset/base/186371
Log:
Fix refcount locking in cd, pass, and sg periphs.
Modified:
head/sys/cam/scsi/scsi_cd.c
head/sys/cam/scsi/scsi_pass.c
head/sys/cam/scsi/scsi_sg.c
Modified: head/sys/cam/scsi/scsi_cd.c
==============================================================================
--- head/sys/cam/scsi/scsi_cd.c Sun Dec 21 04:40:02 2008 (r186370)
+++ head/sys/cam/scsi/scsi_cd.c Sun Dec 21 06:20:11 2008 (r186371)
@@ -996,12 +996,6 @@ cdopen(struct disk *dp)
return (error);
}
- /* Closes aren't symmetrical with opens, so fix up the refcounting. */
- if (softc->flags & CD_FLAG_OPEN)
- cam_periph_release(periph);
- else
- softc->flags |= CD_FLAG_OPEN;
-
/*
* Check for media, and set the appropriate flags. We don't bail
* if we don't have media, but then we don't allow anything but the
@@ -1011,7 +1005,15 @@ cdopen(struct disk *dp)
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n"));
cam_periph_unhold(periph);
- cam_periph_unlock(periph);
+
+ /* Closes aren't symmetrical with opens, so fix up the refcounting. */
+ if ((softc->flags & CD_FLAG_OPEN) == 0) {
+ softc->flags |= CD_FLAG_OPEN;
+ cam_periph_unlock(periph);
+ } else {
+ cam_periph_unlock(periph);
+ cam_periph_release(periph);
+ }
return (0);
}
Modified: head/sys/cam/scsi/scsi_pass.c
==============================================================================
--- head/sys/cam/scsi/scsi_pass.c Sun Dec 21 04:40:02 2008 (r186370)
+++ head/sys/cam/scsi/scsi_pass.c Sun Dec 21 06:20:11 2008 (r186371)
@@ -346,13 +346,13 @@ passopen(struct cdev *dev, int flags, in
if ((softc->flags & PASS_FLAG_OPEN) == 0) {
softc->flags |= PASS_FLAG_OPEN;
+ cam_periph_unlock(periph);
} else {
/* Device closes aren't symmertical, so fix up the refcount */
+ cam_periph_unlock(periph);
cam_periph_release(periph);
}
- cam_periph_unlock(periph);
-
return (error);
}
Modified: head/sys/cam/scsi/scsi_sg.c
==============================================================================
--- head/sys/cam/scsi/scsi_sg.c Sun Dec 21 04:40:02 2008 (r186370)
+++ head/sys/cam/scsi/scsi_sg.c Sun Dec 21 06:20:11 2008 (r186371)
@@ -399,13 +399,13 @@ sgopen(struct cdev *dev, int flags, int
if ((softc->flags & SG_FLAG_OPEN) == 0) {
softc->flags |= SG_FLAG_OPEN;
+ cam_periph_unlock(periph);
} else {
/* Device closes aren't symmetrical, fix up the refcount. */
+ cam_periph_unlock(periph);
cam_periph_release(periph);
}
- cam_periph_unlock(periph);
-
return (error);
}
More information about the svn-src-head
mailing list