Lines Matching refs:is
190 static void iscsi_session_reconnect(struct iscsi_session *is);
191 static void iscsi_session_terminate(struct iscsi_session *is);
193 static struct iscsi_outstanding *iscsi_outstanding_find(struct iscsi_session *is,
195 static struct iscsi_outstanding *iscsi_outstanding_add(struct iscsi_session *is,
198 static void iscsi_outstanding_remove(struct iscsi_session *is,
204 struct iscsi_session *is; in iscsi_pdu_prepare() local
207 is = PDU_SESSION(request); in iscsi_pdu_prepare()
209 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_prepare()
221 if (ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn) && in iscsi_pdu_prepare()
230 ISCSI_SESSION_DEBUG(is, "postponing send, CmdSN %u, " in iscsi_pdu_prepare()
232 is->is_cmdsn, is->is_expcmdsn, is->is_maxcmdsn, in iscsi_pdu_prepare()
237 bhssc->bhssc_cmdsn = htonl(is->is_cmdsn); in iscsi_pdu_prepare()
239 is->is_cmdsn++; in iscsi_pdu_prepare()
241 bhssc->bhssc_expstatsn = htonl(is->is_statsn + 1); in iscsi_pdu_prepare()
247 iscsi_session_send_postponed(struct iscsi_session *is) in iscsi_session_send_postponed() argument
252 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_send_postponed()
254 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_send_postponed()
256 while ((request = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_send_postponed()
260 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_send_postponed()
263 xpt_release_simq(is->is_sim, 1); in iscsi_session_send_postponed()
269 struct iscsi_session *is; in iscsi_pdu_queue_locked() local
272 is = PDU_SESSION(request); in iscsi_pdu_queue_locked()
273 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_queue_locked()
274 iscsi_session_send_postponed(is); in iscsi_pdu_queue_locked()
277 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_queue_locked()
278 xpt_freeze_simq(is->is_sim, 1); in iscsi_pdu_queue_locked()
279 STAILQ_INSERT_TAIL(&is->is_postponed, request, ip_next); in iscsi_pdu_queue_locked()
288 struct iscsi_session *is; in iscsi_pdu_queue() local
290 is = PDU_SESSION(request); in iscsi_pdu_queue()
291 ISCSI_SESSION_LOCK(is); in iscsi_pdu_queue()
293 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_queue()
297 iscsi_session_logout(struct iscsi_session *is) in iscsi_session_logout() argument
302 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_session_logout()
313 iscsi_session_terminate_task(struct iscsi_session *is, in iscsi_session_terminate_task() argument
317 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_terminate_task()
325 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_session_terminate_task()
329 iscsi_outstanding_remove(is, io); in iscsi_session_terminate_task()
333 iscsi_session_terminate_tasks(struct iscsi_session *is, cam_status status) in iscsi_session_terminate_tasks() argument
337 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_terminate_tasks()
339 TAILQ_FOREACH_SAFE(io, &is->is_outstanding, io_next, tmp) { in iscsi_session_terminate_tasks()
340 iscsi_session_terminate_task(is, io, status); in iscsi_session_terminate_tasks()
345 iscsi_session_cleanup(struct iscsi_session *is, bool destroy_sim) in iscsi_session_cleanup() argument
349 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_cleanup()
354 if (is->is_sim != NULL && is->is_simq_frozen == false) { in iscsi_session_cleanup()
355 ISCSI_SESSION_DEBUG(is, "freezing"); in iscsi_session_cleanup()
356 xpt_freeze_simq(is->is_sim, 1); in iscsi_session_cleanup()
357 is->is_simq_frozen = true; in iscsi_session_cleanup()
363 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_cleanup()
364 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
365 while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_cleanup()
366 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_cleanup()
374 iscsi_session_terminate_tasks(is, CAM_REQUEUE_REQ); in iscsi_session_cleanup()
378 iscsi_session_terminate_tasks(is, CAM_DEV_NOT_THERE); in iscsi_session_cleanup()
380 if (is->is_sim == NULL) in iscsi_session_cleanup()
383 ISCSI_SESSION_DEBUG(is, "deregistering SIM"); in iscsi_session_cleanup()
384 xpt_async(AC_LOST_DEVICE, is->is_path, NULL); in iscsi_session_cleanup()
386 if (is->is_simq_frozen) { in iscsi_session_cleanup()
387 is->is_simq_frozen = false; in iscsi_session_cleanup()
388 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
391 xpt_free_path(is->is_path); in iscsi_session_cleanup()
392 is->is_path = NULL; in iscsi_session_cleanup()
393 xpt_bus_deregister(cam_sim_path(is->is_sim)); in iscsi_session_cleanup()
394 cam_sim_free(is->is_sim, TRUE /*free_devq*/); in iscsi_session_cleanup()
395 is->is_sim = NULL; in iscsi_session_cleanup()
396 is->is_devq = NULL; in iscsi_session_cleanup()
400 iscsi_maintenance_thread_reconnect(struct iscsi_session *is) in iscsi_maintenance_thread_reconnect() argument
409 so = is->is_conn->ic_socket; in iscsi_maintenance_thread_reconnect()
420 sosetopt(is->is_conn->ic_socket, &sopt); in iscsi_maintenance_thread_reconnect()
423 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_reconnect()
425 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread_reconnect()
427 is->is_connected = false; in iscsi_maintenance_thread_reconnect()
428 is->is_reconnecting = false; in iscsi_maintenance_thread_reconnect()
429 is->is_login_phase = false; in iscsi_maintenance_thread_reconnect()
432 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_reconnect()
433 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_reconnect()
434 is->is_login_pdu = NULL; in iscsi_maintenance_thread_reconnect()
436 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_reconnect()
440 ISCSI_SESSION_DEBUG(is, "connection failed, destroying devices"); in iscsi_maintenance_thread_reconnect()
441 iscsi_session_cleanup(is, true); in iscsi_maintenance_thread_reconnect()
443 iscsi_session_cleanup(is, false); in iscsi_maintenance_thread_reconnect()
446 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_reconnect()
448 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_reconnect()
451 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_maintenance_thread_reconnect()
452 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_reconnect()
460 is->is_waiting_for_iscsid = true; in iscsi_maintenance_thread_reconnect()
461 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_maintenance_thread_reconnect()
462 is->is_timeout = 0; in iscsi_maintenance_thread_reconnect()
463 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_reconnect()
464 cv_signal(&is->is_softc->sc_cv); in iscsi_maintenance_thread_reconnect()
468 iscsi_maintenance_thread_terminate(struct iscsi_session *is) in iscsi_maintenance_thread_terminate() argument
472 sc = is->is_softc; in iscsi_maintenance_thread_terminate()
474 TAILQ_REMOVE(&sc->sc_sessions, is, is_next); in iscsi_maintenance_thread_terminate()
477 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_terminate()
478 callout_drain(&is->is_callout); in iscsi_maintenance_thread_terminate()
480 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread_terminate()
482 KASSERT(is->is_terminating, ("is_terminating == false")); in iscsi_maintenance_thread_terminate()
485 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_terminate()
486 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_terminate()
487 is->is_login_pdu = NULL; in iscsi_maintenance_thread_terminate()
489 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
492 iscsi_session_cleanup(is, true); in iscsi_maintenance_thread_terminate()
494 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_terminate()
496 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_terminate()
499 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_terminate()
501 icl_conn_free(is->is_conn); in iscsi_maintenance_thread_terminate()
502 mtx_destroy(&is->is_lock); in iscsi_maintenance_thread_terminate()
503 cv_destroy(&is->is_maintenance_cv); in iscsi_maintenance_thread_terminate()
505 cv_destroy(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
508 ISCSI_SESSION_DEBUG(is, "terminated"); in iscsi_maintenance_thread_terminate()
509 free(is, M_ISCSI); in iscsi_maintenance_thread_terminate()
520 struct iscsi_session *is = arg; in iscsi_maintenance_thread() local
522 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread()
524 if (is->is_reconnecting == false && in iscsi_maintenance_thread()
525 is->is_terminating == false && in iscsi_maintenance_thread()
526 (STAILQ_EMPTY(&is->is_postponed) || in iscsi_maintenance_thread()
527 ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn))) in iscsi_maintenance_thread()
528 cv_wait(&is->is_maintenance_cv, &is->is_lock); in iscsi_maintenance_thread()
531 if (is->is_terminating) { in iscsi_maintenance_thread()
532 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
533 iscsi_maintenance_thread_terminate(is); in iscsi_maintenance_thread()
538 if (is->is_reconnecting) { in iscsi_maintenance_thread()
539 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
540 iscsi_maintenance_thread_reconnect(is); in iscsi_maintenance_thread()
541 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread()
545 iscsi_session_send_postponed(is); in iscsi_maintenance_thread()
547 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
551 iscsi_session_reconnect(struct iscsi_session *is) in iscsi_session_reconnect() argument
559 if (is->is_reconnecting) in iscsi_session_reconnect()
562 is->is_reconnecting = true; in iscsi_session_reconnect()
563 cv_signal(&is->is_maintenance_cv); in iscsi_session_reconnect()
567 iscsi_session_terminate(struct iscsi_session *is) in iscsi_session_terminate() argument
570 if (is->is_terminating) in iscsi_session_terminate()
573 is->is_terminating = true; in iscsi_session_terminate()
576 iscsi_session_logout(is); in iscsi_session_terminate()
578 cv_signal(&is->is_maintenance_cv); in iscsi_session_terminate()
586 struct iscsi_session *is; in iscsi_callout() local
590 is = context; in iscsi_callout()
592 ISCSI_SESSION_LOCK(is); in iscsi_callout()
593 if (is->is_terminating) { in iscsi_callout()
594 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
600 callout_schedule_sbt(&is->is_callout, sbt, pr, 0); in iscsi_callout()
602 if (is->is_conf.isc_enable == 0) in iscsi_callout()
605 is->is_timeout++; in iscsi_callout()
607 if (is->is_waiting_for_iscsid) { in iscsi_callout()
608 if (iscsid_timeout > 0 && is->is_timeout > iscsid_timeout) { in iscsi_callout()
609 ISCSI_SESSION_WARN(is, "timed out waiting for iscsid(8) " in iscsi_callout()
611 is->is_timeout); in iscsi_callout()
617 if (is->is_login_phase) { in iscsi_callout()
618 if (is->is_login_timeout > 0 && is->is_timeout > is->is_login_timeout) { in iscsi_callout()
619 ISCSI_SESSION_WARN(is, "login timed out after %d seconds; " in iscsi_callout()
620 "reconnecting", is->is_timeout); in iscsi_callout()
626 if (is->is_ping_timeout <= 0) { in iscsi_callout()
632 is->is_timeout = 0; in iscsi_callout()
636 if (is->is_timeout >= is->is_ping_timeout) { in iscsi_callout()
637 ISCSI_SESSION_WARN(is, "no ping reply (NOP-In) after %d seconds; " in iscsi_callout()
638 "reconnecting", is->is_ping_timeout); in iscsi_callout()
643 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
653 if (is->is_timeout < 2) in iscsi_callout()
656 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_callout()
658 ISCSI_SESSION_WARN(is, "failed to allocate PDU"); in iscsi_callout()
670 if (is->is_terminating) { in iscsi_callout()
671 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
675 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
678 iscsi_session_reconnect(is); in iscsi_callout()
685 struct iscsi_session *is; in iscsi_pdu_update_statsn() local
688 is = PDU_SESSION(response); in iscsi_pdu_update_statsn()
690 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_update_statsn()
706 if (statsn != is->is_statsn && statsn != (is->is_statsn + 1)) { in iscsi_pdu_update_statsn()
708 ISCSI_SESSION_WARN(is, "PDU 0x%x StatSN %u != " in iscsi_pdu_update_statsn()
710 bhsdi->bhsdi_opcode, statsn, is->is_statsn); in iscsi_pdu_update_statsn()
711 iscsi_session_reconnect(is); in iscsi_pdu_update_statsn()
713 if (ISCSI_SNGT(statsn, is->is_statsn)) in iscsi_pdu_update_statsn()
714 is->is_statsn = statsn; in iscsi_pdu_update_statsn()
721 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
725 if (ISCSI_SNGT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
726 is->is_maxcmdsn = maxcmdsn; in iscsi_pdu_update_statsn()
732 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_update_statsn()
733 cv_signal(&is->is_maintenance_cv); in iscsi_pdu_update_statsn()
734 } else if (ISCSI_SNLT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
736 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
738 maxcmdsn, is->is_maxcmdsn); in iscsi_pdu_update_statsn()
741 if (ISCSI_SNGT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
742 is->is_expcmdsn = expcmdsn; in iscsi_pdu_update_statsn()
743 } else if (ISCSI_SNLT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
745 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
747 expcmdsn, is->is_expcmdsn); in iscsi_pdu_update_statsn()
757 is->is_timeout = 0; in iscsi_pdu_update_statsn()
763 struct iscsi_session *is; in iscsi_receive_callback() local
765 is = PDU_SESSION(response); in iscsi_receive_callback()
767 ISCSI_SESSION_LOCK(is); in iscsi_receive_callback()
772 if (is->is_login_phase) { in iscsi_receive_callback()
773 if (is->is_login_pdu == NULL) in iscsi_receive_callback()
774 is->is_login_pdu = response; in iscsi_receive_callback()
777 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
778 cv_signal(&is->is_login_cv); in iscsi_receive_callback()
790 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
795 ISCSI_SESSION_LOCK_ASSERT_NOT(is); in iscsi_receive_callback()
799 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
804 ISCSI_SESSION_LOCK_ASSERT_NOT(is); in iscsi_receive_callback()
808 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
812 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
816 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
820 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
823 ISCSI_SESSION_WARN(is, "received PDU with unsupported " in iscsi_receive_callback()
826 iscsi_session_reconnect(is); in iscsi_receive_callback()
827 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
835 struct iscsi_session *is; in iscsi_error_callback() local
837 is = CONN_SESSION(ic); in iscsi_error_callback()
839 ISCSI_SESSION_WARN(is, "connection error; reconnecting"); in iscsi_error_callback()
840 iscsi_session_reconnect(is); in iscsi_error_callback()
846 struct iscsi_session *is; in iscsi_pdu_handle_nop_in() local
854 is = PDU_SESSION(response); in iscsi_pdu_handle_nop_in()
870 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
873 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
881 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
885 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
897 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
902 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
917 struct iscsi_session *is; in iscsi_pdu_handle_scsi_response() local
924 is = PDU_SESSION(response); in iscsi_pdu_handle_scsi_response()
927 io = iscsi_outstanding_find(is, bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
929 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
931 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
932 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
939 ISCSI_SESSION_WARN(is, in iscsi_pdu_handle_scsi_response()
954 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
955 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
960 ISCSI_SESSION_WARN(is, in iscsi_pdu_handle_scsi_response()
964 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
965 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
975 if (is->is_conn->ic_iser) { in iscsi_pdu_handle_scsi_response()
980 ISCSI_SESSION_WARN(is, "overflow: target indicates %d", resid); in iscsi_pdu_handle_scsi_response()
987 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_scsi_response()
988 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
991 ISCSI_SESSION_WARN(is, "service response 0x%x", bhssr->bhssr_response); in iscsi_pdu_handle_scsi_response()
994 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1002 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1012 ISCSI_SESSION_WARN(is, "truncated data segment (%zd bytes)", in iscsi_pdu_handle_scsi_response()
1016 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1024 ISCSI_SESSION_DEBUG(is, "sense_len %d, data len %zd", in iscsi_pdu_handle_scsi_response()
1028 ISCSI_SESSION_WARN(is, "truncated data segment " in iscsi_pdu_handle_scsi_response()
1033 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1038 ISCSI_SESSION_WARN(is, "oversize data segment " in iscsi_pdu_handle_scsi_response()
1042 ISCSI_SESSION_DEBUG(is, "truncating sense from %d to %d", in iscsi_pdu_handle_scsi_response()
1060 ISCSI_SESSION_WARN(is, "underflow mismatch: " in iscsi_pdu_handle_scsi_response()
1077 struct iscsi_session *is; in iscsi_pdu_handle_task_response() local
1079 is = PDU_SESSION(response); in iscsi_pdu_handle_task_response()
1082 io = iscsi_outstanding_find(is, bhstmr->bhstmr_initiator_task_tag); in iscsi_pdu_handle_task_response()
1084 ISCSI_SESSION_WARN(is, "bad itt 0x%x", in iscsi_pdu_handle_task_response()
1087 iscsi_session_reconnect(is); in iscsi_pdu_handle_task_response()
1092 ISCSI_SESSION_WARN(is, "task response 0x%x", in iscsi_pdu_handle_task_response()
1095 aio = iscsi_outstanding_find(is, io->io_referenced_task_tag); in iscsi_pdu_handle_task_response()
1097 iscsi_session_terminate_task(is, aio, CAM_REQ_ABORTED); in iscsi_pdu_handle_task_response()
1100 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_task_response()
1127 struct iscsi_session *is; in iscsi_pdu_handle_data_in() local
1132 is = PDU_SESSION(response); in iscsi_pdu_handle_data_in()
1134 io = iscsi_outstanding_find(is, bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1136 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1138 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1139 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1144 ISCSI_SESSION_WARN(is, "received Data-In PDU with " in iscsi_pdu_handle_data_in()
1148 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1149 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1161 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1172 ISCSI_SESSION_WARN(is, "data out of order; expected offset %zd, got %zd", in iscsi_pdu_handle_data_in()
1175 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1176 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1184 ISCSI_SESSION_WARN(is, "oversize data segment (%zd bytes " in iscsi_pdu_handle_data_in()
1188 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1189 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1197 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_data_in()
1198 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1219 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_data_in()
1231 ISCSI_SESSION_WARN(is, "underflow mismatch: " in iscsi_pdu_handle_data_in()
1271 struct iscsi_session *is; in iscsi_pdu_handle_r2t() local
1280 is = PDU_SESSION(response); in iscsi_pdu_handle_r2t()
1283 io = iscsi_outstanding_find(is, bhsr2t->bhsr2t_initiator_task_tag); in iscsi_pdu_handle_r2t()
1285 ISCSI_SESSION_WARN(is, "bad itt 0x%x; reconnecting", in iscsi_pdu_handle_r2t()
1288 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1295 ISCSI_SESSION_WARN(is, "received R2T for read command; reconnecting"); in iscsi_pdu_handle_r2t()
1297 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1307 ISCSI_SESSION_WARN(is, "target requested invalid offset " in iscsi_pdu_handle_r2t()
1310 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1316 ISCSI_SESSION_WARN(is, "target requested invalid length " in iscsi_pdu_handle_r2t()
1319 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1325 if (is->is_conn->ic_hw_isomax != 0) in iscsi_pdu_handle_r2t()
1326 max_send_data_segment_length = is->is_conn->ic_hw_isomax; in iscsi_pdu_handle_r2t()
1329 is->is_conn->ic_max_send_data_segment_length; in iscsi_pdu_handle_r2t()
1337 ISCSI_SESSION_WARN(is, "target requested invalid " in iscsi_pdu_handle_r2t()
1341 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1348 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1364 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_r2t()
1368 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1373 is->is_conn->ic_max_send_data_segment_length); in iscsi_pdu_handle_r2t()
1397 struct iscsi_session *is; in iscsi_pdu_handle_async_message() local
1399 is = PDU_SESSION(response); in iscsi_pdu_handle_async_message()
1403 ISCSI_SESSION_WARN(is, "target requests logout; removing session"); in iscsi_pdu_handle_async_message()
1404 iscsi_session_logout(is); in iscsi_pdu_handle_async_message()
1405 iscsi_session_terminate(is); in iscsi_pdu_handle_async_message()
1408 ISCSI_SESSION_WARN(is, "target indicates it will drop the connection"); in iscsi_pdu_handle_async_message()
1411 ISCSI_SESSION_WARN(is, "target indicates it will drop the session"); in iscsi_pdu_handle_async_message()
1418 ISCSI_SESSION_WARN(is, "ignoring AsyncEvent %d", bhsam->bhsam_async_event); in iscsi_pdu_handle_async_message()
1429 struct iscsi_session *is; in iscsi_pdu_handle_reject() local
1431 is = PDU_SESSION(response); in iscsi_pdu_handle_reject()
1433 ISCSI_SESSION_WARN(is, "received Reject PDU, reason 0x%x; protocol error?", in iscsi_pdu_handle_reject()
1443 struct iscsi_session *is; in iscsi_ioctl_daemon_wait() local
1448 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_wait()
1449 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_wait()
1450 if (is->is_conf.isc_enable == 0 && in iscsi_ioctl_daemon_wait()
1451 is->is_conf.isc_discovery == 0) { in iscsi_ioctl_daemon_wait()
1452 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1455 if (is->is_waiting_for_iscsid) in iscsi_ioctl_daemon_wait()
1457 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1460 if (is == NULL) { in iscsi_ioctl_daemon_wait()
1477 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_wait()
1478 is->is_login_phase = true; in iscsi_ioctl_daemon_wait()
1479 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_wait()
1480 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1482 request->idr_session_id = is->is_id; in iscsi_ioctl_daemon_wait()
1483 memcpy(&request->idr_isid, &is->is_isid, in iscsi_ioctl_daemon_wait()
1486 memcpy(&request->idr_conf, &is->is_conf, in iscsi_ioctl_daemon_wait()
1494 error = icl_limits(is->is_conf.isc_offload, in iscsi_ioctl_daemon_wait()
1495 is->is_conf.isc_iser, 0, &idl); in iscsi_ioctl_daemon_wait()
1497 ISCSI_SESSION_WARN(is, "icl_limits for " in iscsi_ioctl_daemon_wait()
1499 is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_wait()
1524 struct iscsi_session *is; in iscsi_ioctl_daemon_limits() local
1532 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_limits()
1533 if (is->is_id == limits->idl_session_id) in iscsi_ioctl_daemon_limits()
1536 if (is == NULL) { in iscsi_ioctl_daemon_limits()
1541 error = icl_limits(is->is_conf.isc_offload, is->is_conf.isc_iser, in iscsi_ioctl_daemon_limits()
1545 ISCSI_SESSION_WARN(is, "icl_limits for offload \"%s\" " in iscsi_ioctl_daemon_limits()
1546 "failed with error %d", is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_limits()
1565 struct iscsi_session *is; in iscsi_ioctl_daemon_handoff() local
1574 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_handoff()
1575 if (is->is_id == handoff->idh_session_id) in iscsi_ioctl_daemon_handoff()
1578 if (is == NULL) { in iscsi_ioctl_daemon_handoff()
1582 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1583 ic = is->is_conn; in iscsi_ioctl_daemon_handoff()
1584 if (is->is_conf.isc_discovery || is->is_terminating) { in iscsi_ioctl_daemon_handoff()
1585 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1589 if (is->is_connected) { in iscsi_ioctl_daemon_handoff()
1595 ISCSI_SESSION_WARN(is, "handoff on already connected " in iscsi_ioctl_daemon_handoff()
1597 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1602 strlcpy(is->is_target_alias, handoff->idh_target_alias, in iscsi_ioctl_daemon_handoff()
1603 sizeof(is->is_target_alias)); in iscsi_ioctl_daemon_handoff()
1604 is->is_tsih = handoff->idh_tsih; in iscsi_ioctl_daemon_handoff()
1605 is->is_statsn = handoff->idh_statsn; in iscsi_ioctl_daemon_handoff()
1606 is->is_protocol_level = handoff->idh_protocol_level; in iscsi_ioctl_daemon_handoff()
1607 is->is_initial_r2t = handoff->idh_initial_r2t; in iscsi_ioctl_daemon_handoff()
1608 is->is_immediate_data = handoff->idh_immediate_data; in iscsi_ioctl_daemon_handoff()
1614 is->is_max_burst_length = handoff->idh_max_burst_length; in iscsi_ioctl_daemon_handoff()
1615 is->is_first_burst_length = handoff->idh_first_burst_length; in iscsi_ioctl_daemon_handoff()
1627 is->is_cmdsn = 0; in iscsi_ioctl_daemon_handoff()
1628 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1629 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1630 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_handoff()
1631 is->is_login_phase = false; in iscsi_ioctl_daemon_handoff()
1632 is->is_timeout = 0; in iscsi_ioctl_daemon_handoff()
1633 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_daemon_handoff()
1634 if (is->is_ping_timeout < 0) in iscsi_ioctl_daemon_handoff()
1635 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_daemon_handoff()
1636 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_daemon_handoff()
1637 if (is->is_login_timeout < 0) in iscsi_ioctl_daemon_handoff()
1638 is->is_login_timeout = login_timeout; in iscsi_ioctl_daemon_handoff()
1639 is->is_connected = true; in iscsi_ioctl_daemon_handoff()
1640 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_handoff()
1642 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1652 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1658 if (is->is_sim != NULL) { in iscsi_ioctl_daemon_handoff()
1662 KASSERT(is->is_simq_frozen, ("reconnect without frozen simq")); in iscsi_ioctl_daemon_handoff()
1663 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1664 ISCSI_SESSION_DEBUG(is, "releasing"); in iscsi_ioctl_daemon_handoff()
1665 is->is_simq_frozen = false; in iscsi_ioctl_daemon_handoff()
1666 xpt_release_simq(is->is_sim, 1); in iscsi_ioctl_daemon_handoff()
1667 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1670 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1671 is->is_devq = cam_simq_alloc(ic->ic_maxtags); in iscsi_ioctl_daemon_handoff()
1672 if (is->is_devq == NULL) { in iscsi_ioctl_daemon_handoff()
1673 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1674 ISCSI_SESSION_WARN(is, "failed to allocate simq"); in iscsi_ioctl_daemon_handoff()
1675 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1679 is->is_sim = cam_sim_alloc(iscsi_action, NULL, "iscsi", in iscsi_ioctl_daemon_handoff()
1680 is, is->is_id /* unit */, &is->is_lock, in iscsi_ioctl_daemon_handoff()
1681 1, ic->ic_maxtags, is->is_devq); in iscsi_ioctl_daemon_handoff()
1682 if (is->is_sim == NULL) { in iscsi_ioctl_daemon_handoff()
1683 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1684 ISCSI_SESSION_WARN(is, "failed to allocate SIM"); in iscsi_ioctl_daemon_handoff()
1685 cam_simq_free(is->is_devq); in iscsi_ioctl_daemon_handoff()
1686 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1690 if (xpt_bus_register(is->is_sim, NULL, 0) != 0) { in iscsi_ioctl_daemon_handoff()
1691 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1692 ISCSI_SESSION_WARN(is, "failed to register bus"); in iscsi_ioctl_daemon_handoff()
1693 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1697 error = xpt_create_path(&is->is_path, /*periph*/NULL, in iscsi_ioctl_daemon_handoff()
1698 cam_sim_path(is->is_sim), CAM_TARGET_WILDCARD, in iscsi_ioctl_daemon_handoff()
1701 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1702 ISCSI_SESSION_WARN(is, "failed to create path"); in iscsi_ioctl_daemon_handoff()
1703 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1706 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1716 struct iscsi_session *is; in iscsi_ioctl_daemon_fail() local
1720 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_fail()
1721 if (is->is_id == fail->idf_session_id) in iscsi_ioctl_daemon_fail()
1724 if (is == NULL) { in iscsi_ioctl_daemon_fail()
1728 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_fail()
1729 ISCSI_SESSION_DEBUG(is, "iscsid(8) failed: %s", in iscsi_ioctl_daemon_fail()
1731 strlcpy(is->is_reason, fail->idf_reason, sizeof(is->is_reason)); in iscsi_ioctl_daemon_fail()
1735 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_fail()
1746 struct iscsi_session *is; in iscsi_ioctl_daemon_connect() local
1751 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_connect()
1752 if (is->is_id == idc->idc_session_id) in iscsi_ioctl_daemon_connect()
1755 if (is == NULL) { in iscsi_ioctl_daemon_connect()
1764 ISCSI_SESSION_WARN(is, in iscsi_ioctl_daemon_connect()
1773 ISCSI_SESSION_WARN(is, "getsockaddr failed with error %d", in iscsi_ioctl_daemon_connect()
1779 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_connect()
1780 is->is_statsn = 0; in iscsi_ioctl_daemon_connect()
1781 is->is_cmdsn = 0; in iscsi_ioctl_daemon_connect()
1782 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_connect()
1783 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_connect()
1784 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_connect()
1785 is->is_login_phase = true; in iscsi_ioctl_daemon_connect()
1786 is->is_timeout = 0; in iscsi_ioctl_daemon_connect()
1787 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_connect()
1789 error = icl_conn_connect(is->is_conn, idc->idc_domain, in iscsi_ioctl_daemon_connect()
1797 is->is_conn->ic_header_crc32c = false; in iscsi_ioctl_daemon_connect()
1798 is->is_conn->ic_data_crc32c = false; in iscsi_ioctl_daemon_connect()
1807 struct iscsi_session *is; in iscsi_ioctl_daemon_send() local
1814 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_send()
1815 if (is->is_id == ids->ids_session_id) in iscsi_ioctl_daemon_send()
1818 if (is == NULL) { in iscsi_ioctl_daemon_send()
1824 if (is->is_login_phase == false) in iscsi_ioctl_daemon_send()
1827 if (is->is_terminating || is->is_reconnecting) in iscsi_ioctl_daemon_send()
1831 if (datalen > is->is_conn->ic_max_send_data_segment_length) in iscsi_ioctl_daemon_send()
1842 ip = icl_pdu_new(is->is_conn, M_WAITOK); in iscsi_ioctl_daemon_send()
1858 struct iscsi_session *is; in iscsi_ioctl_daemon_receive() local
1864 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_receive()
1865 if (is->is_id == idr->idr_session_id) in iscsi_ioctl_daemon_receive()
1868 if (is == NULL) { in iscsi_ioctl_daemon_receive()
1874 if (is->is_login_phase == false) in iscsi_ioctl_daemon_receive()
1877 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_receive()
1878 while (is->is_login_pdu == NULL && in iscsi_ioctl_daemon_receive()
1879 is->is_terminating == false && in iscsi_ioctl_daemon_receive()
1880 is->is_reconnecting == false) { in iscsi_ioctl_daemon_receive()
1881 error = cv_wait_sig(&is->is_login_cv, &is->is_lock); in iscsi_ioctl_daemon_receive()
1883 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1887 if (is->is_terminating || is->is_reconnecting) { in iscsi_ioctl_daemon_receive()
1888 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1891 ip = is->is_login_pdu; in iscsi_ioctl_daemon_receive()
1892 is->is_login_pdu = NULL; in iscsi_ioctl_daemon_receive()
1893 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1965 struct iscsi_session *is; in iscsi_ioctl_session_add() local
1974 is = malloc(sizeof(*is), M_ISCSI, M_ZERO | M_WAITOK); in iscsi_ioctl_session_add()
1975 memcpy(&is->is_conf, &isa->isa_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_add()
1983 if (!!is->is_conf.isc_discovery != in iscsi_ioctl_session_add()
1987 if (strcmp(is->is_conf.isc_target_addr, in iscsi_ioctl_session_add()
1991 if (is->is_conf.isc_discovery == 0 && in iscsi_ioctl_session_add()
1992 strcmp(is->is_conf.isc_target, in iscsi_ioctl_session_add()
1997 free(is, M_ISCSI); in iscsi_ioctl_session_add()
2001 is->is_conn = icl_new_conn(is->is_conf.isc_offload, in iscsi_ioctl_session_add()
2002 is->is_conf.isc_iser, "iscsi", &is->is_lock); in iscsi_ioctl_session_add()
2003 if (is->is_conn == NULL) { in iscsi_ioctl_session_add()
2005 free(is, M_ISCSI); in iscsi_ioctl_session_add()
2008 is->is_conn->ic_receive = iscsi_receive_callback; in iscsi_ioctl_session_add()
2009 is->is_conn->ic_error = iscsi_error_callback; in iscsi_ioctl_session_add()
2010 is->is_conn->ic_prv0 = is; in iscsi_ioctl_session_add()
2011 TAILQ_INIT(&is->is_outstanding); in iscsi_ioctl_session_add()
2012 STAILQ_INIT(&is->is_postponed); in iscsi_ioctl_session_add()
2013 mtx_init(&is->is_lock, "iscsi_lock", NULL, MTX_DEF); in iscsi_ioctl_session_add()
2014 cv_init(&is->is_maintenance_cv, "iscsi_mt"); in iscsi_ioctl_session_add()
2016 cv_init(&is->is_login_cv, "iscsi_login"); in iscsi_ioctl_session_add()
2026 is->is_conn->ic_max_recv_data_segment_length = 8192; in iscsi_ioctl_session_add()
2027 is->is_conn->ic_max_send_data_segment_length = 8192; in iscsi_ioctl_session_add()
2028 is->is_max_burst_length = 262144; in iscsi_ioctl_session_add()
2029 is->is_first_burst_length = 65536; in iscsi_ioctl_session_add()
2031 is->is_softc = sc; in iscsi_ioctl_session_add()
2033 is->is_id = sc->sc_last_session_id; in iscsi_ioctl_session_add()
2034 is->is_isid[0] = 0x80; /* RFC 3720, 10.12.5: 10b, "Random" ISID. */ in iscsi_ioctl_session_add()
2035 arc4rand(&is->is_isid[1], 5, 0); in iscsi_ioctl_session_add()
2036 is->is_tsih = 0; in iscsi_ioctl_session_add()
2037 callout_init(&is->is_callout, 1); in iscsi_ioctl_session_add()
2039 error = kthread_add(iscsi_maintenance_thread, is, NULL, NULL, 0, 0, "iscsimt"); in iscsi_ioctl_session_add()
2041 ISCSI_SESSION_WARN(is, "kthread_add(9) failed with error %d", error); in iscsi_ioctl_session_add()
2045 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_session_add()
2046 if (is->is_ping_timeout < 0) in iscsi_ioctl_session_add()
2047 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_session_add()
2048 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_session_add()
2049 if (is->is_login_timeout < 0) in iscsi_ioctl_session_add()
2050 is->is_login_timeout = login_timeout; in iscsi_ioctl_session_add()
2054 callout_reset_sbt(&is->is_callout, sbt, pr, iscsi_callout, is, 0); in iscsi_ioctl_session_add()
2055 TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next); in iscsi_ioctl_session_add()
2057 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_add()
2062 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_ioctl_session_add()
2063 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_add()
2068 is->is_waiting_for_iscsid = true; in iscsi_ioctl_session_add()
2069 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_ioctl_session_add()
2070 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_add()
2096 struct iscsi_session *is, *tmp; in iscsi_ioctl_session_remove() local
2102 TAILQ_FOREACH_SAFE(is, &sc->sc_sessions, is_next, tmp) { in iscsi_ioctl_session_remove()
2103 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_remove()
2104 if (iscsi_session_conf_matches(is->is_id, &is->is_conf, in iscsi_ioctl_session_remove()
2107 iscsi_session_logout(is); in iscsi_ioctl_session_remove()
2108 iscsi_session_terminate(is); in iscsi_ioctl_session_remove()
2110 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_remove()
2125 struct iscsi_session *is; in iscsi_ioctl_session_list() local
2129 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_list()
2135 memcpy(&iss.iss_conf, &is->is_conf, sizeof(iss.iss_conf)); in iscsi_ioctl_session_list()
2136 iss.iss_id = is->is_id; in iscsi_ioctl_session_list()
2137 strlcpy(iss.iss_target_alias, is->is_target_alias, sizeof(iss.iss_target_alias)); in iscsi_ioctl_session_list()
2138 strlcpy(iss.iss_reason, is->is_reason, sizeof(iss.iss_reason)); in iscsi_ioctl_session_list()
2139 strlcpy(iss.iss_offload, is->is_conn->ic_offload, sizeof(iss.iss_offload)); in iscsi_ioctl_session_list()
2141 if (is->is_conn->ic_header_crc32c) in iscsi_ioctl_session_list()
2146 if (is->is_conn->ic_data_crc32c) in iscsi_ioctl_session_list()
2152 is->is_conn->ic_max_send_data_segment_length; in iscsi_ioctl_session_list()
2154 is->is_conn->ic_max_recv_data_segment_length; in iscsi_ioctl_session_list()
2155 iss.iss_max_burst_length = is->is_max_burst_length; in iscsi_ioctl_session_list()
2156 iss.iss_first_burst_length = is->is_first_burst_length; in iscsi_ioctl_session_list()
2157 iss.iss_immediate_data = is->is_immediate_data; in iscsi_ioctl_session_list()
2158 iss.iss_connected = is->is_connected; in iscsi_ioctl_session_list()
2178 struct iscsi_session *is; in iscsi_ioctl_session_modify() local
2186 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_modify()
2187 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_modify()
2188 if (is->is_id == ism->ism_session_id) { in iscsi_ioctl_session_modify()
2192 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2194 if (is == NULL) { in iscsi_ioctl_session_modify()
2203 if (is == is2) in iscsi_ioctl_session_modify()
2219 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2226 memcpy(&is->is_conf, &ism->ism_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_modify()
2227 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2229 iscsi_session_reconnect(is); in iscsi_ioctl_session_modify()
2289 iscsi_outstanding_find(struct iscsi_session *is, uint32_t initiator_task_tag) in iscsi_outstanding_find() argument
2293 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_find()
2295 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find()
2303 iscsi_outstanding_find_ccb(struct iscsi_session *is, union ccb *ccb) in iscsi_outstanding_find_ccb() argument
2307 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_find_ccb()
2309 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find_ccb()
2317 iscsi_outstanding_add(struct iscsi_session *is, struct icl_pdu *request, in iscsi_outstanding_add() argument
2323 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_add()
2327 ISCSI_SESSION_WARN(is, "failed to allocate %zd bytes", in iscsi_outstanding_add()
2332 error = icl_conn_task_setup(is->is_conn, request, &ccb->csio, in iscsi_outstanding_add()
2335 ISCSI_SESSION_WARN(is, in iscsi_outstanding_add()
2341 KASSERT(iscsi_outstanding_find(is, *initiator_task_tagp) == NULL, in iscsi_outstanding_add()
2346 TAILQ_INSERT_TAIL(&is->is_outstanding, io, io_next); in iscsi_outstanding_add()
2351 iscsi_outstanding_remove(struct iscsi_session *is, struct iscsi_outstanding *io) in iscsi_outstanding_remove() argument
2354 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_remove()
2356 icl_conn_task_done(is->is_conn, io->io_icl_prv); in iscsi_outstanding_remove()
2357 TAILQ_REMOVE(&is->is_outstanding, io, io_next); in iscsi_outstanding_remove()
2362 iscsi_action_abort(struct iscsi_session *is, union ccb *ccb) in iscsi_action_abort() argument
2370 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action_abort()
2373 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_abort()
2375 if (is->is_login_phase) { in iscsi_action_abort()
2382 aio = iscsi_outstanding_find_ccb(is, cab->abort_ccb); in iscsi_action_abort()
2389 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_abort()
2396 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2398 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2400 io = iscsi_outstanding_add(is, request, NULL, &initiator_task_tag); in iscsi_action_abort()
2420 iscsi_action_scsiio(struct iscsi_session *is, union ccb *ccb) in iscsi_action_scsiio() argument
2430 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action_scsiio()
2433 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_scsiio()
2435 if (is->is_login_phase) { in iscsi_action_scsiio()
2436 ISCSI_SESSION_DEBUG(is, "called during login phase"); in iscsi_action_scsiio()
2439 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2447 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_scsiio()
2451 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2458 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2460 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2462 io = iscsi_outstanding_add(is, request, ccb, &initiator_task_tag); in iscsi_action_scsiio()
2467 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2506 if (is->is_protocol_level >= 2) { in iscsi_action_scsiio()
2522 if (is->is_immediate_data && in iscsi_action_scsiio()
2526 if (len > is->is_first_burst_length) { in iscsi_action_scsiio()
2527 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, is->is_first_burst_length); in iscsi_action_scsiio()
2528 len = is->is_first_burst_length; in iscsi_action_scsiio()
2530 if (len > is->is_conn->ic_max_send_data_segment_length) { in iscsi_action_scsiio()
2531 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, in iscsi_action_scsiio()
2532 is->is_conn->ic_max_send_data_segment_length); in iscsi_action_scsiio()
2533 len = is->is_conn->ic_max_send_data_segment_length; in iscsi_action_scsiio()
2539 iscsi_outstanding_remove(is, io); in iscsi_action_scsiio()
2543 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2556 struct iscsi_session *is; in iscsi_action() local
2558 is = cam_sim_softc(sim); in iscsi_action()
2560 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action()
2562 if (is->is_terminating || in iscsi_action()
2563 (is->is_connected == false && fail_on_disconnection)) { in iscsi_action()
2572 if (is->is_simq_frozen == true) { in iscsi_action()
2593 if (is->is_conn == NULL) in iscsi_action()
2595 else if (is->is_conn->ic_unmapped) in iscsi_action()
2647 ISCSI_SESSION_DEBUG(is, "faking success for reset, abort, or term_io"); in iscsi_action()
2652 iscsi_action_abort(is, ccb); in iscsi_action()
2655 iscsi_action_scsiio(is, ccb); in iscsi_action()
2659 ISCSI_SESSION_DEBUG(is, "got unsupported code 0x%x", ccb->ccb_h.func_code); in iscsi_action()
2670 struct iscsi_session *is; in iscsi_terminate_sessions() local
2673 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) in iscsi_terminate_sessions()
2674 iscsi_session_terminate(is); in iscsi_terminate_sessions()
2686 struct iscsi_session *is; in iscsi_shutdown_pre() local
2706 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_shutdown_pre()
2707 ISCSI_SESSION_LOCK(is); in iscsi_shutdown_pre()
2708 if (!is->is_connected) { in iscsi_shutdown_pre()
2709 ISCSI_SESSION_DEBUG(is, "force failing disconnected session early"); in iscsi_shutdown_pre()
2710 iscsi_session_reconnect(is); in iscsi_shutdown_pre()
2712 ISCSI_SESSION_UNLOCK(is); in iscsi_shutdown_pre()