1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-25 11:37:56 +00:00

Get rid of dead_sim. There is no way to make it work - any attempt

to actually use it would panic on mtx operation, as dead_sim doesn't
have a proper mutex.  Even if it had a properly initialized mutex,
it wouldn't have properly locked and owned one.

Reviewed by:	scottl
Approved by:	rwatson (mentor)
Sponsored by:	FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2008-12-16 16:54:51 +00:00
parent ab6ff2fee1
commit 96100101a8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186184

View File

@ -698,19 +698,6 @@ static struct cdevsw xpt_cdevsw = {
};
static void dead_sim_action(struct cam_sim *sim, union ccb *ccb);
static void dead_sim_poll(struct cam_sim *sim);
/* Dummy SIM that is used when the real one has gone. */
static struct cam_sim cam_dead_sim = {
.sim_action = dead_sim_action,
.sim_poll = dead_sim_poll,
.sim_name = "dead_sim",
};
#define SIM_DEAD(sim) ((sim) == &cam_dead_sim)
/* Storage for debugging datastructures */
#ifdef CAMDEBUG
struct cam_path *cam_dpath;
@ -3023,19 +3010,10 @@ xpt_action(union ccb *start_ccb)
case XPT_ENG_EXEC:
{
struct cam_path *path;
struct cam_sim *sim;
int runq;
path = start_ccb->ccb_h.path;
sim = path->bus->sim;
if (SIM_DEAD(sim)) {
/* The SIM has gone; just execute the CCB directly. */
cam_ccbq_send_ccb(&path->device->ccbq, start_ccb);
(*(sim->sim_action))(sim, start_ccb);
break;
}
cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb);
if (path->device->qfrozen_cnt == 0)
runq = xpt_schedule_dev_sendq(path->bus, path->device);
@ -3623,7 +3601,6 @@ void
xpt_schedule(struct cam_periph *perph, u_int32_t new_priority)
{
struct cam_ed *device;
union ccb *work_ccb;
int runq;
mtx_assert(perph->sim->mtx, MA_OWNED);
@ -3640,15 +3617,6 @@ xpt_schedule(struct cam_periph *perph, u_int32_t new_priority)
new_priority);
}
runq = 0;
} else if (SIM_DEAD(perph->path->bus->sim)) {
/* The SIM is gone so just call periph_start directly. */
work_ccb = xpt_get_ccb(perph->path->device);
if (work_ccb == NULL)
return; /* XXX */
xpt_setup_ccb(&work_ccb->ccb_h, perph->path, new_priority);
perph->pinfo.priority = new_priority;
perph->periph_start(perph, work_ccb);
return;
} else {
/* New entry on the queue */
CAM_DEBUG(perph->path, CAM_DEBUG_SUBTRACE,
@ -4372,15 +4340,8 @@ int32_t
xpt_bus_deregister(path_id_t pathid)
{
struct cam_path bus_path;
struct cam_ed *device;
struct cam_ed_qinfo *qinfo;
struct cam_devq *devq;
struct cam_periph *periph;
struct cam_sim *ccbsim;
union ccb *work_ccb;
cam_status status;
status = xpt_compile_path(&bus_path, NULL, pathid,
CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
if (status != CAM_REQ_CMP)
@ -4389,42 +4350,6 @@ xpt_bus_deregister(path_id_t pathid)
xpt_async(AC_LOST_DEVICE, &bus_path, NULL);
xpt_async(AC_PATH_DEREGISTERED, &bus_path, NULL);
/* The SIM may be gone, so use a dummy SIM for any stray operations. */
devq = bus_path.bus->sim->devq;
ccbsim = bus_path.bus->sim;
bus_path.bus->sim = &cam_dead_sim;
/* Execute any pending operations now. */
while ((qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->send_queue,
CAMQ_HEAD)) != NULL ||
(qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->alloc_queue,
CAMQ_HEAD)) != NULL) {
do {
device = qinfo->device;
work_ccb = cam_ccbq_peek_ccb(&device->ccbq, CAMQ_HEAD);
if (work_ccb != NULL) {
devq->active_dev = device;
cam_ccbq_remove_ccb(&device->ccbq, work_ccb);
cam_ccbq_send_ccb(&device->ccbq, work_ccb);
(*(ccbsim->sim_action))(ccbsim, work_ccb);
}
periph = (struct cam_periph *)camq_remove(&device->drvq,
CAMQ_HEAD);
if (periph != NULL)
xpt_schedule(periph, periph->pinfo.priority);
} while (work_ccb != NULL || periph != NULL);
}
/* Make sure all completed CCBs are processed. */
while (!TAILQ_EMPTY(&ccbsim->sim_doneq)) {
camisr_runqueue(&ccbsim->sim_doneq);
/* Repeat the async's for the benefit of any new devices. */
xpt_async(AC_LOST_DEVICE, &bus_path, NULL);
xpt_async(AC_PATH_DEREGISTERED, &bus_path, NULL);
}
/* Release the reference count held while registered. */
xpt_release_bus(bus_path.bus);
xpt_release_path(&bus_path);
@ -4982,9 +4907,6 @@ xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
struct cam_devq *devq;
cam_status status;
if (SIM_DEAD(bus->sim))
return (NULL);
/* Make space for us in the device queue on our bus */
devq = bus->sim->devq;
status = cam_devq_resize(devq, devq->alloc_queue.array_size + 1);
@ -5094,11 +5016,9 @@ xpt_release_device(struct cam_eb *bus, struct cam_et *target,
TAILQ_REMOVE(&target->ed_entries, device,links);
target->generation++;
bus->sim->max_ccbs -= device->ccbq.devq_openings;
if (!SIM_DEAD(bus->sim)) {
/* Release our slot in the devq */
devq = bus->sim->devq;
cam_devq_resize(devq, devq->alloc_queue.array_size - 1);
}
/* Release our slot in the devq */
devq = bus->sim->devq;
cam_devq_resize(devq, devq->alloc_queue.array_size - 1);
camq_fini(&device->drvq);
camq_fini(&device->ccbq.queue);
free(device, M_CAMXPT);
@ -7269,11 +7189,8 @@ camisr_runqueue(void *V_queue)
dev = ccb_h->path->device;
cam_ccbq_ccb_done(&dev->ccbq, (union ccb *)ccb_h);
if (!SIM_DEAD(ccb_h->path->bus->sim)) {
ccb_h->path->bus->sim->devq->send_active--;
ccb_h->path->bus->sim->devq->send_openings++;
}
ccb_h->path->bus->sim->devq->send_active--;
ccb_h->path->bus->sim->devq->send_openings++;
if (((dev->flags & CAM_DEV_REL_ON_COMPLETE) != 0
&& (ccb_h->status&CAM_STATUS_MASK) != CAM_REQUEUE_REQ)
@ -7317,15 +7234,3 @@ camisr_runqueue(void *V_queue)
}
}
static void
dead_sim_action(struct cam_sim *sim, union ccb *ccb)
{
ccb->ccb_h.status = CAM_DEV_NOT_THERE;
xpt_done(ccb);
}
static void
dead_sim_poll(struct cam_sim *sim)
{
}