Free the shared devq last since CAM expects it to be there if

xpt_alloc_device() gets called, which can happen during detach in
certain situations. Fixes module unload.

MFC after:	3 days
This commit is contained in:
Doug White 2005-01-10 02:34:26 +00:00
parent a3fe8ea3ed
commit f7f3c3e1a6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=139952
2 changed files with 11 additions and 5 deletions

View File

@ -139,10 +139,12 @@ amr_cam_attach(struct amr_softc *sc)
/* /*
* Allocate a devq for all our channels combined. This should * Allocate a devq for all our channels combined. This should
* allow for the maximum number of SCSI commands we will accept * allow for the maximum number of SCSI commands we will accept
* at one time. * at one time. Save the pointer in the softc so we can find it later
* during detach.
*/ */
if ((devq = cam_simq_alloc(AMR_MAX_SCSI_CMDS)) == NULL) if ((devq = cam_simq_alloc(AMR_MAX_SCSI_CMDS)) == NULL)
return(ENOMEM); return(ENOMEM);
sc->amr_cam_devq = devq;
/* /*
* Iterate over our channels, registering them with CAM * Iterate over our channels, registering them with CAM
@ -182,19 +184,22 @@ amr_cam_attach(struct amr_softc *sc)
void void
amr_cam_detach(struct amr_softc *sc) amr_cam_detach(struct amr_softc *sc)
{ {
int chn, first; int chn;
for (chn = 0, first = 1; chn < sc->amr_maxchan; chn++) { for (chn = 0; chn < sc->amr_maxchan; chn++) {
/* /*
* If a sim was allocated for this channel, free it * If a sim was allocated for this channel, free it
*/ */
if (sc->amr_cam_sim[chn] != NULL) { if (sc->amr_cam_sim[chn] != NULL) {
xpt_bus_deregister(cam_sim_path(sc->amr_cam_sim[chn])); xpt_bus_deregister(cam_sim_path(sc->amr_cam_sim[chn]));
cam_sim_free(sc->amr_cam_sim[chn], first ? TRUE : FALSE); cam_sim_free(sc->amr_cam_sim[chn], FALSE);
first = 0;
} }
} }
/* Now free the devq */
if (sc->amr_cam_devq != NULL)
cam_simq_free(sc->amr_cam_devq);
} }
/******************************************************************************** /********************************************************************************

View File

@ -202,6 +202,7 @@ struct amr_softc
/* CAM attachments for passthrough */ /* CAM attachments for passthrough */
struct cam_sim *amr_cam_sim[AMR_MAX_CHANNELS]; struct cam_sim *amr_cam_sim[AMR_MAX_CHANNELS];
TAILQ_HEAD(, ccb_hdr) amr_cam_ccbq; TAILQ_HEAD(, ccb_hdr) amr_cam_ccbq;
struct cam_devq *amr_cam_devq;
/* control device */ /* control device */
struct cdev *amr_dev_t; struct cdev *amr_dev_t;