Lines Matching full:cs
172 static void cfiscsi_session_terminate(struct cfiscsi_session *cs);
174 struct cfiscsi_session *cs, union ctl_io *io,
177 static void cfiscsi_data_wait_free(struct cfiscsi_session *cs,
185 static void cfiscsi_session_delete(struct cfiscsi_session *cs);
210 struct cfiscsi_session *cs; in cfiscsi_pdu_update_cmdsn() local
213 cs = PDU_SESSION(request); in cfiscsi_pdu_update_cmdsn()
221 cs->cs_timeout = 0; in cfiscsi_pdu_update_cmdsn()
247 if (atomic_fcmpset_32(&cs->cs_cmdsn, &curcmdsn, cmdsn + 1)) in cfiscsi_pdu_update_cmdsn()
257 CFISCSI_SESSION_WARN(cs, "received PDU with CmdSN %u, " in cfiscsi_pdu_update_cmdsn()
267 CFISCSI_SESSION_WARN(cs, "received PDU with CmdSN %u, " in cfiscsi_pdu_update_cmdsn()
270 cfiscsi_session_terminate(cs); in cfiscsi_pdu_update_cmdsn()
277 struct cfiscsi_session *cs; in cfiscsi_pdu_handle() local
280 cs = PDU_SESSION(request); in cfiscsi_pdu_handle()
312 CFISCSI_SESSION_WARN(cs, "received PDU with unsupported " in cfiscsi_pdu_handle()
316 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle()
325 struct cfiscsi_session *cs; in cfiscsi_receive_callback() local
327 cs = PDU_SESSION(request); in cfiscsi_receive_callback()
328 if (cs->cs_waiting_for_ctld || cs->cs_login_phase) { in cfiscsi_receive_callback()
329 if (cs->cs_login_pdu == NULL) in cfiscsi_receive_callback()
330 cs->cs_login_pdu = request; in cfiscsi_receive_callback()
333 cv_signal(&cs->cs_login_cv); in cfiscsi_receive_callback()
344 struct cfiscsi_session *cs; in cfiscsi_error_callback() local
346 cs = CONN_SESSION(ic); in cfiscsi_error_callback()
348 CFISCSI_SESSION_WARN(cs, "connection error; dropping connection"); in cfiscsi_error_callback()
349 cfiscsi_session_terminate(cs); in cfiscsi_error_callback()
355 struct cfiscsi_session *cs; in cfiscsi_pdu_prepare() local
360 cs = PDU_SESSION(response); in cfiscsi_pdu_prepare()
362 CFISCSI_SESSION_LOCK_ASSERT(cs); in cfiscsi_pdu_prepare()
399 bhssr->bhssr_statsn = htonl(cs->cs_statsn); in cfiscsi_pdu_prepare()
400 cmdsn = cs->cs_cmdsn; in cfiscsi_pdu_prepare()
403 imax(0, maxtags - cs->cs_outstanding_ctl_pdus)); in cfiscsi_pdu_prepare()
406 cs->cs_statsn++; in cfiscsi_pdu_prepare()
414 struct cfiscsi_session *cs; in cfiscsi_pdu_queue() local
416 cs = PDU_SESSION(response); in cfiscsi_pdu_queue()
418 CFISCSI_SESSION_LOCK(cs); in cfiscsi_pdu_queue()
421 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_pdu_queue()
427 struct cfiscsi_session *cs = PDU_SESSION(response); in cfiscsi_pdu_queue_cb() local
429 CFISCSI_SESSION_LOCK(cs); in cfiscsi_pdu_queue_cb()
432 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_pdu_queue_cb()
438 struct cfiscsi_session *cs; in cfiscsi_pdu_handle_nop_out() local
446 cs = PDU_SESSION(request); in cfiscsi_pdu_handle_nop_out()
462 CFISCSI_SESSION_WARN(cs, "failed to allocate memory; " in cfiscsi_pdu_handle_nop_out()
465 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_nop_out()
473 CFISCSI_SESSION_WARN(cs, "failed to allocate memory; " in cfiscsi_pdu_handle_nop_out()
477 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_nop_out()
488 CFISCSI_SESSION_WARN(cs, "failed to allocate memory; " in cfiscsi_pdu_handle_nop_out()
493 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_nop_out()
507 struct cfiscsi_session *cs; in cfiscsi_pdu_handle_scsi_command() local
511 cs = PDU_SESSION(request); in cfiscsi_pdu_handle_scsi_command()
513 //CFISCSI_SESSION_DEBUG(cs, "initiator task tag 0x%x", in cfiscsi_pdu_handle_scsi_command()
516 if (request->ip_data_len > 0 && cs->cs_immediate_data == false) { in cfiscsi_pdu_handle_scsi_command()
517 CFISCSI_SESSION_WARN(cs, "unsolicited data with " in cfiscsi_pdu_handle_scsi_command()
520 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_scsi_command()
523 io = ctl_alloc_io(cs->cs_target->ct_port.ctl_pool_ref); in cfiscsi_pdu_handle_scsi_command()
527 io->io_hdr.nexus.initid = cs->cs_ctl_initid; in cfiscsi_pdu_handle_scsi_command()
528 io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port; in cfiscsi_pdu_handle_scsi_command()
551 CFISCSI_SESSION_WARN(cs, "unhandled tag type %d", in cfiscsi_pdu_handle_scsi_command()
557 refcount_acquire(&cs->cs_outstanding_ctl_pdus); in cfiscsi_pdu_handle_scsi_command()
560 CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d; " in cfiscsi_pdu_handle_scsi_command()
563 refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_pdu_handle_scsi_command()
565 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_scsi_command()
575 struct cfiscsi_session *cs; in cfiscsi_pdu_handle_task_request() local
579 cs = PDU_SESSION(request); in cfiscsi_pdu_handle_task_request()
581 io = ctl_alloc_io(cs->cs_target->ct_port.ctl_pool_ref); in cfiscsi_pdu_handle_task_request()
585 io->io_hdr.nexus.initid = cs->cs_ctl_initid; in cfiscsi_pdu_handle_task_request()
586 io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port; in cfiscsi_pdu_handle_task_request()
593 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_ABORT_TASK"); in cfiscsi_pdu_handle_task_request()
600 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_ABORT_TASK_SET"); in cfiscsi_pdu_handle_task_request()
606 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_CLEAR_TASK_SET"); in cfiscsi_pdu_handle_task_request()
612 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_LOGICAL_UNIT_RESET"); in cfiscsi_pdu_handle_task_request()
618 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_TARGET_WARM_RESET"); in cfiscsi_pdu_handle_task_request()
624 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_TARGET_COLD_RESET"); in cfiscsi_pdu_handle_task_request()
630 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_QUERY_TASK"); in cfiscsi_pdu_handle_task_request()
637 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_QUERY_TASK_SET"); in cfiscsi_pdu_handle_task_request()
643 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_I_T_NEXUS_RESET"); in cfiscsi_pdu_handle_task_request()
649 CFISCSI_SESSION_DEBUG(cs, "BHSTMR_FUNCTION_QUERY_ASYNC_EVENT"); in cfiscsi_pdu_handle_task_request()
654 CFISCSI_SESSION_DEBUG(cs, "unsupported function 0x%x", in cfiscsi_pdu_handle_task_request()
660 CFISCSI_SESSION_WARN(cs, "failed to allocate memory; " in cfiscsi_pdu_handle_task_request()
663 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_task_request()
679 refcount_acquire(&cs->cs_outstanding_ctl_pdus); in cfiscsi_pdu_handle_task_request()
682 CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d; " in cfiscsi_pdu_handle_task_request()
685 refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_pdu_handle_task_request()
687 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_task_request()
695 struct cfiscsi_session *cs; in cfiscsi_handle_data_segment() local
701 cs = PDU_SESSION(request); in cfiscsi_handle_data_segment()
719 CFISCSI_SESSION_DEBUG(cs, "received %zd bytes out of %d", in cfiscsi_handle_data_segment()
748 CFISCSI_SESSION_WARN(cs, "received bad buffer offset %zd, " in cfiscsi_handle_data_segment()
753 cfiscsi_session_terminate(cs); in cfiscsi_handle_data_segment()
824 CFISCSI_SESSION_WARN(cs, "received too much data: got %zd bytes, " in cfiscsi_handle_data_segment()
828 cfiscsi_session_terminate(cs); in cfiscsi_handle_data_segment()
834 CFISCSI_SESSION_WARN(cs, "got the final packet without " in cfiscsi_handle_data_segment()
838 cfiscsi_session_terminate(cs); in cfiscsi_handle_data_segment()
846 CFISCSI_SESSION_WARN(cs, "got the final packet, but the " in cfiscsi_handle_data_segment()
852 cfiscsi_session_terminate(cs); in cfiscsi_handle_data_segment()
865 CFISCSI_SESSION_DEBUG(cs, "no longer expecting Data-Out with target " in cfiscsi_handle_data_segment()
879 struct cfiscsi_session *cs; in cfiscsi_pdu_handle_data_out() local
884 cs = PDU_SESSION(request); in cfiscsi_pdu_handle_data_out()
887 CFISCSI_SESSION_LOCK(cs); in cfiscsi_pdu_handle_data_out()
888 TAILQ_FOREACH(cdw, &cs->cs_waiting_for_data_out, cdw_next) { in cfiscsi_pdu_handle_data_out()
890 CFISCSI_SESSION_DEBUG(cs, "have ttt 0x%x, itt 0x%x; looking for " in cfiscsi_pdu_handle_data_out()
900 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_pdu_handle_data_out()
902 CFISCSI_SESSION_WARN(cs, "data transfer tag 0x%x, initiator task tag " in cfiscsi_pdu_handle_data_out()
906 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_data_out()
911 CFISCSI_SESSION_WARN(cs, "received Data-Out PDU with " in cfiscsi_pdu_handle_data_out()
915 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_data_out()
926 CFISCSI_SESSION_LOCK(cs); in cfiscsi_pdu_handle_data_out()
927 TAILQ_REMOVE(&cs->cs_waiting_for_data_out, cdw, cdw_next); in cfiscsi_pdu_handle_data_out()
928 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_pdu_handle_data_out()
931 cfiscsi_data_wait_free(cs, cdw); in cfiscsi_pdu_handle_data_out()
948 struct cfiscsi_session *cs; in cfiscsi_pdu_handle_logout_request() local
950 cs = PDU_SESSION(request); in cfiscsi_pdu_handle_logout_request()
957 CFISCSI_SESSION_DEBUG(cs, "failed to allocate memory"); in cfiscsi_pdu_handle_logout_request()
959 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_logout_request()
970 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_logout_request()
975 CFISCSI_SESSION_WARN(cs, in cfiscsi_pdu_handle_logout_request()
978 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_logout_request()
991 CFISCSI_SESSION_WARN(cs, "invalid reason 0%x; dropping connection", in cfiscsi_pdu_handle_logout_request()
994 cfiscsi_session_terminate(cs); in cfiscsi_pdu_handle_logout_request()
1004 struct cfiscsi_session *cs; in cfiscsi_callout() local
1006 cs = context; in cfiscsi_callout()
1008 if (cs->cs_terminating) in cfiscsi_callout()
1011 callout_schedule(&cs->cs_callout, 1 * hz); in cfiscsi_callout()
1013 atomic_add_int(&cs->cs_timeout, 1); in cfiscsi_callout()
1016 if (cs->cs_waiting_for_ctld || cs->cs_login_phase) { in cfiscsi_callout()
1017 if (login_timeout > 0 && cs->cs_timeout > login_timeout) { in cfiscsi_callout()
1018 CFISCSI_SESSION_WARN(cs, "login timed out after " in cfiscsi_callout()
1019 "%d seconds; dropping connection", cs->cs_timeout); in cfiscsi_callout()
1020 cfiscsi_session_terminate(cs); in cfiscsi_callout()
1035 cs->cs_timeout = 0; in cfiscsi_callout()
1039 if (cs->cs_timeout >= ping_timeout) { in cfiscsi_callout()
1040 CFISCSI_SESSION_WARN(cs, "no ping reply (NOP-Out) after %d seconds; " in cfiscsi_callout()
1042 cfiscsi_session_terminate(cs); in cfiscsi_callout()
1054 if (cs->cs_timeout < 2) in cfiscsi_callout()
1057 cp = icl_pdu_new(cs->cs_conn, M_NOWAIT); in cfiscsi_callout()
1059 CFISCSI_SESSION_WARN(cs, "failed to allocate memory"); in cfiscsi_callout()
1071 cfiscsi_data_wait_new(struct cfiscsi_session *cs, union ctl_io *io, in cfiscsi_data_wait_new() argument
1079 CFISCSI_SESSION_WARN(cs, in cfiscsi_data_wait_new()
1084 error = icl_conn_transfer_setup(cs->cs_conn, PRIV_REQUEST(io), io, in cfiscsi_data_wait_new()
1087 CFISCSI_SESSION_WARN(cs, in cfiscsi_data_wait_new()
1101 cfiscsi_data_wait_free(struct cfiscsi_session *cs, in cfiscsi_data_wait_free() argument
1105 icl_conn_transfer_done(cs->cs_conn, cdw->cdw_icl_prv); in cfiscsi_data_wait_free()
1110 cfiscsi_data_wait_abort(struct cfiscsi_session *cs, in cfiscsi_data_wait_abort() argument
1124 cfiscsi_data_wait_free(cs, cdw); in cfiscsi_data_wait_abort()
1129 cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) in cfiscsi_session_terminate_tasks() argument
1136 if (cs->cs_target == NULL) in cfiscsi_session_terminate_tasks()
1138 ip = icl_pdu_new(cs->cs_conn, M_WAITOK); in cfiscsi_session_terminate_tasks()
1140 io = ctl_alloc_io(cs->cs_target->ct_port.ctl_pool_ref); in cfiscsi_session_terminate_tasks()
1144 io->io_hdr.nexus.initid = cs->cs_ctl_initid; in cfiscsi_session_terminate_tasks()
1145 io->io_hdr.nexus.targ_port = cs->cs_target->ct_port.targ_port; in cfiscsi_session_terminate_tasks()
1149 wait = cs->cs_outstanding_ctl_pdus; in cfiscsi_session_terminate_tasks()
1150 refcount_acquire(&cs->cs_outstanding_ctl_pdus); in cfiscsi_session_terminate_tasks()
1153 CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d", error); in cfiscsi_session_terminate_tasks()
1154 refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_session_terminate_tasks()
1159 CFISCSI_SESSION_LOCK(cs); in cfiscsi_session_terminate_tasks()
1160 cs->cs_terminating_tasks = true; in cfiscsi_session_terminate_tasks()
1161 while ((cdw = TAILQ_FIRST(&cs->cs_waiting_for_data_out)) != NULL) { in cfiscsi_session_terminate_tasks()
1162 TAILQ_REMOVE(&cs->cs_waiting_for_data_out, cdw, cdw_next); in cfiscsi_session_terminate_tasks()
1163 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_session_terminate_tasks()
1164 cfiscsi_data_wait_abort(cs, cdw, 42); in cfiscsi_session_terminate_tasks()
1165 CFISCSI_SESSION_LOCK(cs); in cfiscsi_session_terminate_tasks()
1167 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_session_terminate_tasks()
1173 CFISCSI_SESSION_WARN(cs, in cfiscsi_session_terminate_tasks()
1176 refcount_acquire(&cs->cs_outstanding_ctl_pdus); in cfiscsi_session_terminate_tasks()
1177 last = refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_session_terminate_tasks()
1180 tsleep(__DEVOLATILE(void *, &cs->cs_outstanding_ctl_pdus), in cfiscsi_session_terminate_tasks()
1184 CFISCSI_SESSION_WARN(cs, "tasks terminated"); in cfiscsi_session_terminate_tasks()
1190 struct cfiscsi_session *cs; in cfiscsi_maintenance_thread() local
1192 cs = arg; in cfiscsi_maintenance_thread()
1195 CFISCSI_SESSION_LOCK(cs); in cfiscsi_maintenance_thread()
1196 if (cs->cs_terminating == false || cs->cs_handoff_in_progress) in cfiscsi_maintenance_thread()
1197 cv_wait(&cs->cs_maintenance_cv, &cs->cs_lock); in cfiscsi_maintenance_thread()
1198 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_maintenance_thread()
1200 if (cs->cs_terminating && cs->cs_handoff_in_progress == false) { in cfiscsi_maintenance_thread()
1207 callout_drain(&cs->cs_callout); in cfiscsi_maintenance_thread()
1208 icl_conn_close(cs->cs_conn); in cfiscsi_maintenance_thread()
1214 cfiscsi_session_terminate_tasks(cs); in cfiscsi_maintenance_thread()
1215 cfiscsi_session_delete(cs); in cfiscsi_maintenance_thread()
1219 CFISCSI_SESSION_DEBUG(cs, "nothing to do"); in cfiscsi_maintenance_thread()
1224 cfiscsi_session_terminate(struct cfiscsi_session *cs) in cfiscsi_session_terminate() argument
1227 cs->cs_terminating = true; in cfiscsi_session_terminate()
1228 cv_signal(&cs->cs_maintenance_cv); in cfiscsi_session_terminate()
1230 cv_signal(&cs->cs_login_cv); in cfiscsi_session_terminate()
1235 cfiscsi_session_register_initiator(struct cfiscsi_session *cs) in cfiscsi_session_register_initiator() argument
1241 KASSERT(cs->cs_ctl_initid == -1, ("already registered")); in cfiscsi_session_register_initiator()
1243 ct = cs->cs_target; in cfiscsi_session_register_initiator()
1244 name = strdup(cs->cs_initiator_id, M_CTL); in cfiscsi_session_register_initiator()
1247 CFISCSI_SESSION_WARN(cs, "ctl_add_initiator failed with error %d", in cfiscsi_session_register_initiator()
1249 cs->cs_ctl_initid = -1; in cfiscsi_session_register_initiator()
1252 cs->cs_ctl_initid = i; in cfiscsi_session_register_initiator()
1254 CFISCSI_SESSION_DEBUG(cs, "added initiator id %d", i); in cfiscsi_session_register_initiator()
1261 cfiscsi_session_unregister_initiator(struct cfiscsi_session *cs) in cfiscsi_session_unregister_initiator() argument
1265 if (cs->cs_ctl_initid == -1) in cfiscsi_session_unregister_initiator()
1268 error = ctl_remove_initiator(&cs->cs_target->ct_port, cs->cs_ctl_initid); in cfiscsi_session_unregister_initiator()
1270 CFISCSI_SESSION_WARN(cs, "ctl_remove_initiator failed with error %d", in cfiscsi_session_unregister_initiator()
1273 cs->cs_ctl_initid = -1; in cfiscsi_session_unregister_initiator()
1279 struct cfiscsi_session *cs; in cfiscsi_session_new() local
1282 cs = malloc(sizeof(*cs), M_CFISCSI, M_NOWAIT | M_ZERO); in cfiscsi_session_new()
1283 if (cs == NULL) { in cfiscsi_session_new()
1287 cs->cs_ctl_initid = -1; in cfiscsi_session_new()
1289 refcount_init(&cs->cs_outstanding_ctl_pdus, 0); in cfiscsi_session_new()
1290 TAILQ_INIT(&cs->cs_waiting_for_data_out); in cfiscsi_session_new()
1291 mtx_init(&cs->cs_lock, "cfiscsi_lock", NULL, MTX_DEF); in cfiscsi_session_new()
1292 cv_init(&cs->cs_maintenance_cv, "cfiscsi_mt"); in cfiscsi_session_new()
1294 cv_init(&cs->cs_login_cv, "cfiscsi_login"); in cfiscsi_session_new()
1302 cs->cs_handoff_in_progress = true; in cfiscsi_session_new()
1304 cs->cs_conn = icl_new_conn(offload, false, "cfiscsi", &cs->cs_lock); in cfiscsi_session_new()
1305 if (cs->cs_conn == NULL) { in cfiscsi_session_new()
1306 free(cs, M_CFISCSI); in cfiscsi_session_new()
1309 cs->cs_conn->ic_receive = cfiscsi_receive_callback; in cfiscsi_session_new()
1310 cs->cs_conn->ic_error = cfiscsi_error_callback; in cfiscsi_session_new()
1311 cs->cs_conn->ic_prv0 = cs; in cfiscsi_session_new()
1313 error = kthread_add(cfiscsi_maintenance_thread, cs, NULL, NULL, 0, 0, "cfiscsimt"); in cfiscsi_session_new()
1315 CFISCSI_SESSION_WARN(cs, "kthread_add(9) failed with error %d", error); in cfiscsi_session_new()
1316 free(cs, M_CFISCSI); in cfiscsi_session_new()
1321 cs->cs_id = ++softc->last_session_id; in cfiscsi_session_new()
1322 TAILQ_INSERT_TAIL(&softc->sessions, cs, cs_next); in cfiscsi_session_new()
1328 callout_init(&cs->cs_callout, 1); in cfiscsi_session_new()
1329 callout_reset(&cs->cs_callout, 1 * hz, cfiscsi_callout, cs); in cfiscsi_session_new()
1331 return (cs); in cfiscsi_session_new()
1335 cfiscsi_session_delete(struct cfiscsi_session *cs) in cfiscsi_session_delete() argument
1341 KASSERT(cs->cs_outstanding_ctl_pdus == 0, in cfiscsi_session_delete()
1343 KASSERT(TAILQ_EMPTY(&cs->cs_waiting_for_data_out), in cfiscsi_session_delete()
1347 TAILQ_REMOVE(&softc->sessions, cs, cs_next); in cfiscsi_session_delete()
1350 cfiscsi_session_unregister_initiator(cs); in cfiscsi_session_delete()
1351 if (cs->cs_target != NULL) in cfiscsi_session_delete()
1352 cfiscsi_target_release(cs->cs_target); in cfiscsi_session_delete()
1353 icl_conn_close(cs->cs_conn); in cfiscsi_session_delete()
1354 icl_conn_free(cs->cs_conn); in cfiscsi_session_delete()
1355 free(cs, M_CFISCSI); in cfiscsi_session_delete()
1403 struct cfiscsi_session *cs; in cfiscsi_accept() local
1405 cs = cfiscsi_session_new(&cfiscsi_softc, NULL); in cfiscsi_accept()
1406 if (cs == NULL) { in cfiscsi_accept()
1411 icl_conn_handoff_sock(cs->cs_conn, so); in cfiscsi_accept()
1412 cs->cs_initiator_sa = sa; in cfiscsi_accept()
1413 cs->cs_portal_id = portal_id; in cfiscsi_accept()
1414 cs->cs_handoff_in_progress = false; in cfiscsi_accept()
1415 cs->cs_waiting_for_ctld = true; in cfiscsi_accept()
1418 CFISCSI_SESSION_LOCK(cs); in cfiscsi_accept()
1423 if (cs->cs_terminating) in cfiscsi_accept()
1424 cfiscsi_session_terminate(cs); in cfiscsi_accept()
1425 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_accept()
1462 struct cfiscsi_session *cs; in cfiscsi_offline() local
1477 TAILQ_FOREACH(cs, &softc->sessions, cs_next) { in cfiscsi_offline()
1478 if (cs->cs_target == ct) in cfiscsi_offline()
1479 cfiscsi_session_terminate(cs); in cfiscsi_offline()
1481 TAILQ_FOREACH(cs, &softc->sessions, cs_next) { in cfiscsi_offline()
1482 if (cs->cs_target == ct) in cfiscsi_offline()
1485 if (cs != NULL) { in cfiscsi_offline()
1488 CFISCSI_SESSION_DEBUG(cs, in cfiscsi_offline()
1493 } while (cs != NULL && ct->ct_online == 0); in cfiscsi_offline()
1519 struct cfiscsi_session *cs, *cs2; in cfiscsi_ioctl_handoff() local
1550 TAILQ_FOREACH(cs, &cfiscsi_softc.sessions, cs_next) { in cfiscsi_ioctl_handoff()
1551 if (cs->cs_id == cihp->connection_id) in cfiscsi_ioctl_handoff()
1554 if (cs == NULL) { in cfiscsi_ioctl_handoff()
1565 cs = cfiscsi_session_new(softc, cihp->offload); in cfiscsi_ioctl_handoff()
1566 if (cs == NULL) { in cfiscsi_ioctl_handoff()
1582 cs->cs_cmdsn = cihp->cmdsn; in cfiscsi_ioctl_handoff()
1583 cs->cs_statsn = cihp->statsn; in cfiscsi_ioctl_handoff()
1584 cs->cs_conn->ic_max_recv_data_segment_length = in cfiscsi_ioctl_handoff()
1586 cs->cs_conn->ic_max_send_data_segment_length = in cfiscsi_ioctl_handoff()
1588 cs->cs_max_burst_length = cihp->max_burst_length; in cfiscsi_ioctl_handoff()
1589 cs->cs_first_burst_length = cihp->first_burst_length; in cfiscsi_ioctl_handoff()
1590 cs->cs_immediate_data = !!cihp->immediate_data; in cfiscsi_ioctl_handoff()
1592 cs->cs_conn->ic_header_crc32c = true; in cfiscsi_ioctl_handoff()
1594 cs->cs_conn->ic_data_crc32c = true; in cfiscsi_ioctl_handoff()
1596 strlcpy(cs->cs_initiator_name, in cfiscsi_ioctl_handoff()
1597 cihp->initiator_name, sizeof(cs->cs_initiator_name)); in cfiscsi_ioctl_handoff()
1598 strlcpy(cs->cs_initiator_addr, in cfiscsi_ioctl_handoff()
1599 cihp->initiator_addr, sizeof(cs->cs_initiator_addr)); in cfiscsi_ioctl_handoff()
1600 strlcpy(cs->cs_initiator_alias, in cfiscsi_ioctl_handoff()
1601 cihp->initiator_alias, sizeof(cs->cs_initiator_alias)); in cfiscsi_ioctl_handoff()
1602 memcpy(cs->cs_initiator_isid, in cfiscsi_ioctl_handoff()
1603 cihp->initiator_isid, sizeof(cs->cs_initiator_isid)); in cfiscsi_ioctl_handoff()
1604 snprintf(cs->cs_initiator_id, sizeof(cs->cs_initiator_id), in cfiscsi_ioctl_handoff()
1605 "%s,i,0x%02x%02x%02x%02x%02x%02x", cs->cs_initiator_name, in cfiscsi_ioctl_handoff()
1613 CFISCSI_SESSION_LOCK(cs); in cfiscsi_ioctl_handoff()
1614 cs->cs_handoff_in_progress = false; in cfiscsi_ioctl_handoff()
1615 cfiscsi_session_terminate(cs); in cfiscsi_ioctl_handoff()
1616 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_handoff()
1623 cs->cs_target = ct; in cfiscsi_ioctl_handoff()
1627 if (!cs->cs_terminating) { in cfiscsi_ioctl_handoff()
1630 if (cs2 != cs && cs2->cs_tasks_aborted == false && in cfiscsi_ioctl_handoff()
1631 cs->cs_target == cs2->cs_target && in cfiscsi_ioctl_handoff()
1632 strcmp(cs->cs_initiator_id, cs2->cs_initiator_id) == 0) { in cfiscsi_ioctl_handoff()
1633 if (strcmp(cs->cs_initiator_addr, in cfiscsi_ioctl_handoff()
1638 cs->cs_initiator_addr); in cfiscsi_ioctl_handoff()
1655 cfiscsi_session_register_initiator(cs); in cfiscsi_ioctl_handoff()
1660 error = icl_conn_handoff(cs->cs_conn, cihp->socket); in cfiscsi_ioctl_handoff()
1662 CFISCSI_SESSION_LOCK(cs); in cfiscsi_ioctl_handoff()
1663 cs->cs_handoff_in_progress = false; in cfiscsi_ioctl_handoff()
1664 cfiscsi_session_terminate(cs); in cfiscsi_ioctl_handoff()
1665 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_handoff()
1677 cs->cs_login_phase = false; in cfiscsi_ioctl_handoff()
1683 if (cs->cs_login_pdu != NULL) { in cfiscsi_ioctl_handoff()
1684 CFISCSI_SESSION_DEBUG(cs, "picking up first PDU"); in cfiscsi_ioctl_handoff()
1685 cfiscsi_pdu_handle(cs->cs_login_pdu); in cfiscsi_ioctl_handoff()
1686 cs->cs_login_pdu = NULL; in cfiscsi_ioctl_handoff()
1690 CFISCSI_SESSION_LOCK(cs); in cfiscsi_ioctl_handoff()
1691 cs->cs_handoff_in_progress = false; in cfiscsi_ioctl_handoff()
1696 if (cs->cs_terminating) in cfiscsi_ioctl_handoff()
1697 cfiscsi_session_terminate(cs); in cfiscsi_ioctl_handoff()
1698 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_handoff()
1707 struct cfiscsi_session *cs; in cfiscsi_ioctl_list() local
1726 TAILQ_FOREACH(cs, &softc->sessions, cs_next) { in cfiscsi_ioctl_list()
1727 if (cs->cs_target == NULL) in cfiscsi_ioctl_list()
1746 cs->cs_id, in cfiscsi_ioctl_list()
1747 cs->cs_initiator_name, cs->cs_initiator_addr, cs->cs_initiator_alias, in cfiscsi_ioctl_list()
1748 cs->cs_target->ct_name, cs->cs_target->ct_alias, in cfiscsi_ioctl_list()
1749 cs->cs_target->ct_tag, in cfiscsi_ioctl_list()
1750 cs->cs_conn->ic_header_crc32c ? "CRC32C" : "None", in cfiscsi_ioctl_list()
1751 cs->cs_conn->ic_data_crc32c ? "CRC32C" : "None", in cfiscsi_ioctl_list()
1752 cs->cs_conn->ic_max_recv_data_segment_length, in cfiscsi_ioctl_list()
1753 cs->cs_conn->ic_max_send_data_segment_length, in cfiscsi_ioctl_list()
1754 cs->cs_max_burst_length, in cfiscsi_ioctl_list()
1755 cs->cs_first_burst_length, in cfiscsi_ioctl_list()
1756 cs->cs_immediate_data, in cfiscsi_ioctl_list()
1757 cs->cs_conn->ic_iser, in cfiscsi_ioctl_list()
1758 cs->cs_conn->ic_offload); in cfiscsi_ioctl_list()
1792 struct cfiscsi_session *cs; in cfiscsi_ioctl_logout() local
1800 TAILQ_FOREACH(cs, &softc->sessions, cs_next) { in cfiscsi_ioctl_logout()
1801 if (cilp->all == 0 && cs->cs_id != cilp->connection_id && in cfiscsi_ioctl_logout()
1802 strcmp(cs->cs_initiator_name, cilp->initiator_name) != 0 && in cfiscsi_ioctl_logout()
1803 strcmp(cs->cs_initiator_addr, cilp->initiator_addr) != 0) in cfiscsi_ioctl_logout()
1806 response = icl_pdu_new(cs->cs_conn, M_NOWAIT); in cfiscsi_ioctl_logout()
1841 struct cfiscsi_session *cs; in cfiscsi_ioctl_terminate() local
1849 TAILQ_FOREACH(cs, &softc->sessions, cs_next) { in cfiscsi_ioctl_terminate()
1850 if (citp->all == 0 && cs->cs_id != citp->connection_id && in cfiscsi_ioctl_terminate()
1851 strcmp(cs->cs_initiator_name, citp->initiator_name) != 0 && in cfiscsi_ioctl_terminate()
1852 strcmp(cs->cs_initiator_addr, citp->initiator_addr) != 0) in cfiscsi_ioctl_terminate()
1855 response = icl_pdu_new(cs->cs_conn, M_NOWAIT); in cfiscsi_ioctl_terminate()
1870 cfiscsi_session_terminate(cs); in cfiscsi_ioctl_terminate()
1956 struct cfiscsi_session *cs; in cfiscsi_ioctl_accept() local
1963 TAILQ_FOREACH(cs, &cfiscsi_softc.sessions, cs_next) { in cfiscsi_ioctl_accept()
1964 if (cs->cs_waiting_for_ctld) in cfiscsi_ioctl_accept()
1967 if (cs != NULL) in cfiscsi_ioctl_accept()
1979 cs->cs_waiting_for_ctld = false; in cfiscsi_ioctl_accept()
1980 cs->cs_login_phase = true; in cfiscsi_ioctl_accept()
1982 ciap->connection_id = cs->cs_id; in cfiscsi_ioctl_accept()
1983 ciap->portal_id = cs->cs_portal_id; in cfiscsi_ioctl_accept()
1984 ciap->initiator_addrlen = cs->cs_initiator_sa->sa_len; in cfiscsi_ioctl_accept()
1985 error = copyout(cs->cs_initiator_sa, ciap->initiator_addr, in cfiscsi_ioctl_accept()
1986 cs->cs_initiator_sa->sa_len); in cfiscsi_ioctl_accept()
2001 struct cfiscsi_session *cs; in cfiscsi_ioctl_send() local
2010 TAILQ_FOREACH(cs, &cfiscsi_softc.sessions, cs_next) { in cfiscsi_ioctl_send()
2011 if (cs->cs_id == cisp->connection_id) in cfiscsi_ioctl_send()
2014 if (cs == NULL) { in cfiscsi_ioctl_send()
2023 if (cs->cs_login_phase == false) in cfiscsi_ioctl_send()
2027 if (cs->cs_terminating) { in cfiscsi_ioctl_send()
2054 ip = icl_pdu_new(cs->cs_conn, M_WAITOK); in cfiscsi_ioctl_send()
2060 CFISCSI_SESSION_LOCK(cs); in cfiscsi_ioctl_send()
2062 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_send()
2070 struct cfiscsi_session *cs; in cfiscsi_ioctl_receive() local
2078 TAILQ_FOREACH(cs, &cfiscsi_softc.sessions, cs_next) { in cfiscsi_ioctl_receive()
2079 if (cs->cs_id == cirp->connection_id) in cfiscsi_ioctl_receive()
2082 if (cs == NULL) { in cfiscsi_ioctl_receive()
2096 CFISCSI_SESSION_LOCK(cs); in cfiscsi_ioctl_receive()
2097 while (cs->cs_login_pdu == NULL && cs->cs_terminating == false) { in cfiscsi_ioctl_receive()
2098 error = cv_wait_sig(&cs->cs_login_cv, &cs->cs_lock); in cfiscsi_ioctl_receive()
2100 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_receive()
2108 if (cs->cs_terminating) { in cfiscsi_ioctl_receive()
2109 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_receive()
2115 ip = cs->cs_login_pdu; in cfiscsi_ioctl_receive()
2116 cs->cs_login_pdu = NULL; in cfiscsi_ioctl_receive()
2117 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_ioctl_receive()
2470 struct cfiscsi_session *cs; in cfiscsi_datamove_in() local
2482 cs = PDU_SESSION(request); in cfiscsi_datamove_in()
2517 CFISCSI_SESSION_DEBUG(cs, "buffer_offset = %zd, " in cfiscsi_datamove_in()
2534 if (cs->cs_conn->ic_hw_isomax != 0) in cfiscsi_datamove_in()
2535 max_send_data_segment_length = cs->cs_conn->ic_hw_isomax; in cfiscsi_datamove_in()
2538 cs->cs_conn->ic_max_send_data_segment_length; in cfiscsi_datamove_in()
2543 CFISCSI_SESSION_WARN(cs, "failed to " in cfiscsi_datamove_in()
2547 cfiscsi_session_terminate(cs); in cfiscsi_datamove_in()
2587 CFISCSI_SESSION_DEBUG(cs, "truncating from %zd " in cfiscsi_datamove_in()
2598 CFISCSI_SESSION_WARN(cs, "failed to " in cfiscsi_datamove_in()
2603 cfiscsi_session_terminate(cs); in cfiscsi_datamove_in()
2650 cs->cs_conn->ic_max_send_data_segment_length); in cfiscsi_datamove_in()
2687 cs->cs_conn->ic_max_send_data_segment_length); in cfiscsi_datamove_in()
2702 struct cfiscsi_session *cs; in cfiscsi_datamove_out() local
2713 cs = PDU_SESSION(request); in cfiscsi_datamove_out()
2733 atomic_fetchadd_32(&cs->cs_target_transfer_tag, 1); in cfiscsi_datamove_out()
2736 atomic_fetchadd_32(&cs->cs_target_transfer_tag, 1); in cfiscsi_datamove_out()
2738 cdw = cfiscsi_data_wait_new(cs, io, bhssc->bhssc_initiator_task_tag, in cfiscsi_datamove_out()
2741 CFISCSI_SESSION_WARN(cs, "failed to " in cfiscsi_datamove_out()
2745 cfiscsi_session_terminate(cs); in cfiscsi_datamove_out()
2749 CFISCSI_SESSION_DEBUG(cs, "expecting Data-Out with initiator " in cfiscsi_datamove_out()
2785 if (cs->cs_immediate_data && in cfiscsi_datamove_out()
2790 cfiscsi_data_wait_free(cs, cdw); in cfiscsi_datamove_out()
2798 cs->cs_max_burst_length); in cfiscsi_datamove_out()
2801 CFISCSI_SESSION_LOCK(cs); in cfiscsi_datamove_out()
2802 if (cs->cs_terminating_tasks) { in cfiscsi_datamove_out()
2803 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_datamove_out()
2806 __func__, io, cs)); in cfiscsi_datamove_out()
2807 CFISCSI_SESSION_WARN(cs, "aborting data_wait for aborted I/O"); in cfiscsi_datamove_out()
2808 cfiscsi_data_wait_abort(cs, cdw, 44); in cfiscsi_datamove_out()
2811 TAILQ_INSERT_TAIL(&cs->cs_waiting_for_data_out, cdw, cdw_next); in cfiscsi_datamove_out()
2812 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_datamove_out()
2820 CFISCSI_SESSION_WARN(cs, "failed to " in cfiscsi_datamove_out()
2824 cfiscsi_session_terminate(cs); in cfiscsi_datamove_out()
2880 struct cfiscsi_session *cs; in cfiscsi_scsi_command_done() local
2890 //CFISCSI_SESSION_DEBUG(cs, "initiator task tag 0x%x", in cfiscsi_scsi_command_done()
2894 cs = PDU_SESSION(request); in cfiscsi_scsi_command_done()
2895 CFISCSI_SESSION_LOCK(cs); in cfiscsi_scsi_command_done()
2896 TAILQ_FOREACH(cdw, &cs->cs_waiting_for_data_out, cdw_next) in cfiscsi_scsi_command_done()
2899 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_scsi_command_done()
2928 //CFISCSI_SESSION_DEBUG(cs, "underflow; residual count %d", in cfiscsi_scsi_command_done()
2935 //CFISCSI_SESSION_DEBUG(cs, "overflow; residual count %d", in cfiscsi_scsi_command_done()
2945 CFISCSI_SESSION_DEBUG(cs, "returning %d bytes of sense data", in cfiscsi_scsi_command_done()
2967 struct cfiscsi_session *cs, *tcs; in cfiscsi_task_management_done() local
2972 cs = PDU_SESSION(request); in cfiscsi_task_management_done()
2979 CFISCSI_SESSION_DEBUG(cs, "initiator task tag 0x%x; referenced task tag 0x%x", in cfiscsi_task_management_done()
2989 CFISCSI_SESSION_LOCK(cs); in cfiscsi_task_management_done()
2991 &cs->cs_waiting_for_data_out, cdw_next, tmpcdw) { in cfiscsi_task_management_done()
2997 CFISCSI_SESSION_DEBUG(cs, "removing csw for initiator task " in cfiscsi_task_management_done()
3000 TAILQ_REMOVE(&cs->cs_waiting_for_data_out, in cfiscsi_task_management_done()
3002 cfiscsi_data_wait_abort(cs, cdw, 43); in cfiscsi_task_management_done()
3004 CFISCSI_SESSION_UNLOCK(cs); in cfiscsi_task_management_done()
3040 softc = cs->cs_target->ct_softc; in cfiscsi_task_management_done()
3043 if (tcs->cs_target == cs->cs_target) in cfiscsi_task_management_done()
3054 struct cfiscsi_session *cs; in cfiscsi_done() local
3060 cs = PDU_SESSION(request); in cfiscsi_done()
3074 cs->cs_tasks_aborted = true; in cfiscsi_done()
3075 refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_done()
3076 wakeup(__DEVOLATILE(void *, &cs->cs_outstanding_ctl_pdus)); in cfiscsi_done()
3084 refcount_release(&cs->cs_outstanding_ctl_pdus); in cfiscsi_done()