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-all mailing list