svn commit: r254254 - projects/camlock/sys/cam/ctl
Alexander Motin
mav at FreeBSD.org
Mon Aug 12 19:42:26 UTC 2013
Author: mav
Date: Mon Aug 12 19:42:25 2013
New Revision: 254254
URL: http://svnweb.freebsd.org/changeset/base/254254
Log:
Switch CTL to the new per-device locks. I am not sure if it is completely
correct, at least lun_softc_list is not locked, but it builds and seems
like working at least locally.
Modified:
projects/camlock/sys/cam/ctl/ctl_frontend_cam_sim.c
projects/camlock/sys/cam/ctl/scsi_ctl.c
Modified: projects/camlock/sys/cam/ctl/ctl_frontend_cam_sim.c
==============================================================================
--- projects/camlock/sys/cam/ctl/ctl_frontend_cam_sim.c Mon Aug 12 19:16:55 2013 (r254253)
+++ projects/camlock/sys/cam/ctl/ctl_frontend_cam_sim.c Mon Aug 12 19:42:25 2013 (r254254)
@@ -504,14 +504,9 @@ static void
cfcs_done(union ctl_io *io)
{
union ccb *ccb;
- struct cfcs_softc *softc;
- struct cam_sim *sim;
ccb = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr;
- sim = xpt_path_sim(ccb->ccb_h.path);
- softc = (struct cfcs_softc *)cam_sim_softc(sim);
-
/*
* At this point we should have status. If we don't, that's a bug.
*/
@@ -550,10 +545,7 @@ cfcs_done(union ctl_io *io)
break;
}
- mtx_lock(sim->mtx);
xpt_done(ccb);
- mtx_unlock(sim->mtx);
-
ctl_free_io(io);
}
Modified: projects/camlock/sys/cam/ctl/scsi_ctl.c
==============================================================================
--- projects/camlock/sys/cam/ctl/scsi_ctl.c Mon Aug 12 19:16:55 2013 (r254253)
+++ projects/camlock/sys/cam/ctl/scsi_ctl.c Mon Aug 12 19:42:25 2013 (r254254)
@@ -319,7 +319,6 @@ ctlfeasync(void *callback_arg, uint32_t
#ifdef CTLFE_INIT_ENABLE
if (ctlfe_num_targets >= ctlfe_max_targets) {
union ccb *ccb;
- struct cam_sim *sim;
ccb = (union ccb *)malloc(sizeof(*ccb), M_TEMP,
M_NOWAIT | M_ZERO);
@@ -327,18 +326,12 @@ ctlfeasync(void *callback_arg, uint32_t
printf("%s: unable to malloc CCB!\n", __func__);
return;
}
- xpt_setup_ccb(&ccb->ccb_h, cpi->ccb_h.path,
- CAM_PRIORITY_NONE);
-
- sim = xpt_path_sim(cpi->ccb_h.path);
+ xpt_setup_ccb(&ccb->ccb_h, path, CAM_PRIORITY_NONE);
ccb->ccb_h.func_code = XPT_SET_SIM_KNOB;
ccb->knob.xport_specific.valid = KNOB_VALID_ROLE;
ccb->knob.xport_specific.fc.role = KNOB_ROLE_INITIATOR;
- /* We should hold the SIM lock here */
- mtx_assert(sim->mtx, MA_OWNED);
-
xpt_action(ccb);
if ((ccb->ccb_h.status & CAM_STATUS_MASK) !=
@@ -380,7 +373,7 @@ ctlfeasync(void *callback_arg, uint32_t
}
bus_softc->path_id = cpi->ccb_h.path_id;
- bus_softc->sim = xpt_path_sim(cpi->ccb_h.path);
+ bus_softc->sim = xpt_path_sim(path);
STAILQ_INIT(&bus_softc->lun_softc_list);
fe = &bus_softc->fe;
@@ -549,7 +542,8 @@ ctlferegister(struct cam_periph *periph,
TAILQ_INIT(&softc->work_queue);
softc->periph = periph;
- callout_init_mtx(&softc->dma_callout, sim->mtx, /*flags*/ 0);
+ callout_init_mtx(&softc->dma_callout, xpt_path_mtx(periph->path),
+ /*flags*/ 0);
periph->softc = softc;
xpt_setup_ccb(&en_lun_ccb.ccb_h, periph->path, CAM_PRIORITY_NONE);
@@ -1660,17 +1654,12 @@ ctlfe_onoffline(void *arg, int online)
union ccb *ccb;
cam_status status;
struct cam_path *path;
- struct cam_sim *sim;
int set_wwnn;
bus_softc = (struct ctlfe_softc *)arg;
set_wwnn = 0;
- sim = bus_softc->sim;
-
- mtx_assert(sim->mtx, MA_OWNED);
-
status = xpt_create_path(&path, /*periph*/ NULL, bus_softc->path_id,
CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
if (status != CAM_REQ_CMP) {
@@ -1835,8 +1824,6 @@ ctlfe_online(void *arg)
bus_softc = (struct ctlfe_softc *)arg;
sim = bus_softc->sim;
- CAM_SIM_LOCK(sim);
-
/*
* Create the wildcard LUN before bringing the port online.
*/
@@ -1846,7 +1833,6 @@ ctlfe_online(void *arg)
if (status != CAM_REQ_CMP) {
printf("%s: unable to create path for wildcard periph\n",
__func__);
- CAM_SIM_UNLOCK(sim);
return;
}
@@ -1856,10 +1842,10 @@ ctlfe_online(void *arg)
xpt_print(path, "%s: unable to allocate softc for "
"wildcard periph\n", __func__);
xpt_free_path(path);
- CAM_SIM_UNLOCK(sim);
return;
}
+ xpt_path_lock(path);
lun_softc->parent_softc = bus_softc;
lun_softc->flags |= CTLFE_LUN_WILDCARD;
@@ -1887,11 +1873,10 @@ ctlfe_online(void *arg)
entry->status_text : "Unknown", status);
}
- xpt_free_path(path);
-
ctlfe_onoffline(arg, /*online*/ 1);
- CAM_SIM_UNLOCK(sim);
+ xpt_path_unlock(path);
+ xpt_free_path(path);
}
static void
@@ -1906,10 +1891,6 @@ ctlfe_offline(void *arg)
bus_softc = (struct ctlfe_softc *)arg;
sim = bus_softc->sim;
- CAM_SIM_LOCK(sim);
-
- ctlfe_onoffline(arg, /*online*/ 0);
-
/*
* Disable the wildcard LUN for this port now that we have taken
* the port offline.
@@ -1924,13 +1905,15 @@ ctlfe_offline(void *arg)
return;
}
+ xpt_path_lock(path);
+
+ ctlfe_onoffline(arg, /*online*/ 0);
if ((periph = cam_periph_find(path, "ctl")) != NULL)
cam_periph_invalidate(periph);
+ xpt_path_unlock(path);
xpt_free_path(path);
-
- CAM_SIM_UNLOCK(sim);
}
static int
@@ -1973,13 +1956,13 @@ ctlfe_lun_enable(void *arg, struct ctl_i
}
softc = malloc(sizeof(*softc), M_CTLFE, M_WAITOK | M_ZERO);
- CAM_SIM_LOCK(sim);
+ xpt_path_lock(path);
periph = cam_periph_find(path, "ctl");
if (periph != NULL) {
/* We've already got a periph, no need to alloc a new one. */
+ xpt_path_unlock(path);
xpt_free_path(path);
free(softc, M_CTLFE);
- CAM_SIM_UNLOCK(sim);
return (0);
}
@@ -1997,10 +1980,8 @@ ctlfe_lun_enable(void *arg, struct ctl_i
0,
softc);
+ xpt_path_unlock(path);
xpt_free_path(path);
-
- CAM_SIM_UNLOCK(sim);
-
return (0);
}
@@ -2018,7 +1999,6 @@ ctlfe_lun_disable(void *arg, struct ctl_
softc = (struct ctlfe_softc *)arg;
sim = softc->sim;
- CAM_SIM_LOCK(sim);
STAILQ_FOREACH(lun_softc, &softc->lun_softc_list, links) {
struct cam_path *path;
@@ -2030,16 +2010,14 @@ ctlfe_lun_disable(void *arg, struct ctl_
}
}
if (lun_softc == NULL) {
- CAM_SIM_UNLOCK(sim);
printf("%s: can't find target %d lun %d\n", __func__,
targ_id.id, lun_id);
return (1);
}
+ cam_periph_lock(lun_softc->periph);
cam_periph_invalidate(lun_softc->periph);
-
- CAM_SIM_UNLOCK(sim);
-
+ cam_periph_unlock(lun_softc->periph);
return (0);
}
@@ -2180,17 +2158,13 @@ static void
ctlfe_datamove_done(union ctl_io *io)
{
union ccb *ccb;
- struct cam_sim *sim;
struct cam_periph *periph;
struct ctlfe_lun_softc *softc;
ccb = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr;
- sim = xpt_path_sim(ccb->ccb_h.path);
-
- CAM_SIM_LOCK(sim);
-
periph = xpt_path_periph(ccb->ccb_h.path);
+ cam_periph_lock(periph);
softc = (struct ctlfe_lun_softc *)periph->softc;
@@ -2235,7 +2209,7 @@ ctlfe_datamove_done(union ctl_io *io)
xpt_schedule(periph, /*priority*/ 1);
}
- CAM_SIM_UNLOCK(sim);
+ cam_periph_unlock(periph);
}
static void
More information about the svn-src-projects
mailing list