svn commit: r189147 - in stable/7/sys: . cam cam/scsi contrib/pf dev/cxgb

Edward Tomasz Napierala trasz at FreeBSD.org
Sat Feb 28 02:33:01 PST 2009


Author: trasz
Date: Sat Feb 28 10:33:00 2009
New Revision: 189147
URL: http://svn.freebsd.org/changeset/base/189147

Log:
  MFC r186319:
  
  Periph driver fixes, second try.
  
  Reviewed by:	scottl
  Approved by:	rwatson (mentor)
  Sponsored by:	FreeBSD Foundation

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/cam/cam_periph.c
  stable/7/sys/cam/cam_periph.h
  stable/7/sys/cam/cam_xpt.c
  stable/7/sys/cam/scsi/scsi_da.c
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)

Modified: stable/7/sys/cam/cam_periph.c
==============================================================================
--- stable/7/sys/cam/cam_periph.c	Sat Feb 28 10:29:55 2009	(r189146)
+++ stable/7/sys/cam/cam_periph.c	Sat Feb 28 10:33:00 2009	(r189147)
@@ -290,7 +290,7 @@ cam_periph_acquire(struct cam_periph *pe
 }
 
 void
-cam_periph_release(struct cam_periph *periph)
+cam_periph_release_locked(struct cam_periph *periph)
 {
 
 	if (periph == NULL)
@@ -302,7 +302,21 @@ cam_periph_release(struct cam_periph *pe
 		camperiphfree(periph);
 	}
 	xpt_unlock_buses();
+}
+
+void
+cam_periph_release(struct cam_periph *periph)
+{
+	struct cam_sim *sim;
 
+	if (periph == NULL)
+		return;
+	
+	sim = periph->sim;
+	mtx_assert(sim->mtx, MA_NOTOWNED);
+	mtx_lock(sim->mtx);
+	cam_periph_release_locked(periph);
+	mtx_unlock(sim->mtx);
 }
 
 int
@@ -329,7 +343,7 @@ cam_periph_hold(struct cam_periph *perip
 	while ((periph->flags & CAM_PERIPH_LOCKED) != 0) {
 		periph->flags |= CAM_PERIPH_LOCK_WANTED;
 		if ((error = msleep(periph, mtx, priority, "caplck", 0)) != 0) {
-			cam_periph_release(periph);
+			cam_periph_release_locked(periph);
 			return (error);
 		}
 	}
@@ -350,7 +364,7 @@ cam_periph_unhold(struct cam_periph *per
 		wakeup(periph);
 	}
 
-	cam_periph_release(periph);
+	cam_periph_release_locked(periph);
 }
 
 /*

Modified: stable/7/sys/cam/cam_periph.h
==============================================================================
--- stable/7/sys/cam/cam_periph.h	Sat Feb 28 10:29:55 2009	(r189146)
+++ stable/7/sys/cam/cam_periph.h	Sat Feb 28 10:33:00 2009	(r189147)
@@ -141,6 +141,7 @@ cam_status cam_periph_alloc(periph_ctor_
 struct cam_periph *cam_periph_find(struct cam_path *path, char *name);
 cam_status	cam_periph_acquire(struct cam_periph *periph);
 void		cam_periph_release(struct cam_periph *periph);
+void		cam_periph_release_locked(struct cam_periph *periph);
 int		cam_periph_hold(struct cam_periph *periph, int priority);
 void		cam_periph_unhold(struct cam_periph *periph);
 void		cam_periph_invalidate(struct cam_periph *periph);

Modified: stable/7/sys/cam/cam_xpt.c
==============================================================================
--- stable/7/sys/cam/cam_xpt.c	Sat Feb 28 10:29:55 2009	(r189146)
+++ stable/7/sys/cam/cam_xpt.c	Sat Feb 28 10:33:00 2009	(r189147)
@@ -6314,7 +6314,7 @@ probedone(struct cam_periph *periph, uni
 	xpt_done(done_ccb);
 	if (TAILQ_FIRST(&softc->request_ccbs) == NULL) {
 		cam_periph_invalidate(periph);
-		cam_periph_release(periph);
+		cam_periph_release_locked(periph);
 	} else {
 		probeschedule(periph);
 	}

Modified: stable/7/sys/cam/scsi/scsi_da.c
==============================================================================
--- stable/7/sys/cam/scsi/scsi_da.c	Sat Feb 28 10:29:55 2009	(r189146)
+++ stable/7/sys/cam/scsi/scsi_da.c	Sat Feb 28 10:33:00 2009	(r189147)
@@ -771,8 +771,8 @@ daclose(struct disk *dp)
 
 	softc->flags &= ~DA_FLAG_OPEN;
 	cam_periph_unhold(periph);
-	cam_periph_release(periph);
 	cam_periph_unlock(periph);
+	cam_periph_release(periph);
 	return (0);	
 }
 


More information about the svn-src-all mailing list