Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/iscsi/iscsi.c
Show First 20 Lines • Show All 285 Lines • ▼ Show 20 Lines | iscsi_session_logout(struct iscsi_session *is) | ||||
bhslr = (struct iscsi_bhs_logout_request *)request->ip_bhs; | bhslr = (struct iscsi_bhs_logout_request *)request->ip_bhs; | ||||
bhslr->bhslr_opcode = ISCSI_BHS_OPCODE_LOGOUT_REQUEST; | bhslr->bhslr_opcode = ISCSI_BHS_OPCODE_LOGOUT_REQUEST; | ||||
bhslr->bhslr_reason = BHSLR_REASON_CLOSE_SESSION; | bhslr->bhslr_reason = BHSLR_REASON_CLOSE_SESSION; | ||||
iscsi_pdu_queue_locked(request); | iscsi_pdu_queue_locked(request); | ||||
} | } | ||||
static void | static void | ||||
iscsi_session_terminate_task(struct iscsi_session *is, | iscsi_session_terminate_task(struct iscsi_session *is, | ||||
struct iscsi_outstanding *io, bool requeue) | struct iscsi_outstanding *io, cam_status status) | ||||
{ | { | ||||
ISCSI_SESSION_LOCK_ASSERT(is); | ISCSI_SESSION_LOCK_ASSERT(is); | ||||
if (io->io_ccb != NULL) { | if (io->io_ccb != NULL) { | ||||
io->io_ccb->ccb_h.status &= ~(CAM_SIM_QUEUED | CAM_STATUS_MASK); | io->io_ccb->ccb_h.status &= ~(CAM_SIM_QUEUED | CAM_STATUS_MASK); | ||||
if (requeue) | io->io_ccb->ccb_h.status |= status; | ||||
io->io_ccb->ccb_h.status |= CAM_REQUEUE_REQ; | |||||
else | |||||
io->io_ccb->ccb_h.status |= CAM_REQ_ABORTED; | |||||
if ((io->io_ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { | if ((io->io_ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { | ||||
io->io_ccb->ccb_h.status |= CAM_DEV_QFRZN; | io->io_ccb->ccb_h.status |= CAM_DEV_QFRZN; | ||||
xpt_freeze_devq(io->io_ccb->ccb_h.path, 1); | xpt_freeze_devq(io->io_ccb->ccb_h.path, 1); | ||||
ISCSI_SESSION_DEBUG(is, "freezing devq"); | ISCSI_SESSION_DEBUG(is, "freezing devq"); | ||||
} | } | ||||
xpt_done(io->io_ccb); | xpt_done(io->io_ccb); | ||||
} | } | ||||
iscsi_outstanding_remove(is, io); | iscsi_outstanding_remove(is, io); | ||||
} | } | ||||
static void | static void | ||||
iscsi_session_terminate_tasks(struct iscsi_session *is, bool requeue) | iscsi_session_terminate_tasks(struct iscsi_session *is, cam_status status) | ||||
{ | { | ||||
struct iscsi_outstanding *io, *tmp; | struct iscsi_outstanding *io, *tmp; | ||||
ISCSI_SESSION_LOCK_ASSERT(is); | ISCSI_SESSION_LOCK_ASSERT(is); | ||||
TAILQ_FOREACH_SAFE(io, &is->is_outstanding, io_next, tmp) { | TAILQ_FOREACH_SAFE(io, &is->is_outstanding, io_next, tmp) { | ||||
iscsi_session_terminate_task(is, io, requeue); | iscsi_session_terminate_task(is, io, status); | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
iscsi_session_cleanup(struct iscsi_session *is, bool destroy_sim) | iscsi_session_cleanup(struct iscsi_session *is, bool destroy_sim) | ||||
{ | { | ||||
struct icl_pdu *pdu; | struct icl_pdu *pdu; | ||||
Show All 17 Lines | while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) { | ||||
STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); | STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); | ||||
icl_pdu_free(pdu); | icl_pdu_free(pdu); | ||||
} | } | ||||
if (destroy_sim == false) { | if (destroy_sim == false) { | ||||
/* | /* | ||||
* Terminate SCSI tasks, asking CAM to requeue them. | * Terminate SCSI tasks, asking CAM to requeue them. | ||||
*/ | */ | ||||
iscsi_session_terminate_tasks(is, true); | iscsi_session_terminate_tasks(is, CAM_REQUEUE_REQ); | ||||
return; | return; | ||||
} | } | ||||
iscsi_session_terminate_tasks(is, false); | iscsi_session_terminate_tasks(is, CAM_DEV_NOT_THERE); | ||||
if (is->is_sim == NULL) | if (is->is_sim == NULL) | ||||
return; | return; | ||||
ISCSI_SESSION_DEBUG(is, "deregistering SIM"); | ISCSI_SESSION_DEBUG(is, "deregistering SIM"); | ||||
xpt_async(AC_LOST_DEVICE, is->is_path, NULL); | xpt_async(AC_LOST_DEVICE, is->is_path, NULL); | ||||
if (is->is_simq_frozen) { | if (is->is_simq_frozen) { | ||||
▲ Show 20 Lines • Show All 646 Lines • ▼ Show 20 Lines | iscsi_pdu_handle_task_response(struct icl_pdu *response) | ||||
} | } | ||||
if (bhstmr->bhstmr_response != BHSTMR_RESPONSE_FUNCTION_COMPLETE) { | if (bhstmr->bhstmr_response != BHSTMR_RESPONSE_FUNCTION_COMPLETE) { | ||||
ISCSI_SESSION_WARN(is, "task response 0x%x", | ISCSI_SESSION_WARN(is, "task response 0x%x", | ||||
bhstmr->bhstmr_response); | bhstmr->bhstmr_response); | ||||
} else { | } else { | ||||
aio = iscsi_outstanding_find(is, io->io_datasn); | aio = iscsi_outstanding_find(is, io->io_datasn); | ||||
if (aio != NULL && aio->io_ccb != NULL) | if (aio != NULL && aio->io_ccb != NULL) | ||||
iscsi_session_terminate_task(is, aio, false); | iscsi_session_terminate_task(is, aio, CAM_REQ_ABORTED); | ||||
} | } | ||||
iscsi_outstanding_remove(is, io); | iscsi_outstanding_remove(is, io); | ||||
icl_pdu_free(response); | icl_pdu_free(response); | ||||
} | } | ||||
static void | static void | ||||
iscsi_pdu_handle_data_in(struct icl_pdu *response) | iscsi_pdu_handle_data_in(struct icl_pdu *response) | ||||
▲ Show 20 Lines • Show All 1,538 Lines • Show Last 20 Lines |