PERFORCE change 99735 for review

Scott Long scottl at FreeBSD.org
Wed Jun 21 08:29:38 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=99735

Change 99735 by scottl at scottl-wv1u on 2006/06/21 08:29:14

	CAM_PERIPH_LOCK/CAM_PERIPH_UNLOCK are used to take the SIM lock in
	the periph.  Also fix a mistake with the order of locking in the
	close routines.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#8 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#12 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pass.c#10 edit
.. //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#8 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/cam_periph.h#8 (text+ko) ====

@@ -126,6 +126,9 @@
 
 #define CAM_PERIPH_MAXMAPS	2
 
+#define CAM_PERIPH_LOCK(periph)		mtx_lock((periph)->sim->mtx)
+#define CAM_PERIPH_UNLOCK(periph)	mtx_unlock((periph)->sim->mtx)
+
 struct cam_periph_map_info {
 	int		num_bufs_used;
 	struct buf	*bp[CAM_PERIPH_MAXMAPS];

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_da.c#12 (text+ko) ====

@@ -540,7 +540,7 @@
 		return (error); /* error code from tsleep */
 
 	if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		return(ENXIO);
 	}
 
@@ -658,8 +658,8 @@
 	}
 
 	softc->flags &= ~DA_FLAG_OPEN;
+	cam_periph_release(periph);
 	cam_periph_unlock(periph);
-	cam_periph_release(periph);
 	return (0);	
 }
 
@@ -682,7 +682,7 @@
 	}
 	softc = (struct da_softc *)periph->softc;
 
-	mtx_lock(periph->sim->mtx);
+	CAM_PERIPH_LOCK(periph);
 
 #if 0
 	/*
@@ -703,7 +703,7 @@
 	 */
 	if ((softc->flags & DA_FLAG_PACK_INVALID)) {
 		splx(s);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		biofinish(bp, NULL, ENXIO);
 		return;
 	}
@@ -719,7 +719,7 @@
 	 * Schedule ourselves for performing the work.
 	 */
 	xpt_schedule(periph, /* XXX priority */1);
-	mtx_unlock(periph->sim->mtx);
+	CAM_PERIPH_UNLOCK(periph);
 
 	return;
 }

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_pass.c#10 (text+ko) ====

@@ -409,8 +409,8 @@
 	softc = (struct pass_softc *)periph->softc;
 	softc->flags &= ~PASS_FLAG_OPEN;
 
+	cam_periph_release(periph);
 	cam_periph_unlock(periph);
-	cam_periph_release(periph);
 
 	return (0);
 }
@@ -464,8 +464,8 @@
 	if (periph == NULL)
 		return(ENXIO);
 
+	CAM_PERIPH_LOCK(periph);
 	softc = (struct pass_softc *)periph->softc;
-	mtx_lock(periph->sim->mtx);
 
 	error = 0;
 
@@ -532,7 +532,7 @@
 		break;
 	}
 
-	mtx_unlock(periph->sim->mtx);
+	CAM_PERIPH_UNLOCK(periph);
 	return(error);
 }
 

==== //depot/projects/scottl-camlock/src/sys/cam/scsi/scsi_ses.c#8 (text+ko) ====

@@ -483,8 +483,8 @@
 	softc = (struct ses_softc *)periph->softc;
 	softc->ses_flags &= ~SES_FLAG_OPEN;
 
+	cam_periph_release(periph);
 	cam_periph_unlock(periph);
-	cam_periph_release(periph);
 
 	return (0);
 }
@@ -542,17 +542,17 @@
 
 	CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering sesioctl\n"));
 
-	mtx_lock(periph->sim->mtx);
+	CAM_PERIPH_LOCK(periph);
 	ssc = (struct ses_softc *)periph->softc;
 
 	/*
 	 * Now check to see whether we're initialized or not.
 	 */
 	if ((ssc->ses_flags & SES_FLAG_INITIALIZED) == 0) {
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		return (ENXIO);
 	}
-	mtx_unlock(periph->sim->mtx);
+	CAM_PERIPH_UNLOCK(periph);
 
 	error = 0;
 
@@ -586,30 +586,30 @@
 		 * XXX Dropping the lock while copying multiple segments is
 		 * bogus.
 		 */
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		for (uobj = addr, i = 0; i != ssc->ses_nobjects; i++, uobj++) {
 			obj.obj_id = i;
 			obj.subencid = ssc->ses_objmap[i].subenclosure;
 			obj.object_type = ssc->ses_objmap[i].enctype;
-			mtx_unlock(periph->sim->mtx);
+			CAM_PERIPH_UNLOCK(periph);
 			error = copyout(&obj, uobj, sizeof (ses_object));
-			mtx_lock(periph->sim->mtx);
+			CAM_PERIPH_LOCK(periph);
 			if (error) {
 				break;
 			}
 		}
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		break;
 
 	case SESIOC_GETENCSTAT:
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = (*ssc->ses_vec.get_encstat)(ssc, 1);
 		if (error) {
-			mtx_unlock(periph->sim->mtx);
+			CAM_PERIPH_UNLOCK(periph);
 			break;
 		}
 		tmp = ssc->ses_encstat & ~ENCI_SVALID;
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		error = copyout(&tmp, addr, sizeof (ses_encstat));
 		ssc->ses_encstat = tmp;
 		break;
@@ -618,9 +618,9 @@
 		error = copyin(addr, &tmp, sizeof (ses_encstat));
 		if (error)
 			break;
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = (*ssc->ses_vec.set_encstat)(ssc, tmp, 1);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		break;
 
 	case SESIOC_GETOBJSTAT:
@@ -631,9 +631,9 @@
 			error = EINVAL;
 			break;
 		}
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = (*ssc->ses_vec.get_objstat)(ssc, &objs, 1);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		if (error)
 			break;
 		error = copyout(&objs, addr, sizeof (ses_objstat));
@@ -652,9 +652,9 @@
 			error = EINVAL;
 			break;
 		}
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = (*ssc->ses_vec.set_objstat)(ssc, &objs, 1);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 
 		/*
 		 * Always (for now) invalidate entry.
@@ -664,15 +664,15 @@
 
 	case SESIOC_INIT:
 
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = (*ssc->ses_vec.init_enc)(ssc);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		break;
 
 	default:
-		mtx_lock(periph->sim->mtx);
+		CAM_PERIPH_LOCK(periph);
 		error = cam_periph_ioctl(periph, cmd, arg_addr, seserror);
-		mtx_unlock(periph->sim->mtx);
+		CAM_PERIPH_UNLOCK(periph);
 		break;
 	}
 	return (error);


More information about the p4-projects mailing list