svn commit: r189241 - in stable/7/sys: . cam/scsi contrib/pf
dev/cxgb
Scott Long
scottl at FreeBSD.org
Sun Mar 1 08:28:18 PST 2009
Author: scottl
Date: Sun Mar 1 16:28:17 2009
New Revision: 189241
URL: http://svn.freebsd.org/changeset/base/189241
Log:
Merge 186371: Fix refcount locking in cd, pass, and sg periphs.
Modified:
stable/7/sys/ (props changed)
stable/7/sys/cam/scsi/scsi_cd.c
stable/7/sys/cam/scsi/scsi_pass.c
stable/7/sys/cam/scsi/scsi_sg.c
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
Modified: stable/7/sys/cam/scsi/scsi_cd.c
==============================================================================
--- stable/7/sys/cam/scsi/scsi_cd.c Sun Mar 1 16:26:38 2009 (r189240)
+++ stable/7/sys/cam/scsi/scsi_cd.c Sun Mar 1 16:28:17 2009 (r189241)
@@ -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: stable/7/sys/cam/scsi/scsi_pass.c
==============================================================================
--- stable/7/sys/cam/scsi/scsi_pass.c Sun Mar 1 16:26:38 2009 (r189240)
+++ stable/7/sys/cam/scsi/scsi_pass.c Sun Mar 1 16:28:17 2009 (r189241)
@@ -345,13 +345,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: stable/7/sys/cam/scsi/scsi_sg.c
==============================================================================
--- stable/7/sys/cam/scsi/scsi_sg.c Sun Mar 1 16:26:38 2009 (r189240)
+++ stable/7/sys/cam/scsi/scsi_sg.c Sun Mar 1 16:28:17 2009 (r189241)
@@ -400,13 +400,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-stable
mailing list