[Midnightbsd-cvs] src [8247] trunk/sys/cam/cam_xpt.c: fix xpt debug

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sat Sep 17 17:33:52 EDT 2016


Revision: 8247
          http://svnweb.midnightbsd.org/src/?rev=8247
Author:   laffer1
Date:     2016-09-17 17:33:52 -0400 (Sat, 17 Sep 2016)
Log Message:
-----------
fix xpt debug

Modified Paths:
--------------
    trunk/sys/cam/cam_xpt.c

Modified: trunk/sys/cam/cam_xpt.c
===================================================================
--- trunk/sys/cam/cam_xpt.c	2016-09-17 21:33:33 UTC (rev 8246)
+++ trunk/sys/cam/cam_xpt.c	2016-09-17 21:33:52 UTC (rev 8247)
@@ -533,9 +533,9 @@
 			xpt_merge_ccb(&ccb, inccb);
 			ccb.ccb_h.cbfcnp = xptdone;
 			xpt_action(&ccb);
-			CAM_SIM_UNLOCK(bus->sim);
 			bcopy(&ccb, inccb, sizeof(union ccb));
 			xpt_free_path(ccb.ccb_h.path);
+			CAM_SIM_UNLOCK(bus->sim);
 			break;
 
 		}
@@ -2981,6 +2981,9 @@
 		break;
 	}
 	case XPT_DEBUG: {
+		struct cam_path *oldpath;
+		struct cam_sim *oldsim;
+
 		/* Check that all request bits are supported. */
 		if (start_ccb->cdbg.flags & ~(CAM_DEBUG_COMPILE)) {
 			start_ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
@@ -2987,12 +2990,19 @@
 			break;
 		}
 
-		cam_dflags = start_ccb->cdbg.flags;
+		cam_dflags = CAM_DEBUG_NONE;
 		if (cam_dpath != NULL) {
-			xpt_free_path(cam_dpath);
+			/* To release the old path we must hold proper lock. */
+			oldpath = cam_dpath;
 			cam_dpath = NULL;
+			oldsim = xpt_path_sim(oldpath);
+			CAM_SIM_UNLOCK(xpt_path_sim(start_ccb->ccb_h.path));
+			CAM_SIM_LOCK(oldsim);
+			xpt_free_path(oldpath);
+			CAM_SIM_UNLOCK(oldsim);
+			CAM_SIM_LOCK(xpt_path_sim(start_ccb->ccb_h.path));
 		}
-		if (cam_dflags != CAM_DEBUG_NONE) {
+		if (start_ccb->cdbg.flags != CAM_DEBUG_NONE) {
 			if (xpt_create_path(&cam_dpath, xpt_periph,
 					    start_ccb->ccb_h.path_id,
 					    start_ccb->ccb_h.target_id,
@@ -2999,16 +3009,14 @@
 					    start_ccb->ccb_h.target_lun) !=
 					    CAM_REQ_CMP) {
 				start_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
-				cam_dflags = CAM_DEBUG_NONE;
 			} else {
+				cam_dflags = start_ccb->cdbg.flags;
 				start_ccb->ccb_h.status = CAM_REQ_CMP;
 				xpt_print(cam_dpath, "debugging flags now %x\n",
 				    cam_dflags);
 			}
-		} else {
-			cam_dpath = NULL;
+		} else
 			start_ccb->ccb_h.status = CAM_REQ_CMP;
-		}
 		break;
 	}
 	case XPT_FREEZE_QUEUE:



More information about the Midnightbsd-cvs mailing list