Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Oct 2012 10:18:36 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241503 - in head/sys/cam: . scsi
Message-ID:  <201210131018.q9DAIarq091884@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Oct 13 10:18:36 2012
New Revision: 241503
URL: http://svn.freebsd.org/changeset/base/241503

Log:
  XPT_DEV_MATCH is probably the only xpt_action() method that is called
  without holding SIM lock. It really doesn't need that lock, but adding it
  removes that specific exception, allowing to assert locking there later.
  
  Submitted by:	ken@ (earlier version)

Modified:
  head/sys/cam/cam_xpt.c
  head/sys/cam/scsi/scsi_enc_ses.c

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c	Sat Oct 13 09:31:01 2012	(r241502)
+++ head/sys/cam/cam_xpt.c	Sat Oct 13 10:18:36 2012	(r241503)
@@ -582,7 +582,9 @@ xptioctl(struct cdev *dev, u_long cmd, c
 			/*
 			 * This is an immediate CCB, we can send it on directly.
 			 */
+			CAM_SIM_LOCK(xpt_path_sim(xpt_periph->path));
 			xpt_action(inccb);
+			CAM_SIM_UNLOCK(xpt_path_sim(xpt_periph->path));
 
 			/*
 			 * Map the buffers back into user space.
@@ -2818,6 +2820,11 @@ xpt_action_default(union ccb *start_ccb)
 				position_type = CAM_DEV_POS_PDRV;
 		}
 
+		/*
+		 * Note that we drop the SIM lock here, because the EDT
+		 * traversal code needs to do its own locking.
+		 */
+		CAM_SIM_UNLOCK(xpt_path_sim(cdm->ccb_h.path));
 		switch(position_type & CAM_DEV_POS_TYPEMASK) {
 		case CAM_DEV_POS_EDT:
 			xptedtmatch(cdm);
@@ -2829,6 +2836,7 @@ xpt_action_default(union ccb *start_ccb)
 			cdm->status = CAM_DEV_MATCH_ERROR;
 			break;
 		}
+		CAM_SIM_LOCK(xpt_path_sim(cdm->ccb_h.path));
 
 		if (cdm->status == CAM_DEV_MATCH_ERROR)
 			start_ccb->ccb_h.status = CAM_REQ_CMP_ERR;

Modified: head/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- head/sys/cam/scsi/scsi_enc_ses.c	Sat Oct 13 09:31:01 2012	(r241502)
+++ head/sys/cam/scsi/scsi_enc_ses.c	Sat Oct 13 10:18:36 2012	(r241503)
@@ -899,9 +899,10 @@ ses_path_iter_devid_callback(enc_softc_t
 	       device_pattern->data.devid_pat.id_len);
 
 	memset(&cdm, 0, sizeof(cdm));
-	if (xpt_create_path(&cdm.ccb_h.path, /*periph*/NULL, CAM_XPT_PATH_ID,
-			    CAM_TARGET_WILDCARD,
-			    CAM_LUN_WILDCARD) != CAM_REQ_CMP)
+	if (xpt_create_path_unlocked(&cdm.ccb_h.path, /*periph*/NULL,
+				     CAM_XPT_PATH_ID,
+				     CAM_TARGET_WILDCARD,
+				     CAM_LUN_WILDCARD) != CAM_REQ_CMP)
 		return;
 
 	cdm.ccb_h.func_code = XPT_DEV_MATCH;
@@ -911,8 +912,11 @@ ses_path_iter_devid_callback(enc_softc_t
 	cdm.match_buf_len   = sizeof(match_result);
 	cdm.matches         = &match_result;
 
+	sim = xpt_path_sim(cdm.ccb_h.path);
+	CAM_SIM_LOCK(sim);
 	xpt_action((union ccb *)&cdm);
 	xpt_free_path(cdm.ccb_h.path);
+	CAM_SIM_UNLOCK(sim);
 
 	if ((cdm.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP
 	 || (cdm.status != CAM_DEV_MATCH_LAST



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