Changeset View
Changeset View
Standalone View
Standalone View
sys/cam/ctl/ctl_frontend_iscsi.c
Show First 20 Lines • Show All 1,149 Lines • ▼ Show 20 Lines | cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) | ||||
error = ctl_run(io); | error = ctl_run(io); | ||||
if (error != CTL_RETVAL_COMPLETE) { | if (error != CTL_RETVAL_COMPLETE) { | ||||
CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d", error); | CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d", error); | ||||
refcount_release(&cs->cs_outstanding_ctl_pdus); | refcount_release(&cs->cs_outstanding_ctl_pdus); | ||||
ctl_free_io(io); | ctl_free_io(io); | ||||
} | } | ||||
CFISCSI_SESSION_LOCK(cs); | CFISCSI_SESSION_LOCK(cs); | ||||
cs->cs_terminating_tasks = true; | |||||
while ((cdw = TAILQ_FIRST(&cs->cs_waiting_for_data_out)) != NULL) { | while ((cdw = TAILQ_FIRST(&cs->cs_waiting_for_data_out)) != NULL) { | ||||
TAILQ_REMOVE(&cs->cs_waiting_for_data_out, cdw, cdw_next); | TAILQ_REMOVE(&cs->cs_waiting_for_data_out, cdw, cdw_next); | ||||
CFISCSI_SESSION_UNLOCK(cs); | CFISCSI_SESSION_UNLOCK(cs); | ||||
cfiscsi_data_wait_abort(cs, cdw, 42); | cfiscsi_data_wait_abort(cs, cdw, 42); | ||||
CFISCSI_SESSION_LOCK(cs); | CFISCSI_SESSION_LOCK(cs); | ||||
} | } | ||||
CFISCSI_SESSION_UNLOCK(cs); | CFISCSI_SESSION_UNLOCK(cs); | ||||
▲ Show 20 Lines • Show All 1,612 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
r2t_off = io->scsiio.kern_rel_offset + io->scsiio.ext_data_filled; | r2t_off = io->scsiio.kern_rel_offset + io->scsiio.ext_data_filled; | ||||
r2t_len = MIN(datamove_len - io->scsiio.ext_data_filled, | r2t_len = MIN(datamove_len - io->scsiio.ext_data_filled, | ||||
cs->cs_max_burst_length); | cs->cs_max_burst_length); | ||||
cdw->cdw_r2t_end = io->scsiio.ext_data_filled + r2t_len; | cdw->cdw_r2t_end = io->scsiio.ext_data_filled + r2t_len; | ||||
CFISCSI_SESSION_LOCK(cs); | CFISCSI_SESSION_LOCK(cs); | ||||
if (cs->cs_terminating) { | if (cs->cs_terminating_tasks) { | ||||
CFISCSI_SESSION_UNLOCK(cs); | CFISCSI_SESSION_UNLOCK(cs); | ||||
KASSERT((io->io_hdr.flags & CTL_FLAG_ABORT) != 0, | |||||
("%s: I/O request %p on termating session %p not aborted", | |||||
__func__, io, cs)); | |||||
CFISCSI_SESSION_WARN(cs, "aborting data_wait for aborted I/O"); | |||||
jhb: We may not need this warning, but for testing purposes at least I want to see if this case… | |||||
cfiscsi_data_wait_abort(cs, cdw, 44); | cfiscsi_data_wait_abort(cs, cdw, 44); | ||||
return; | return; | ||||
} | } | ||||
TAILQ_INSERT_TAIL(&cs->cs_waiting_for_data_out, cdw, cdw_next); | TAILQ_INSERT_TAIL(&cs->cs_waiting_for_data_out, cdw, cdw_next); | ||||
CFISCSI_SESSION_UNLOCK(cs); | CFISCSI_SESSION_UNLOCK(cs); | ||||
/* | /* | ||||
* XXX: We should limit the number of outstanding R2T PDUs | * XXX: We should limit the number of outstanding R2T PDUs | ||||
▲ Show 20 Lines • Show All 273 Lines • Show Last 20 Lines |
We may not need this warning, but for testing purposes at least I want to see if this case fires during testing.