Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Nov 2002 22:38:17 +0300
From:      Yar Tikhiy <yar@freebsd.org>
To:        Nate Lawson <nate@root.org>
Cc:        freebsd-scsi@freebsd.org
Subject:   Re: {da,sa,...}open bug?
Message-ID:  <20021129223817.D34288@comp.chem.msu.su>
In-Reply-To: <Pine.BSF.4.21.0211251208350.83036-100000@root.org>; from nate@root.org on Mon, Nov 25, 2002 at 12:10:14PM -0800
References:  <20021125134302.D14452@comp.chem.msu.su> <Pine.BSF.4.21.0211251208350.83036-100000@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 25, 2002 at 12:10:14PM -0800, Nate Lawson wrote:
> On Mon, 25 Nov 2002, Yar Tikhiy wrote:
> 
> > While preparing the fix, I noticed an additional couple of oddities.
> > First, files under sys/cam/scsi are inconsistent as to the order of
> > calling cam_periph_release() and cam_periph_unlock():  Some of them
> > will call cam_periph_release() first, and the others will call it second.
> > Then, there's a number of places in the code where cam_periph_unlock()
> > won't be called before return on a cam_periph_acquire() error, though
> > the "periph" has been locked.
> 
> I think this should be fixed.  Please submit a patch for this.

Here it is.  It a) reorders unlock()'s and release()'s where
necessary, b) adds missing unlock()'s, and finally c) changes
"return(error)" to "return(0)" where "error" will be always 0.
The latter is essentially a style fix, but it is important
WRT the discussed necessity to release a peripheral on errors.
Having no "if (error) cam_periph_release(periph)" before such
returns would be confusing.

To Nate: If the patch looks good to you, please just say OK, and
I'll do the dirty work of obtaining the high approval and committing.

-- 
Yar

Index: scsi_cd.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_cd.c,v
retrieving revision 1.68
diff -u -r1.68 scsi_cd.c
--- scsi_cd.c	23 Nov 2002 22:51:50 -0000	1.68
+++ scsi_cd.c	29 Nov 2002 19:16:19 -0000
@@ -903,16 +903,18 @@
 
 	splx(s);
 
-	if (cam_periph_acquire(periph) != CAM_REQ_CMP)
+	if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
+		cam_periph_unlock(periph);
 		return(ENXIO);
+	}
 
 	cdprevent(periph, PR_PREVENT);
 
 	/* find out the size */
 	if ((error = cdsize(dev, &size)) != 0) {
 		cdprevent(periph, PR_ALLOW);
-		cam_periph_unlock(periph);
 		cam_periph_release(periph);
+		cam_periph_unlock(periph);
 		return(error);
 	}
 
@@ -931,7 +933,7 @@
 
 	CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n"));
 
-	return (error);
+	return (0);
 }
 
 static int
@@ -959,8 +961,8 @@
 	 */
 	softc->device_stats.flags |= DEVSTAT_BS_UNAVAILABLE;
 
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 
 	return (0);
 }
Index: scsi_ch.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_ch.c,v
retrieving revision 1.31
diff -u -r1.31 scsi_ch.c
--- scsi_ch.c	28 Sep 2002 17:14:05 -0000	1.31
+++ scsi_ch.c	29 Nov 2002 19:16:19 -0000
@@ -438,8 +438,10 @@
 	splx(s);
 
 	if ((softc->flags & CH_FLAG_OPEN) == 0) {
-		if (cam_periph_acquire(periph) != CAM_REQ_CMP)
+		if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
+			cam_periph_unlock(periph);
 			return(ENXIO);
+		}
 		softc->flags |= CH_FLAG_OPEN;
 	}
 
@@ -448,14 +450,14 @@
 	 */
 	if ((error = chgetparams(periph)) != 0) {
 		softc->flags &= ~CH_FLAG_OPEN;
-		cam_periph_unlock(periph);
 		cam_periph_release(periph);
+		cam_periph_unlock(periph);
 		return(error);
 	}
 
 	cam_periph_unlock(periph);
 
-	return(error);
+	return(0);
 }
 
 static int
@@ -478,8 +480,8 @@
 
 	softc->flags &= ~CH_FLAG_OPEN;
 
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 
 	return(0);
 }
Index: scsi_da.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_da.c,v
retrieving revision 1.116
diff -u -r1.116 scsi_da.c
--- scsi_da.c	29 Nov 2002 15:40:10 -0000	1.116
+++ scsi_da.c	29 Nov 2002 19:16:20 -0000
@@ -545,8 +545,10 @@
 	if ((error = cam_periph_lock(periph, PRIBIO|PCATCH)) != 0)
 		return (error); /* error code from tsleep */
 
-	if (cam_periph_acquire(periph) != CAM_REQ_CMP)
+	if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
+		cam_periph_unlock(periph);
 		return(ENXIO);
+	}
 	softc->flags |= DA_FLAG_OPEN;
 
 	if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) {
@@ -696,8 +698,8 @@
 	}
 
 	softc->flags &= ~DA_FLAG_OPEN;
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 	return (0);	
 }
 
Index: scsi_pass.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_pass.c,v
retrieving revision 1.34
diff -u -r1.34 scsi_pass.c
--- scsi_pass.c	15 Aug 2002 20:54:03 -0000	1.34
+++ scsi_pass.c	29 Nov 2002 19:16:20 -0000
@@ -384,14 +384,16 @@
 	splx(s);
 
 	if ((softc->flags & PASS_FLAG_OPEN) == 0) {
-		if (cam_periph_acquire(periph) != CAM_REQ_CMP)
+		if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
+			cam_periph_unlock(periph);
 			return(ENXIO);
+		}
 		softc->flags |= PASS_FLAG_OPEN;
 	}
 
 	cam_periph_unlock(periph);
 
-	return (error);
+	return (0);
 }
 
 static int
@@ -412,8 +414,8 @@
 
 	softc->flags &= ~PASS_FLAG_OPEN;
 
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 
 	return (0);
 }
Index: scsi_pt.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_pt.c,v
retrieving revision 1.33
diff -u -r1.33 scsi_pt.c
--- scsi_pt.c	15 Aug 2002 20:54:03 -0000	1.33
+++ scsi_pt.c	29 Nov 2002 19:16:20 -0000
@@ -198,8 +198,8 @@
 		return (error); /* error code from tsleep */
 
 	softc->flags &= ~PT_FLAG_OPEN;
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 	return (0);
 }
 
Index: scsi_sa.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_sa.c,v
retrieving revision 1.84
diff -u -r1.84 scsi_sa.c
--- scsi_sa.c	14 Nov 2002 05:03:11 -0000	1.84
+++ scsi_sa.c	29 Nov 2002 19:16:20 -0000
@@ -640,8 +640,8 @@
 	if ((softc->flags & SA_FLAG_TAPE_MOUNTED) == 0)
 		sareservereleaseunit(periph, FALSE);
 
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 
 	return (error);	
 }
Index: scsi_ses.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_ses.c,v
retrieving revision 1.23
diff -u -r1.23 scsi_ses.c
--- scsi_ses.c	9 Nov 2002 12:55:04 -0000	1.23
+++ scsi_ses.c	29 Nov 2002 19:16:21 -0000
@@ -488,8 +488,8 @@
 
 	softc->ses_flags &= ~SES_FLAG_OPEN;
 
-	cam_periph_unlock(periph);
 	cam_periph_release(periph);
+	cam_periph_unlock(periph);
 
 	return (0);
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-scsi" in the body of the message




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