svn commit: r186319 - in head/sys/cam: . scsi

Edward Tomasz Napierala trasz at FreeBSD.org
Fri Dec 19 14:31:41 UTC 2008


Author: trasz
Date: Fri Dec 19 14:31:40 2008
New Revision: 186319
URL: http://svn.freebsd.org/changeset/base/186319

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

Modified:
  head/sys/cam/cam_periph.c
  head/sys/cam/cam_periph.h
  head/sys/cam/cam_xpt.c
  head/sys/cam/scsi/scsi_da.c

Modified: head/sys/cam/cam_periph.c
==============================================================================
--- head/sys/cam/cam_periph.c	Fri Dec 19 14:27:10 2008	(r186318)
+++ head/sys/cam/cam_periph.c	Fri Dec 19 14:31:40 2008	(r186319)
@@ -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: head/sys/cam/cam_periph.h
==============================================================================
--- head/sys/cam/cam_periph.h	Fri Dec 19 14:27:10 2008	(r186318)
+++ head/sys/cam/cam_periph.h	Fri Dec 19 14:31:40 2008	(r186319)
@@ -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: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c	Fri Dec 19 14:27:10 2008	(r186318)
+++ head/sys/cam/cam_xpt.c	Fri Dec 19 14:31:40 2008	(r186319)
@@ -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: head/sys/cam/scsi/scsi_da.c
==============================================================================
--- head/sys/cam/scsi/scsi_da.c	Fri Dec 19 14:27:10 2008	(r186318)
+++ head/sys/cam/scsi/scsi_da.c	Fri Dec 19 14:31:40 2008	(r186319)
@@ -772,8 +772,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-head mailing list