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)
This commit is contained in:
parent
3bff27cd67
commit
92c40f40fd
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241503
@ -582,7 +582,9 @@ xptioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td
|
||||
/*
|
||||
* 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;
|
||||
|
@ -899,9 +899,10 @@ ses_path_iter_devid_callback(enc_softc_t *enc, enc_element_t *elem,
|
||||
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 *enc, enc_element_t *elem,
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user