Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 Dec 2008 06:20:11 +0000 (UTC)
From:      Scott Long <scottl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r186371 - head/sys/cam/scsi
Message-ID:  <200812210620.mBL6KBUC025421@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812210620.mBL6KBUC025421>