Author: mav
Date: Wed Feb  6 22:22:15 2013
New Revision: 246438
URL: http://svnweb.freebsd.org/changeset/base/246438

Log:
  MFC r241503:
  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.

Modified:
  stable/9/sys/cam/cam_xpt.c
  stable/9/sys/cam/scsi/scsi_enc_ses.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/cam/cam_xpt.c
==============================================================================
--- stable/9/sys/cam/cam_xpt.c  Wed Feb  6 22:07:38 2013        (r246437)
+++ stable/9/sys/cam/cam_xpt.c  Wed Feb  6 22:22:15 2013        (r246438)
@@ -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.
@@ -2815,6 +2817,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);
@@ -2826,6 +2833,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: stable/9/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_enc_ses.c        Wed Feb  6 22:07:38 2013        
(r246437)
+++ stable/9/sys/cam/scsi/scsi_enc_ses.c        Wed Feb  6 22:22:15 2013        
(r246438)
@@ -901,9 +901,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;
@@ -913,8 +914,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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to