diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -166,6 +166,7 @@ struct cam_doneq { struct mtx_padalign cam_doneq_mtx; STAILQ_HEAD(, ccb_hdr) cam_doneq; + STAILQ_HEAD(, ccb_hdr) tmp; int cam_doneq_sleep; }; @@ -954,6 +955,7 @@ mtx_init(&cam_doneqs[i].cam_doneq_mtx, "CAM doneq", NULL, MTX_DEF); STAILQ_INIT(&cam_doneqs[i].cam_doneq); + STAILQ_INIT(&cam_doneqs[i].tmp); error = kproc_kthread_add(xpt_done_td, &cam_doneqs[i], &cam_proc, NULL, 0, 0, "cam", "doneq%d", i); if (error != 0) { @@ -5384,19 +5386,18 @@ { struct cam_doneq *queue = arg; struct ccb_hdr *ccb_h; - STAILQ_HEAD(, ccb_hdr) doneq; - STAILQ_INIT(&doneq); + STAILQ_INIT(&queue->tmp); mtx_lock(&queue->cam_doneq_mtx); while (1) { while (STAILQ_EMPTY(&queue->cam_doneq)) msleep(&queue->cam_doneq, &queue->cam_doneq_mtx, PRIBIO, "-", 0); - STAILQ_CONCAT(&doneq, &queue->cam_doneq); + STAILQ_CONCAT(&queue->tmp, &queue->cam_doneq); mtx_unlock(&queue->cam_doneq_mtx); - while ((ccb_h = STAILQ_FIRST(&doneq)) != NULL) { - STAILQ_REMOVE_HEAD(&doneq, sim_links.stqe); + while ((ccb_h = STAILQ_FIRST(&queue->tmp)) != NULL) { + STAILQ_REMOVE_HEAD(&queue->tmp, sim_links.stqe); xpt_done_process(ccb_h); } @@ -5409,9 +5410,8 @@ { struct cam_doneq *queue = arg; struct ccb_hdr *ccb_h; - STAILQ_HEAD(, ccb_hdr) doneq; - STAILQ_INIT(&doneq); + STAILQ_INIT(&queue->tmp); mtx_lock(&queue->cam_doneq_mtx); while (1) { while (STAILQ_EMPTY(&queue->cam_doneq)) { @@ -5420,12 +5420,12 @@ PRIBIO, "-", 0); queue->cam_doneq_sleep = 0; } - STAILQ_CONCAT(&doneq, &queue->cam_doneq); + STAILQ_CONCAT(&queue->tmp, &queue->cam_doneq); mtx_unlock(&queue->cam_doneq_mtx); THREAD_NO_SLEEPING(); - while ((ccb_h = STAILQ_FIRST(&doneq)) != NULL) { - STAILQ_REMOVE_HEAD(&doneq, sim_links.stqe); + while ((ccb_h = STAILQ_FIRST(&queue->tmp)) != NULL) { + STAILQ_REMOVE_HEAD(&queue->tmp, sim_links.stqe); xpt_done_process(ccb_h); } THREAD_SLEEPING_OK();