Lines Matching refs:is

189 static void	iscsi_session_reconnect(struct iscsi_session *is);
190 static void iscsi_session_terminate(struct iscsi_session *is);
192 static struct iscsi_outstanding *iscsi_outstanding_find(struct iscsi_session *is,
194 static struct iscsi_outstanding *iscsi_outstanding_add(struct iscsi_session *is,
197 static void iscsi_outstanding_remove(struct iscsi_session *is,
203 struct iscsi_session *is; in iscsi_pdu_prepare() local
206 is = PDU_SESSION(request); in iscsi_pdu_prepare()
208 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_prepare()
220 if (ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn) && in iscsi_pdu_prepare()
229 ISCSI_SESSION_DEBUG(is, "postponing send, CmdSN %u, " in iscsi_pdu_prepare()
231 is->is_cmdsn, is->is_expcmdsn, is->is_maxcmdsn, in iscsi_pdu_prepare()
236 bhssc->bhssc_cmdsn = htonl(is->is_cmdsn); in iscsi_pdu_prepare()
238 is->is_cmdsn++; in iscsi_pdu_prepare()
240 bhssc->bhssc_expstatsn = htonl(is->is_statsn + 1); in iscsi_pdu_prepare()
246 iscsi_session_send_postponed(struct iscsi_session *is) in iscsi_session_send_postponed() argument
251 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_send_postponed()
253 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_send_postponed()
255 while ((request = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_send_postponed()
259 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_send_postponed()
262 xpt_release_simq(is->is_sim, 1); in iscsi_session_send_postponed()
268 struct iscsi_session *is; in iscsi_pdu_queue_locked() local
271 is = PDU_SESSION(request); in iscsi_pdu_queue_locked()
272 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_queue_locked()
273 iscsi_session_send_postponed(is); in iscsi_pdu_queue_locked()
276 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_queue_locked()
277 xpt_freeze_simq(is->is_sim, 1); in iscsi_pdu_queue_locked()
278 STAILQ_INSERT_TAIL(&is->is_postponed, request, ip_next); in iscsi_pdu_queue_locked()
287 struct iscsi_session *is; in iscsi_pdu_queue() local
289 is = PDU_SESSION(request); in iscsi_pdu_queue()
290 ISCSI_SESSION_LOCK(is); in iscsi_pdu_queue()
292 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_queue()
296 iscsi_session_logout(struct iscsi_session *is) in iscsi_session_logout() argument
301 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_session_logout()
312 iscsi_session_terminate_task(struct iscsi_session *is, in iscsi_session_terminate_task() argument
316 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_terminate_task()
324 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_session_terminate_task()
328 iscsi_outstanding_remove(is, io); in iscsi_session_terminate_task()
332 iscsi_session_terminate_tasks(struct iscsi_session *is, cam_status status) in iscsi_session_terminate_tasks() argument
336 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_terminate_tasks()
338 TAILQ_FOREACH_SAFE(io, &is->is_outstanding, io_next, tmp) { in iscsi_session_terminate_tasks()
339 iscsi_session_terminate_task(is, io, status); in iscsi_session_terminate_tasks()
344 iscsi_session_cleanup(struct iscsi_session *is, bool destroy_sim) in iscsi_session_cleanup() argument
348 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_session_cleanup()
353 if (is->is_sim != NULL && is->is_simq_frozen == false) { in iscsi_session_cleanup()
354 ISCSI_SESSION_DEBUG(is, "freezing"); in iscsi_session_cleanup()
355 xpt_freeze_simq(is->is_sim, 1); in iscsi_session_cleanup()
356 is->is_simq_frozen = true; in iscsi_session_cleanup()
362 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_cleanup()
363 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
364 while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_cleanup()
365 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_cleanup()
373 iscsi_session_terminate_tasks(is, CAM_REQUEUE_REQ); in iscsi_session_cleanup()
377 iscsi_session_terminate_tasks(is, CAM_DEV_NOT_THERE); in iscsi_session_cleanup()
379 if (is->is_sim == NULL) in iscsi_session_cleanup()
382 ISCSI_SESSION_DEBUG(is, "deregistering SIM"); in iscsi_session_cleanup()
383 xpt_async(AC_LOST_DEVICE, is->is_path, NULL); in iscsi_session_cleanup()
385 if (is->is_simq_frozen) { in iscsi_session_cleanup()
386 is->is_simq_frozen = false; in iscsi_session_cleanup()
387 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
390 xpt_free_path(is->is_path); in iscsi_session_cleanup()
391 is->is_path = NULL; in iscsi_session_cleanup()
392 xpt_bus_deregister(cam_sim_path(is->is_sim)); in iscsi_session_cleanup()
393 cam_sim_free(is->is_sim, TRUE /*free_devq*/); in iscsi_session_cleanup()
394 is->is_sim = NULL; in iscsi_session_cleanup()
395 is->is_devq = NULL; in iscsi_session_cleanup()
399 iscsi_maintenance_thread_reconnect(struct iscsi_session *is) in iscsi_maintenance_thread_reconnect() argument
408 so = is->is_conn->ic_socket; in iscsi_maintenance_thread_reconnect()
419 sosetopt(is->is_conn->ic_socket, &sopt); in iscsi_maintenance_thread_reconnect()
422 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_reconnect()
424 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread_reconnect()
426 is->is_connected = false; in iscsi_maintenance_thread_reconnect()
427 is->is_reconnecting = false; in iscsi_maintenance_thread_reconnect()
428 is->is_login_phase = false; in iscsi_maintenance_thread_reconnect()
431 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_reconnect()
432 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_reconnect()
433 is->is_login_pdu = NULL; in iscsi_maintenance_thread_reconnect()
435 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_reconnect()
439 ISCSI_SESSION_DEBUG(is, "connection failed, destroying devices"); in iscsi_maintenance_thread_reconnect()
440 iscsi_session_cleanup(is, true); in iscsi_maintenance_thread_reconnect()
442 iscsi_session_cleanup(is, false); in iscsi_maintenance_thread_reconnect()
445 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_reconnect()
447 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_reconnect()
450 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_maintenance_thread_reconnect()
451 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_reconnect()
459 is->is_waiting_for_iscsid = true; in iscsi_maintenance_thread_reconnect()
460 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_maintenance_thread_reconnect()
461 is->is_timeout = 0; in iscsi_maintenance_thread_reconnect()
462 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_reconnect()
463 cv_signal(&is->is_softc->sc_cv); in iscsi_maintenance_thread_reconnect()
467 iscsi_maintenance_thread_terminate(struct iscsi_session *is) in iscsi_maintenance_thread_terminate() argument
471 sc = is->is_softc; in iscsi_maintenance_thread_terminate()
473 TAILQ_REMOVE(&sc->sc_sessions, is, is_next); in iscsi_maintenance_thread_terminate()
476 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_terminate()
477 callout_drain(&is->is_callout); in iscsi_maintenance_thread_terminate()
479 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread_terminate()
481 KASSERT(is->is_terminating, ("is_terminating == false")); in iscsi_maintenance_thread_terminate()
484 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_terminate()
485 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_terminate()
486 is->is_login_pdu = NULL; in iscsi_maintenance_thread_terminate()
488 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
491 iscsi_session_cleanup(is, true); in iscsi_maintenance_thread_terminate()
493 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_terminate()
495 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_terminate()
498 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread_terminate()
500 icl_conn_free(is->is_conn); in iscsi_maintenance_thread_terminate()
501 mtx_destroy(&is->is_lock); in iscsi_maintenance_thread_terminate()
502 cv_destroy(&is->is_maintenance_cv); in iscsi_maintenance_thread_terminate()
504 cv_destroy(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
507 ISCSI_SESSION_DEBUG(is, "terminated"); in iscsi_maintenance_thread_terminate()
508 free(is, M_ISCSI); in iscsi_maintenance_thread_terminate()
519 struct iscsi_session *is = arg; in iscsi_maintenance_thread() local
521 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread()
523 if (is->is_reconnecting == false && in iscsi_maintenance_thread()
524 is->is_terminating == false && in iscsi_maintenance_thread()
525 (STAILQ_EMPTY(&is->is_postponed) || in iscsi_maintenance_thread()
526 ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn))) in iscsi_maintenance_thread()
527 cv_wait(&is->is_maintenance_cv, &is->is_lock); in iscsi_maintenance_thread()
530 if (is->is_terminating) { in iscsi_maintenance_thread()
531 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
532 iscsi_maintenance_thread_terminate(is); in iscsi_maintenance_thread()
537 if (is->is_reconnecting) { in iscsi_maintenance_thread()
538 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
539 iscsi_maintenance_thread_reconnect(is); in iscsi_maintenance_thread()
540 ISCSI_SESSION_LOCK(is); in iscsi_maintenance_thread()
544 iscsi_session_send_postponed(is); in iscsi_maintenance_thread()
546 ISCSI_SESSION_UNLOCK(is); in iscsi_maintenance_thread()
550 iscsi_session_reconnect(struct iscsi_session *is) in iscsi_session_reconnect() argument
558 if (is->is_reconnecting) in iscsi_session_reconnect()
561 is->is_reconnecting = true; in iscsi_session_reconnect()
562 cv_signal(&is->is_maintenance_cv); in iscsi_session_reconnect()
566 iscsi_session_terminate(struct iscsi_session *is) in iscsi_session_terminate() argument
569 if (is->is_terminating) in iscsi_session_terminate()
572 is->is_terminating = true; in iscsi_session_terminate()
575 iscsi_session_logout(is); in iscsi_session_terminate()
577 cv_signal(&is->is_maintenance_cv); in iscsi_session_terminate()
585 struct iscsi_session *is; in iscsi_callout() local
589 is = context; in iscsi_callout()
591 ISCSI_SESSION_LOCK(is); in iscsi_callout()
592 if (is->is_terminating) { in iscsi_callout()
593 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
599 callout_schedule_sbt(&is->is_callout, sbt, pr, 0); in iscsi_callout()
601 if (is->is_conf.isc_enable == 0) in iscsi_callout()
604 is->is_timeout++; in iscsi_callout()
606 if (is->is_waiting_for_iscsid) { in iscsi_callout()
607 if (iscsid_timeout > 0 && is->is_timeout > iscsid_timeout) { in iscsi_callout()
608 ISCSI_SESSION_WARN(is, "timed out waiting for iscsid(8) " in iscsi_callout()
610 is->is_timeout); in iscsi_callout()
616 if (is->is_login_phase) { in iscsi_callout()
617 if (is->is_login_timeout > 0 && is->is_timeout > is->is_login_timeout) { in iscsi_callout()
618 ISCSI_SESSION_WARN(is, "login timed out after %d seconds; " in iscsi_callout()
619 "reconnecting", is->is_timeout); in iscsi_callout()
625 if (is->is_ping_timeout <= 0) { in iscsi_callout()
631 is->is_timeout = 0; in iscsi_callout()
635 if (is->is_timeout >= is->is_ping_timeout) { in iscsi_callout()
636 ISCSI_SESSION_WARN(is, "no ping reply (NOP-In) after %d seconds; " in iscsi_callout()
637 "reconnecting", is->is_ping_timeout); in iscsi_callout()
642 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
652 if (is->is_timeout < 2) in iscsi_callout()
655 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_callout()
657 ISCSI_SESSION_WARN(is, "failed to allocate PDU"); in iscsi_callout()
669 if (is->is_terminating) { in iscsi_callout()
670 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
674 ISCSI_SESSION_UNLOCK(is); in iscsi_callout()
677 iscsi_session_reconnect(is); in iscsi_callout()
684 struct iscsi_session *is; in iscsi_pdu_update_statsn() local
687 is = PDU_SESSION(response); in iscsi_pdu_update_statsn()
689 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_pdu_update_statsn()
705 if (statsn != is->is_statsn && statsn != (is->is_statsn + 1)) { in iscsi_pdu_update_statsn()
707 ISCSI_SESSION_WARN(is, "PDU 0x%x StatSN %u != " in iscsi_pdu_update_statsn()
709 bhsdi->bhsdi_opcode, statsn, is->is_statsn); in iscsi_pdu_update_statsn()
710 iscsi_session_reconnect(is); in iscsi_pdu_update_statsn()
712 if (ISCSI_SNGT(statsn, is->is_statsn)) in iscsi_pdu_update_statsn()
713 is->is_statsn = statsn; in iscsi_pdu_update_statsn()
720 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
724 if (ISCSI_SNGT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
725 is->is_maxcmdsn = maxcmdsn; in iscsi_pdu_update_statsn()
731 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_update_statsn()
732 cv_signal(&is->is_maintenance_cv); in iscsi_pdu_update_statsn()
733 } else if (ISCSI_SNLT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
735 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
737 maxcmdsn, is->is_maxcmdsn); in iscsi_pdu_update_statsn()
740 if (ISCSI_SNGT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
741 is->is_expcmdsn = expcmdsn; in iscsi_pdu_update_statsn()
742 } else if (ISCSI_SNLT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
744 ISCSI_SESSION_DEBUG(is, in iscsi_pdu_update_statsn()
746 expcmdsn, is->is_expcmdsn); in iscsi_pdu_update_statsn()
756 is->is_timeout = 0; in iscsi_pdu_update_statsn()
762 struct iscsi_session *is; in iscsi_receive_callback() local
764 is = PDU_SESSION(response); in iscsi_receive_callback()
766 ISCSI_SESSION_LOCK(is); in iscsi_receive_callback()
771 if (is->is_login_phase) { in iscsi_receive_callback()
772 if (is->is_login_pdu == NULL) in iscsi_receive_callback()
773 is->is_login_pdu = response; in iscsi_receive_callback()
776 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
777 cv_signal(&is->is_login_cv); in iscsi_receive_callback()
789 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
794 ISCSI_SESSION_LOCK_ASSERT_NOT(is); in iscsi_receive_callback()
798 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
803 ISCSI_SESSION_LOCK_ASSERT_NOT(is); in iscsi_receive_callback()
807 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
811 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
815 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
819 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
822 ISCSI_SESSION_WARN(is, "received PDU with unsupported " in iscsi_receive_callback()
825 iscsi_session_reconnect(is); in iscsi_receive_callback()
826 ISCSI_SESSION_UNLOCK(is); in iscsi_receive_callback()
834 struct iscsi_session *is; in iscsi_error_callback() local
836 is = CONN_SESSION(ic); in iscsi_error_callback()
838 ISCSI_SESSION_WARN(is, "connection error; reconnecting"); in iscsi_error_callback()
839 iscsi_session_reconnect(is); in iscsi_error_callback()
845 struct iscsi_session *is; in iscsi_pdu_handle_nop_in() local
853 is = PDU_SESSION(response); in iscsi_pdu_handle_nop_in()
869 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
872 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
880 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
884 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
896 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_nop_in()
901 iscsi_session_reconnect(is); in iscsi_pdu_handle_nop_in()
916 struct iscsi_session *is; in iscsi_pdu_handle_scsi_response() local
923 is = PDU_SESSION(response); in iscsi_pdu_handle_scsi_response()
926 io = iscsi_outstanding_find(is, bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
928 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
930 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
931 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
938 ISCSI_SESSION_WARN(is, in iscsi_pdu_handle_scsi_response()
953 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
954 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
959 ISCSI_SESSION_WARN(is, in iscsi_pdu_handle_scsi_response()
963 iscsi_session_reconnect(is); in iscsi_pdu_handle_scsi_response()
964 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
974 if (is->is_conn->ic_iser) { in iscsi_pdu_handle_scsi_response()
979 ISCSI_SESSION_WARN(is, "overflow: target indicates %d", resid); in iscsi_pdu_handle_scsi_response()
986 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_scsi_response()
987 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_scsi_response()
990 ISCSI_SESSION_WARN(is, "service response 0x%x", bhssr->bhssr_response); in iscsi_pdu_handle_scsi_response()
993 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1001 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1011 ISCSI_SESSION_WARN(is, "truncated data segment (%zd bytes)", in iscsi_pdu_handle_scsi_response()
1015 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1023 ISCSI_SESSION_DEBUG(is, "sense_len %d, data len %zd", in iscsi_pdu_handle_scsi_response()
1027 ISCSI_SESSION_WARN(is, "truncated data segment " in iscsi_pdu_handle_scsi_response()
1032 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_scsi_response()
1037 ISCSI_SESSION_WARN(is, "oversize data segment " in iscsi_pdu_handle_scsi_response()
1041 ISCSI_SESSION_DEBUG(is, "truncating sense from %d to %d", in iscsi_pdu_handle_scsi_response()
1059 ISCSI_SESSION_WARN(is, "underflow mismatch: " in iscsi_pdu_handle_scsi_response()
1076 struct iscsi_session *is; in iscsi_pdu_handle_task_response() local
1078 is = PDU_SESSION(response); in iscsi_pdu_handle_task_response()
1081 io = iscsi_outstanding_find(is, bhstmr->bhstmr_initiator_task_tag); in iscsi_pdu_handle_task_response()
1083 ISCSI_SESSION_WARN(is, "bad itt 0x%x", in iscsi_pdu_handle_task_response()
1086 iscsi_session_reconnect(is); in iscsi_pdu_handle_task_response()
1091 ISCSI_SESSION_WARN(is, "task response 0x%x", in iscsi_pdu_handle_task_response()
1094 aio = iscsi_outstanding_find(is, io->io_referenced_task_tag); in iscsi_pdu_handle_task_response()
1096 iscsi_session_terminate_task(is, aio, CAM_REQ_ABORTED); in iscsi_pdu_handle_task_response()
1099 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_task_response()
1126 struct iscsi_session *is; in iscsi_pdu_handle_data_in() local
1131 is = PDU_SESSION(response); in iscsi_pdu_handle_data_in()
1133 io = iscsi_outstanding_find(is, bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1135 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1137 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1138 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1143 ISCSI_SESSION_WARN(is, "received Data-In PDU with " in iscsi_pdu_handle_data_in()
1147 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1148 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1160 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1171 ISCSI_SESSION_WARN(is, "data out of order; expected offset %zd, got %zd", in iscsi_pdu_handle_data_in()
1174 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1175 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1183 ISCSI_SESSION_WARN(is, "oversize data segment (%zd bytes " in iscsi_pdu_handle_data_in()
1187 iscsi_session_reconnect(is); in iscsi_pdu_handle_data_in()
1188 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1196 iscsi_outstanding_remove(is, io); in iscsi_pdu_handle_data_in()
1197 ISCSI_SESSION_UNLOCK(is); in iscsi_pdu_handle_data_in()
1218 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_pdu_handle_data_in()
1230 ISCSI_SESSION_WARN(is, "underflow mismatch: " in iscsi_pdu_handle_data_in()
1270 struct iscsi_session *is; in iscsi_pdu_handle_r2t() local
1279 is = PDU_SESSION(response); in iscsi_pdu_handle_r2t()
1282 io = iscsi_outstanding_find(is, bhsr2t->bhsr2t_initiator_task_tag); in iscsi_pdu_handle_r2t()
1284 ISCSI_SESSION_WARN(is, "bad itt 0x%x; reconnecting", in iscsi_pdu_handle_r2t()
1287 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1294 ISCSI_SESSION_WARN(is, "received R2T for read command; reconnecting"); in iscsi_pdu_handle_r2t()
1296 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1306 ISCSI_SESSION_WARN(is, "target requested invalid offset " in iscsi_pdu_handle_r2t()
1309 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1315 ISCSI_SESSION_WARN(is, "target requested invalid length " in iscsi_pdu_handle_r2t()
1318 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1324 if (is->is_conn->ic_hw_isomax != 0) in iscsi_pdu_handle_r2t()
1325 max_send_data_segment_length = is->is_conn->ic_hw_isomax; in iscsi_pdu_handle_r2t()
1328 is->is_conn->ic_max_send_data_segment_length; in iscsi_pdu_handle_r2t()
1336 ISCSI_SESSION_WARN(is, "target requested invalid " in iscsi_pdu_handle_r2t()
1340 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1347 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1363 ISCSI_SESSION_WARN(is, "failed to allocate memory; " in iscsi_pdu_handle_r2t()
1367 iscsi_session_reconnect(is); in iscsi_pdu_handle_r2t()
1372 is->is_conn->ic_max_send_data_segment_length); in iscsi_pdu_handle_r2t()
1396 struct iscsi_session *is; in iscsi_pdu_handle_async_message() local
1398 is = PDU_SESSION(response); in iscsi_pdu_handle_async_message()
1402 ISCSI_SESSION_WARN(is, "target requests logout; removing session"); in iscsi_pdu_handle_async_message()
1403 iscsi_session_logout(is); in iscsi_pdu_handle_async_message()
1404 iscsi_session_terminate(is); in iscsi_pdu_handle_async_message()
1407 ISCSI_SESSION_WARN(is, "target indicates it will drop the connection"); in iscsi_pdu_handle_async_message()
1410 ISCSI_SESSION_WARN(is, "target indicates it will drop the session"); in iscsi_pdu_handle_async_message()
1417 ISCSI_SESSION_WARN(is, "ignoring AsyncEvent %d", bhsam->bhsam_async_event); in iscsi_pdu_handle_async_message()
1428 struct iscsi_session *is; in iscsi_pdu_handle_reject() local
1430 is = PDU_SESSION(response); in iscsi_pdu_handle_reject()
1432 ISCSI_SESSION_WARN(is, "received Reject PDU, reason 0x%x; protocol error?", in iscsi_pdu_handle_reject()
1442 struct iscsi_session *is; in iscsi_ioctl_daemon_wait() local
1447 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_wait()
1448 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_wait()
1449 if (is->is_conf.isc_enable == 0 && in iscsi_ioctl_daemon_wait()
1450 is->is_conf.isc_discovery == 0) { in iscsi_ioctl_daemon_wait()
1451 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1454 if (is->is_waiting_for_iscsid) in iscsi_ioctl_daemon_wait()
1456 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1459 if (is == NULL) { in iscsi_ioctl_daemon_wait()
1476 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_wait()
1477 is->is_login_phase = true; in iscsi_ioctl_daemon_wait()
1478 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_wait()
1479 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_wait()
1481 request->idr_session_id = is->is_id; in iscsi_ioctl_daemon_wait()
1482 memcpy(&request->idr_isid, &is->is_isid, in iscsi_ioctl_daemon_wait()
1485 memcpy(&request->idr_conf, &is->is_conf, in iscsi_ioctl_daemon_wait()
1493 error = icl_limits(is->is_conf.isc_offload, in iscsi_ioctl_daemon_wait()
1494 is->is_conf.isc_iser, 0, &idl); in iscsi_ioctl_daemon_wait()
1496 ISCSI_SESSION_WARN(is, "icl_limits for " in iscsi_ioctl_daemon_wait()
1498 is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_wait()
1523 struct iscsi_session *is; in iscsi_ioctl_daemon_limits() local
1531 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_limits()
1532 if (is->is_id == limits->idl_session_id) in iscsi_ioctl_daemon_limits()
1535 if (is == NULL) { in iscsi_ioctl_daemon_limits()
1540 error = icl_limits(is->is_conf.isc_offload, is->is_conf.isc_iser, in iscsi_ioctl_daemon_limits()
1544 ISCSI_SESSION_WARN(is, "icl_limits for offload \"%s\" " in iscsi_ioctl_daemon_limits()
1545 "failed with error %d", is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_limits()
1564 struct iscsi_session *is; in iscsi_ioctl_daemon_handoff() local
1573 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_handoff()
1574 if (is->is_id == handoff->idh_session_id) in iscsi_ioctl_daemon_handoff()
1577 if (is == NULL) { in iscsi_ioctl_daemon_handoff()
1581 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1582 ic = is->is_conn; in iscsi_ioctl_daemon_handoff()
1583 if (is->is_conf.isc_discovery || is->is_terminating) { in iscsi_ioctl_daemon_handoff()
1584 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1588 if (is->is_connected) { in iscsi_ioctl_daemon_handoff()
1594 ISCSI_SESSION_WARN(is, "handoff on already connected " in iscsi_ioctl_daemon_handoff()
1596 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1601 strlcpy(is->is_target_alias, handoff->idh_target_alias, in iscsi_ioctl_daemon_handoff()
1602 sizeof(is->is_target_alias)); in iscsi_ioctl_daemon_handoff()
1603 is->is_tsih = handoff->idh_tsih; in iscsi_ioctl_daemon_handoff()
1604 is->is_statsn = handoff->idh_statsn; in iscsi_ioctl_daemon_handoff()
1605 is->is_protocol_level = handoff->idh_protocol_level; in iscsi_ioctl_daemon_handoff()
1606 is->is_initial_r2t = handoff->idh_initial_r2t; in iscsi_ioctl_daemon_handoff()
1607 is->is_immediate_data = handoff->idh_immediate_data; in iscsi_ioctl_daemon_handoff()
1613 is->is_max_burst_length = handoff->idh_max_burst_length; in iscsi_ioctl_daemon_handoff()
1614 is->is_first_burst_length = handoff->idh_first_burst_length; in iscsi_ioctl_daemon_handoff()
1626 is->is_cmdsn = 0; in iscsi_ioctl_daemon_handoff()
1627 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1628 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1629 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_handoff()
1630 is->is_login_phase = false; in iscsi_ioctl_daemon_handoff()
1631 is->is_timeout = 0; in iscsi_ioctl_daemon_handoff()
1632 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_daemon_handoff()
1633 if (is->is_ping_timeout < 0) in iscsi_ioctl_daemon_handoff()
1634 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_daemon_handoff()
1635 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_daemon_handoff()
1636 if (is->is_login_timeout < 0) in iscsi_ioctl_daemon_handoff()
1637 is->is_login_timeout = login_timeout; in iscsi_ioctl_daemon_handoff()
1638 is->is_connected = true; in iscsi_ioctl_daemon_handoff()
1639 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_handoff()
1641 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1651 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1657 if (is->is_sim != NULL) { in iscsi_ioctl_daemon_handoff()
1661 KASSERT(is->is_simq_frozen, ("reconnect without frozen simq")); in iscsi_ioctl_daemon_handoff()
1662 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1663 ISCSI_SESSION_DEBUG(is, "releasing"); in iscsi_ioctl_daemon_handoff()
1664 is->is_simq_frozen = false; in iscsi_ioctl_daemon_handoff()
1665 xpt_release_simq(is->is_sim, 1); in iscsi_ioctl_daemon_handoff()
1666 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1669 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_handoff()
1670 is->is_devq = cam_simq_alloc(ic->ic_maxtags); in iscsi_ioctl_daemon_handoff()
1671 if (is->is_devq == NULL) { in iscsi_ioctl_daemon_handoff()
1672 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1673 ISCSI_SESSION_WARN(is, "failed to allocate simq"); in iscsi_ioctl_daemon_handoff()
1674 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1678 is->is_sim = cam_sim_alloc(iscsi_action, NULL, "iscsi", in iscsi_ioctl_daemon_handoff()
1679 is, is->is_id /* unit */, &is->is_lock, in iscsi_ioctl_daemon_handoff()
1680 1, ic->ic_maxtags, is->is_devq); in iscsi_ioctl_daemon_handoff()
1681 if (is->is_sim == NULL) { in iscsi_ioctl_daemon_handoff()
1682 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1683 ISCSI_SESSION_WARN(is, "failed to allocate SIM"); in iscsi_ioctl_daemon_handoff()
1684 cam_simq_free(is->is_devq); in iscsi_ioctl_daemon_handoff()
1685 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1689 if (xpt_bus_register(is->is_sim, NULL, 0) != 0) { in iscsi_ioctl_daemon_handoff()
1690 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1691 ISCSI_SESSION_WARN(is, "failed to register bus"); in iscsi_ioctl_daemon_handoff()
1692 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1696 error = xpt_create_path(&is->is_path, /*periph*/NULL, in iscsi_ioctl_daemon_handoff()
1697 cam_sim_path(is->is_sim), CAM_TARGET_WILDCARD, in iscsi_ioctl_daemon_handoff()
1700 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1701 ISCSI_SESSION_WARN(is, "failed to create path"); in iscsi_ioctl_daemon_handoff()
1702 iscsi_session_terminate(is); in iscsi_ioctl_daemon_handoff()
1705 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_handoff()
1715 struct iscsi_session *is; in iscsi_ioctl_daemon_fail() local
1719 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_fail()
1720 if (is->is_id == fail->idf_session_id) in iscsi_ioctl_daemon_fail()
1723 if (is == NULL) { in iscsi_ioctl_daemon_fail()
1727 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_fail()
1728 ISCSI_SESSION_DEBUG(is, "iscsid(8) failed: %s", in iscsi_ioctl_daemon_fail()
1730 strlcpy(is->is_reason, fail->idf_reason, sizeof(is->is_reason)); in iscsi_ioctl_daemon_fail()
1734 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_fail()
1745 struct iscsi_session *is; in iscsi_ioctl_daemon_connect() local
1750 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_connect()
1751 if (is->is_id == idc->idc_session_id) in iscsi_ioctl_daemon_connect()
1754 if (is == NULL) { in iscsi_ioctl_daemon_connect()
1763 ISCSI_SESSION_WARN(is, in iscsi_ioctl_daemon_connect()
1772 ISCSI_SESSION_WARN(is, "getsockaddr failed with error %d", in iscsi_ioctl_daemon_connect()
1778 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_connect()
1779 is->is_statsn = 0; in iscsi_ioctl_daemon_connect()
1780 is->is_cmdsn = 0; in iscsi_ioctl_daemon_connect()
1781 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_connect()
1782 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_connect()
1783 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_connect()
1784 is->is_login_phase = true; in iscsi_ioctl_daemon_connect()
1785 is->is_timeout = 0; in iscsi_ioctl_daemon_connect()
1786 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_connect()
1788 error = icl_conn_connect(is->is_conn, idc->idc_domain, in iscsi_ioctl_daemon_connect()
1796 is->is_conn->ic_header_crc32c = false; in iscsi_ioctl_daemon_connect()
1797 is->is_conn->ic_data_crc32c = false; in iscsi_ioctl_daemon_connect()
1806 struct iscsi_session *is; in iscsi_ioctl_daemon_send() local
1813 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_send()
1814 if (is->is_id == ids->ids_session_id) in iscsi_ioctl_daemon_send()
1817 if (is == NULL) { in iscsi_ioctl_daemon_send()
1823 if (is->is_login_phase == false) in iscsi_ioctl_daemon_send()
1826 if (is->is_terminating || is->is_reconnecting) in iscsi_ioctl_daemon_send()
1830 if (datalen > is->is_conn->ic_max_send_data_segment_length) in iscsi_ioctl_daemon_send()
1841 ip = icl_pdu_new(is->is_conn, M_WAITOK); in iscsi_ioctl_daemon_send()
1857 struct iscsi_session *is; in iscsi_ioctl_daemon_receive() local
1863 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_receive()
1864 if (is->is_id == idr->idr_session_id) in iscsi_ioctl_daemon_receive()
1867 if (is == NULL) { in iscsi_ioctl_daemon_receive()
1873 if (is->is_login_phase == false) in iscsi_ioctl_daemon_receive()
1876 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_daemon_receive()
1877 while (is->is_login_pdu == NULL && in iscsi_ioctl_daemon_receive()
1878 is->is_terminating == false && in iscsi_ioctl_daemon_receive()
1879 is->is_reconnecting == false) { in iscsi_ioctl_daemon_receive()
1880 error = cv_wait_sig(&is->is_login_cv, &is->is_lock); in iscsi_ioctl_daemon_receive()
1882 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1886 if (is->is_terminating || is->is_reconnecting) { in iscsi_ioctl_daemon_receive()
1887 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1890 ip = is->is_login_pdu; in iscsi_ioctl_daemon_receive()
1891 is->is_login_pdu = NULL; in iscsi_ioctl_daemon_receive()
1892 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_daemon_receive()
1964 struct iscsi_session *is; in iscsi_ioctl_session_add() local
1973 is = malloc(sizeof(*is), M_ISCSI, M_ZERO | M_WAITOK); in iscsi_ioctl_session_add()
1974 memcpy(&is->is_conf, &isa->isa_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_add()
1982 if (!!is->is_conf.isc_discovery != in iscsi_ioctl_session_add()
1986 if (strcmp(is->is_conf.isc_target_addr, in iscsi_ioctl_session_add()
1990 if (is->is_conf.isc_discovery == 0 && in iscsi_ioctl_session_add()
1991 strcmp(is->is_conf.isc_target, in iscsi_ioctl_session_add()
1996 free(is, M_ISCSI); in iscsi_ioctl_session_add()
2000 is->is_conn = icl_new_conn(is->is_conf.isc_offload, in iscsi_ioctl_session_add()
2001 is->is_conf.isc_iser, "iscsi", &is->is_lock); in iscsi_ioctl_session_add()
2002 if (is->is_conn == NULL) { in iscsi_ioctl_session_add()
2004 free(is, M_ISCSI); in iscsi_ioctl_session_add()
2007 is->is_conn->ic_receive = iscsi_receive_callback; in iscsi_ioctl_session_add()
2008 is->is_conn->ic_error = iscsi_error_callback; in iscsi_ioctl_session_add()
2009 is->is_conn->ic_prv0 = is; in iscsi_ioctl_session_add()
2010 TAILQ_INIT(&is->is_outstanding); in iscsi_ioctl_session_add()
2011 STAILQ_INIT(&is->is_postponed); in iscsi_ioctl_session_add()
2012 mtx_init(&is->is_lock, "iscsi_lock", NULL, MTX_DEF); in iscsi_ioctl_session_add()
2013 cv_init(&is->is_maintenance_cv, "iscsi_mt"); in iscsi_ioctl_session_add()
2015 cv_init(&is->is_login_cv, "iscsi_login"); in iscsi_ioctl_session_add()
2025 is->is_conn->ic_max_recv_data_segment_length = 8192; in iscsi_ioctl_session_add()
2026 is->is_conn->ic_max_send_data_segment_length = 8192; in iscsi_ioctl_session_add()
2027 is->is_max_burst_length = 262144; in iscsi_ioctl_session_add()
2028 is->is_first_burst_length = 65536; in iscsi_ioctl_session_add()
2030 is->is_softc = sc; in iscsi_ioctl_session_add()
2032 is->is_id = sc->sc_last_session_id; in iscsi_ioctl_session_add()
2033 is->is_isid[0] = 0x80; /* RFC 3720, 10.12.5: 10b, "Random" ISID. */ in iscsi_ioctl_session_add()
2034 arc4rand(&is->is_isid[1], 5, 0); in iscsi_ioctl_session_add()
2035 is->is_tsih = 0; in iscsi_ioctl_session_add()
2036 callout_init(&is->is_callout, 1); in iscsi_ioctl_session_add()
2038 error = kthread_add(iscsi_maintenance_thread, is, NULL, NULL, 0, 0, "iscsimt"); in iscsi_ioctl_session_add()
2040 ISCSI_SESSION_WARN(is, "kthread_add(9) failed with error %d", error); in iscsi_ioctl_session_add()
2044 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_session_add()
2045 if (is->is_ping_timeout < 0) in iscsi_ioctl_session_add()
2046 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_session_add()
2047 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_session_add()
2048 if (is->is_login_timeout < 0) in iscsi_ioctl_session_add()
2049 is->is_login_timeout = login_timeout; in iscsi_ioctl_session_add()
2053 callout_reset_sbt(&is->is_callout, sbt, pr, iscsi_callout, is, 0); in iscsi_ioctl_session_add()
2054 TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next); in iscsi_ioctl_session_add()
2056 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_add()
2061 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_ioctl_session_add()
2062 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_add()
2067 is->is_waiting_for_iscsid = true; in iscsi_ioctl_session_add()
2068 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_ioctl_session_add()
2069 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_add()
2095 struct iscsi_session *is, *tmp; in iscsi_ioctl_session_remove() local
2101 TAILQ_FOREACH_SAFE(is, &sc->sc_sessions, is_next, tmp) { in iscsi_ioctl_session_remove()
2102 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_remove()
2103 if (iscsi_session_conf_matches(is->is_id, &is->is_conf, in iscsi_ioctl_session_remove()
2106 iscsi_session_logout(is); in iscsi_ioctl_session_remove()
2107 iscsi_session_terminate(is); in iscsi_ioctl_session_remove()
2109 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_remove()
2124 struct iscsi_session *is; in iscsi_ioctl_session_list() local
2128 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_list()
2134 memcpy(&iss.iss_conf, &is->is_conf, sizeof(iss.iss_conf)); in iscsi_ioctl_session_list()
2135 iss.iss_id = is->is_id; in iscsi_ioctl_session_list()
2136 strlcpy(iss.iss_target_alias, is->is_target_alias, sizeof(iss.iss_target_alias)); in iscsi_ioctl_session_list()
2137 strlcpy(iss.iss_reason, is->is_reason, sizeof(iss.iss_reason)); in iscsi_ioctl_session_list()
2138 strlcpy(iss.iss_offload, is->is_conn->ic_offload, sizeof(iss.iss_offload)); in iscsi_ioctl_session_list()
2140 if (is->is_conn->ic_header_crc32c) in iscsi_ioctl_session_list()
2145 if (is->is_conn->ic_data_crc32c) in iscsi_ioctl_session_list()
2151 is->is_conn->ic_max_send_data_segment_length; in iscsi_ioctl_session_list()
2153 is->is_conn->ic_max_recv_data_segment_length; in iscsi_ioctl_session_list()
2154 iss.iss_max_burst_length = is->is_max_burst_length; in iscsi_ioctl_session_list()
2155 iss.iss_first_burst_length = is->is_first_burst_length; in iscsi_ioctl_session_list()
2156 iss.iss_immediate_data = is->is_immediate_data; in iscsi_ioctl_session_list()
2157 iss.iss_connected = is->is_connected; in iscsi_ioctl_session_list()
2177 struct iscsi_session *is; in iscsi_ioctl_session_modify() local
2185 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_modify()
2186 ISCSI_SESSION_LOCK(is); in iscsi_ioctl_session_modify()
2187 if (is->is_id == ism->ism_session_id) { in iscsi_ioctl_session_modify()
2191 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2193 if (is == NULL) { in iscsi_ioctl_session_modify()
2202 if (is == is2) in iscsi_ioctl_session_modify()
2218 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2225 memcpy(&is->is_conf, &ism->ism_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_modify()
2226 ISCSI_SESSION_UNLOCK(is); in iscsi_ioctl_session_modify()
2228 iscsi_session_reconnect(is); in iscsi_ioctl_session_modify()
2288 iscsi_outstanding_find(struct iscsi_session *is, uint32_t initiator_task_tag) in iscsi_outstanding_find() argument
2292 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_find()
2294 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find()
2302 iscsi_outstanding_find_ccb(struct iscsi_session *is, union ccb *ccb) in iscsi_outstanding_find_ccb() argument
2306 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_find_ccb()
2308 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find_ccb()
2316 iscsi_outstanding_add(struct iscsi_session *is, struct icl_pdu *request, in iscsi_outstanding_add() argument
2322 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_add()
2326 ISCSI_SESSION_WARN(is, "failed to allocate %zd bytes", in iscsi_outstanding_add()
2331 error = icl_conn_task_setup(is->is_conn, request, &ccb->csio, in iscsi_outstanding_add()
2334 ISCSI_SESSION_WARN(is, in iscsi_outstanding_add()
2340 KASSERT(iscsi_outstanding_find(is, *initiator_task_tagp) == NULL, in iscsi_outstanding_add()
2345 TAILQ_INSERT_TAIL(&is->is_outstanding, io, io_next); in iscsi_outstanding_add()
2350 iscsi_outstanding_remove(struct iscsi_session *is, struct iscsi_outstanding *io) in iscsi_outstanding_remove() argument
2353 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_outstanding_remove()
2355 icl_conn_task_done(is->is_conn, io->io_icl_prv); in iscsi_outstanding_remove()
2356 TAILQ_REMOVE(&is->is_outstanding, io, io_next); in iscsi_outstanding_remove()
2361 iscsi_action_abort(struct iscsi_session *is, union ccb *ccb) in iscsi_action_abort() argument
2369 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action_abort()
2372 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_abort()
2374 if (is->is_login_phase) { in iscsi_action_abort()
2381 aio = iscsi_outstanding_find_ccb(is, cab->abort_ccb); in iscsi_action_abort()
2388 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_abort()
2395 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2397 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2399 io = iscsi_outstanding_add(is, request, NULL, &initiator_task_tag); in iscsi_action_abort()
2419 iscsi_action_scsiio(struct iscsi_session *is, union ccb *ccb) in iscsi_action_scsiio() argument
2429 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action_scsiio()
2432 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_scsiio()
2434 if (is->is_login_phase) { in iscsi_action_scsiio()
2435 ISCSI_SESSION_DEBUG(is, "called during login phase"); in iscsi_action_scsiio()
2438 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2446 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_scsiio()
2450 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2457 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2459 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2461 io = iscsi_outstanding_add(is, request, ccb, &initiator_task_tag); in iscsi_action_scsiio()
2466 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2505 if (is->is_protocol_level >= 2) { in iscsi_action_scsiio()
2521 if (is->is_immediate_data && in iscsi_action_scsiio()
2525 if (len > is->is_first_burst_length) { in iscsi_action_scsiio()
2526 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, is->is_first_burst_length); in iscsi_action_scsiio()
2527 len = is->is_first_burst_length; in iscsi_action_scsiio()
2529 if (len > is->is_conn->ic_max_send_data_segment_length) { in iscsi_action_scsiio()
2530 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, in iscsi_action_scsiio()
2531 is->is_conn->ic_max_send_data_segment_length); in iscsi_action_scsiio()
2532 len = is->is_conn->ic_max_send_data_segment_length; in iscsi_action_scsiio()
2538 iscsi_outstanding_remove(is, io); in iscsi_action_scsiio()
2542 ISCSI_SESSION_DEBUG(is, "freezing devq"); in iscsi_action_scsiio()
2555 struct iscsi_session *is; in iscsi_action() local
2557 is = cam_sim_softc(sim); in iscsi_action()
2559 ISCSI_SESSION_LOCK_ASSERT(is); in iscsi_action()
2561 if (is->is_terminating || in iscsi_action()
2562 (is->is_connected == false && fail_on_disconnection)) { in iscsi_action()
2571 if (is->is_simq_frozen == true) { in iscsi_action()
2592 if (is->is_conn == NULL) in iscsi_action()
2594 else if (is->is_conn->ic_unmapped) in iscsi_action()
2646 ISCSI_SESSION_DEBUG(is, "faking success for reset, abort, or term_io"); in iscsi_action()
2651 iscsi_action_abort(is, ccb); in iscsi_action()
2654 iscsi_action_scsiio(is, ccb); in iscsi_action()
2658 ISCSI_SESSION_DEBUG(is, "got unsupported code 0x%x", ccb->ccb_h.func_code); in iscsi_action()
2669 struct iscsi_session *is; in iscsi_terminate_sessions() local
2672 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) in iscsi_terminate_sessions()
2673 iscsi_session_terminate(is); in iscsi_terminate_sessions()
2685 struct iscsi_session *is; in iscsi_shutdown_pre() local
2705 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_shutdown_pre()
2706 ISCSI_SESSION_LOCK(is); in iscsi_shutdown_pre()
2707 if (!is->is_connected) { in iscsi_shutdown_pre()
2708 ISCSI_SESSION_DEBUG(is, "force failing disconnected session early"); in iscsi_shutdown_pre()
2709 iscsi_session_reconnect(is); in iscsi_shutdown_pre()
2711 ISCSI_SESSION_UNLOCK(is); in iscsi_shutdown_pre()