Lines Matching defs:isp

78 static iscsi_status_t iscsi_sess_threads_create(iscsi_sess_t *isp);
79 static void iscsi_sess_flush(iscsi_sess_t *isp);
80 static void iscsi_sess_offline_luns(iscsi_sess_t *isp);
82 iscsi_sess_t *isp, uint16_t *lun_data, uint8_t *lun_addr_type);
85 static void iscsi_sess_state_free(iscsi_sess_t *isp,
87 static void iscsi_sess_state_logged_in(iscsi_sess_t *isp,
89 static void iscsi_sess_state_failed(iscsi_sess_t *isp,
91 static void iscsi_sess_state_in_flush(iscsi_sess_t *isp,
93 static void iscsi_sess_state_flushed(iscsi_sess_t *isp,
98 static iscsi_status_t iscsi_sess_testunitready(iscsi_sess_t *isp,
100 static iscsi_status_t iscsi_sess_reportluns(iscsi_sess_t *isp,
102 static void iscsi_sess_inquiry(iscsi_sess_t *isp, uint16_t lun_num,
104 static void iscsi_sess_update_busy_luns(iscsi_sess_t *isp, boolean_t clear);
105 static void iscsi_sess_enum_warn(iscsi_sess_t *isp, iscsi_enum_result_t r);
117 iscsi_sess_t *isp = NULL;
126 if (isp != NULL) {
127 (void) iscsi_sess_destroy(isp);
130 for (isp = ihp->hba_sess_list; isp; isp = isp->sess_next) {
132 if ((strcmp((char *)isp->sess_name, target_name) == 0) &&
133 (isp->sess_isid[5] == isid_lsb)) {
136 if (isp->sess_tpgt_conf == tpgt) {
138 *oid = isp->sess_oid;
139 if (isp->sess_wd_thread != NULL &&
140 isp->sess_ic_thread != NULL) {
141 return (isp);
144 if (isp->sess_wd_thread == NULL) {
154 ihp->hba_oid, isp->sess_oid) <
156 isp->sess_wd_thread =
161 isp);
163 isp->sess_wd_thread);
167 if (isp->sess_wd_thread == NULL) {
173 if (isp->sess_ic_thread == NULL) {
174 status = iscsi_sess_threads_create(isp);
179 return (isp);
187 if ((((isp->sess_tpgt_conf == ISCSI_DEFAULT_TPGT) &&
189 ((isp->sess_tpgt_conf != ISCSI_DEFAULT_TPGT) &&
197 isp = (iscsi_sess_t *)kmem_zalloc(sizeof (iscsi_sess_t), KM_SLEEP);
204 isp->sess_target_oid = iscsi_targetparam_get_oid(
210 isp->sess_boot = B_TRUE;
212 isp->sess_boot = B_FALSE;
218 isp->sess_discovered_by = method;
220 bzero(&isp->sess_discovered_addr,
221 sizeof (isp->sess_discovered_addr));
223 bcopy(addr_dsc, &isp->sess_discovered_addr,
229 isp->sess_oid = iscsi_oid++;
230 *oid = isp->sess_oid;
234 isp->sess_name_length = 0;
235 isp->sess_sig = ISCSI_SIG_SESS;
236 isp->sess_state = ISCSI_SESS_STATE_FREE;
237 rw_init(&isp->sess_state_rwlock, NULL, RW_DRIVER, NULL);
238 mutex_init(&isp->sess_reset_mutex, NULL, MUTEX_DRIVER, NULL);
239 isp->sess_hba = ihp;
241 isp->sess_isid[0] = ISCSI_SUN_ISID_0;
242 isp->sess_isid[1] = ISCSI_SUN_ISID_1;
243 isp->sess_isid[2] = ISCSI_SUN_ISID_2;
244 isp->sess_isid[3] = ISCSI_SUN_ISID_3;
245 isp->sess_isid[4] = 0;
246 isp->sess_isid[5] = isid_lsb;
248 isp->sess_cmdsn = 1;
249 isp->sess_expcmdsn = 1;
250 isp->sess_maxcmdsn = 1;
251 isp->sess_last_err = NoError;
252 isp->sess_tsid = 0;
253 isp->sess_type = type;
254 isp->sess_reset_in_progress = B_FALSE;
255 isp->sess_boot_nic_reset = B_FALSE;
256 idm_sm_audit_init(&isp->sess_state_audit);
259 bcopy(&ihp->hba_params, &isp->sess_params,
263 bcopy((char *)target_name, isp->sess_name, len);
264 isp->sess_name_length = len;
265 isp->sess_tpgt_conf = tpgt;
266 isp->sess_tpgt_nego = ISCSI_DEFAULT_TPGT;
269 iscsi_init_queue(&isp->sess_queue_pending);
270 iscsi_init_queue(&isp->sess_queue_completion);
273 isp->sess_lun_list = NULL;
274 rw_init(&isp->sess_lun_list_rwlock, NULL, RW_DRIVER, NULL);
277 isp->sess_conn_act = NULL;
278 isp->sess_conn_list = NULL;
279 rw_init(&isp->sess_conn_list_rwlock, NULL, RW_DRIVER, NULL);
281 mutex_init(&isp->sess_cmdsn_mutex, NULL, MUTEX_DRIVER, NULL);
286 ISCSI_SESS_LOGIN_TASKQ_NAME_FORMAT, ihp->hba_oid, isp->sess_oid) <
288 isp->sess_login_taskq = ddi_taskq_create(ihp->hba_dip,
291 if (isp->sess_login_taskq == NULL) {
297 ISCSI_SESS_ENUM_TASKQ_NAME_FORMAT, ihp->hba_oid, isp->sess_oid) <
299 isp->sess_enum_taskq = ddi_taskq_create(ihp->hba_dip,
303 if (isp->sess_enum_taskq == NULL) {
309 ISCSI_SESS_WD_NAME_FORMAT, ihp->hba_oid, isp->sess_oid) <
311 isp->sess_wd_thread = iscsi_thread_create(ihp->hba_dip,
312 th_name, iscsi_wd_thread, isp);
313 (void) iscsi_thread_start(isp->sess_wd_thread);
317 if (isp->sess_wd_thread == NULL) {
321 status = iscsi_sess_threads_create(isp);
328 ihp->hba_sess_list = isp;
330 isp->sess_next = ihp->hba_sess_list;
331 ihp->hba_sess_list = isp;
335 (void) iscsi_sess_kstat_init(isp);
338 isp->sess_enum_status = ISCSI_SESS_ENUM_FREE;
339 isp->sess_enum_result = ISCSI_SESS_ENUM_COMPLETE;
340 isp->sess_enum_result_count = 0;
341 mutex_init(&isp->sess_enum_lock, NULL, MUTEX_DRIVER, NULL);
342 cv_init(&isp->sess_enum_cv, NULL, CV_DRIVER, NULL);
345 mutex_init(&isp->sess_state_wmutex, NULL, MUTEX_DRIVER, NULL);
346 cv_init(&isp->sess_state_wcv, NULL, CV_DRIVER, NULL);
347 isp->sess_state_hasw = B_FALSE;
349 isp->sess_state_event_count = 0;
351 return (isp);
353 ddi_taskq_destroy(isp->sess_enum_taskq);
355 ddi_taskq_destroy(isp->sess_login_taskq);
357 if (isp->sess_wd_thread != NULL) {
358 iscsi_thread_destroy(isp->sess_wd_thread);
359 isp->sess_wd_thread = NULL;
361 if (isp->sess_ic_thread != NULL) {
362 iscsi_thread_destroy(isp->sess_ic_thread);
363 isp->sess_ic_thread = NULL;
365 mutex_destroy(&isp->sess_cmdsn_mutex);
366 rw_destroy(&isp->sess_conn_list_rwlock);
367 rw_destroy(&isp->sess_lun_list_rwlock);
368 iscsi_destroy_queue(&isp->sess_queue_completion);
369 iscsi_destroy_queue(&isp->sess_queue_pending);
370 rw_destroy(&isp->sess_state_rwlock);
371 mutex_destroy(&isp->sess_reset_mutex);
372 kmem_free(isp, sizeof (iscsi_sess_t));
385 iscsi_sess_t *isp = NULL;
391 for (isp = ihp->hba_sess_list; isp; isp = isp->sess_next) {
393 if (isp->sess_oid == oid) {
400 if (isp != NULL) {
402 *ispp = isp;
415 iscsi_sess_t *isp;
421 isp = (iscsi_sess_t *)arg;
423 ASSERT(isp != NULL);
424 ihp = isp->sess_hba;
434 if (ddi_get_lbolt() < isp->sess_failure_lbolt +
435 SEC_TO_TICK(isp->sess_storm_delay)) {
452 icp = isp->sess_conn_act;
454 icp = isp->sess_conn_list;
455 for (idx = 0; idx < (isp->sess_isid[5] %
456 isp->sess_conn_next_cid); idx++) {
460 isp->sess_conn_act = icp;
465 "no connection assigned", isp->sess_oid);
493 isp->sess_conn_act = icp;
496 isp->sess_failure_lbolt = ddi_get_lbolt();
497 if (isp->sess_storm_delay == 0) {
498 isp->sess_storm_delay++;
501 if ((isp->sess_storm_delay * 2) <
503 isp->sess_storm_delay =
504 isp->sess_storm_delay * 2;
506 isp->sess_storm_delay =
512 isp->sess_storm_delay = 0;
513 isp->sess_failure_lbolt = 0;
517 event_count = atomic_inc_32_nv(&isp->sess_state_event_count);
518 iscsi_sess_enter_state_zone(isp);
519 iscsi_sess_state_machine(isp,
521 iscsi_sess_exit_state_zone(isp);
532 iscsi_sess_destroy(iscsi_sess_t *isp)
541 ASSERT(isp != NULL);
542 ihp = isp->sess_hba;
556 rw_enter(&isp->sess_lun_list_rwlock, RW_WRITER);
557 ilp = isp->sess_lun_list;
567 rw_exit(&isp->sess_lun_list_rwlock);
574 rw_enter(&isp->sess_conn_list_rwlock, RW_WRITER);
575 icp = isp->sess_conn_list;
583 rw_exit(&isp->sess_conn_list_rwlock);
587 rw_exit(&isp->sess_conn_list_rwlock);
594 ASSERT(isp->sess_state == ISCSI_SESS_STATE_FREE ||
595 isp->sess_state == ISCSI_SESS_STATE_FAILED);
598 if (isp->sess_wd_thread) {
599 iscsi_thread_destroy(isp->sess_wd_thread);
600 isp->sess_wd_thread = NULL;
604 rw_enter(&isp->sess_conn_list_rwlock, RW_WRITER);
605 icp = isp->sess_conn_list;
609 rw_exit(&isp->sess_conn_list_rwlock);
612 icp = isp->sess_conn_list;
614 rw_exit(&isp->sess_conn_list_rwlock);
617 if (isp->sess_ic_thread != NULL) {
618 iscsi_thread_destroy(isp->sess_ic_thread);
619 isp->sess_ic_thread = NULL;
623 ddi_taskq_destroy(isp->sess_enum_taskq);
624 ddi_taskq_destroy(isp->sess_login_taskq);
627 iscsi_destroy_queue(&isp->sess_queue_pending);
628 iscsi_destroy_queue(&isp->sess_queue_completion);
631 if (ihp->hba_sess_list == isp) {
633 ihp->hba_sess_list = isp->sess_next;
636 * search hba list for isp pointing
642 if (t_isp->sess_next == isp) {
647 if (t_isp->sess_next == isp) {
648 t_isp->sess_next = isp->sess_next;
655 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
657 mutex_enter(&isp->sess_enum_lock);
658 while (isp->sess_enum_result_count > 0) {
659 cv_wait(&isp->sess_enum_cv, &isp->sess_enum_lock);
661 mutex_exit(&isp->sess_enum_lock);
665 (void) iscsi_sess_kstat_term(isp);
666 rw_destroy(&isp->sess_lun_list_rwlock);
667 rw_destroy(&isp->sess_conn_list_rwlock);
668 mutex_destroy(&isp->sess_cmdsn_mutex);
669 rw_destroy(&isp->sess_state_rwlock);
670 mutex_destroy(&isp->sess_reset_mutex);
671 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
672 mutex_destroy(&isp->sess_enum_lock);
673 cv_destroy(&isp->sess_enum_cv);
675 mutex_destroy(&isp->sess_state_wmutex);
676 cv_destroy(&isp->sess_state_wcv);
677 kmem_free(isp, sizeof (iscsi_sess_t));
687 iscsi_sess_set_auth(iscsi_sess_t *isp)
694 if (isp == (iscsi_sess_t *)NULL) {
699 if (isp->sess_hba == (iscsi_hba_t *)NULL) {
703 init_name = (char *)isp->sess_hba->hba_name;
706 bzero(&isp->sess_auth, sizeof (iscsi_auth_t));
708 if (isp->sess_boot == B_FALSE) {
713 if (persistent_auth_get((char *)isp->sess_name, auth)
740 if (persistent_chap_get((char *)isp->sess_name, chap)
742 int name_len = strlen((char *)isp->sess_name);
743 bcopy((char *)isp->sess_name, chap->c_user, name_len);
745 (void) (persistent_chap_set((char *)isp->sess_name,
756 isp->sess_auth.password_length = 0;
761 bcopy(chap->c_user, isp->sess_auth.username,
763 bcopy(chap->c_secret, isp->sess_auth.password,
765 isp->sess_auth.password_length = chap->c_secret_len;
768 isp->sess_auth.password_length = 0;
778 isp->sess_auth.bidirectional_auth = 1;
782 if (persistent_chap_get((char *)isp->sess_name, chap)
785 isp->sess_auth.password_in,
787 bcopy(chap->c_user, isp->sess_auth.username_in,
789 isp->sess_auth.password_length_in =
800 isp->sess_auth.bidirectional_auth = 0;
825 isp->sess_auth.password,
833 (void) bcopy(init_name, isp->sess_auth.username,
838 isp->sess_auth.username, strlen((char *)tmp));
841 isp->sess_auth.password_length =
850 isp->sess_auth.password_in, strlen((char *)tmp));
857 (void) bcopy(isp->sess_name,
858 isp->sess_auth.username_in,
859 isp->sess_name_length);
863 isp->sess_auth.username_in,
867 isp->sess_auth.password_length_in =
869 isp->sess_auth.bidirectional_auth = 1;
874 if ((isp->sess_auth.password_length != 0) ||
875 (isp->sess_auth.password_length_in != 0)) {
876 isp->sess_auth.num_auth_buffers = 5;
877 isp->sess_auth.auth_buffers[0].address =
878 &(isp->sess_auth.auth_client_block);
879 isp->sess_auth.auth_buffers[0].length =
880 sizeof (isp->sess_auth.auth_client_block);
881 isp->sess_auth.auth_buffers[1].address =
882 &(isp->sess_auth.auth_recv_string_block);
883 isp->sess_auth.auth_buffers[1].length =
884 sizeof (isp->sess_auth.auth_recv_string_block);
885 isp->sess_auth.auth_buffers[2].address =
886 &(isp->sess_auth.auth_send_string_block);
887 isp->sess_auth.auth_buffers[2].length =
888 sizeof (isp->sess_auth.auth_send_string_block);
889 isp->sess_auth.auth_buffers[3].address =
890 &(isp->sess_auth.auth_recv_binary_block);
891 isp->sess_auth.auth_buffers[3].length =
892 sizeof (isp->sess_auth.auth_recv_binary_block);
893 isp->sess_auth.auth_buffers[4].address =
894 &(isp->sess_auth.auth_send_binary_block);
895 isp->sess_auth.auth_buffers[4].length =
896 sizeof (isp->sess_auth.auth_send_binary_block);
932 iscsi_sess_reserve_itt(iscsi_sess_t *isp, iscsi_cmd_t *icmdp)
935 if (isp->sess_cmd_table_count >= ISCSI_CMD_TABLE_SIZE) {
942 if (isp->sess_itt < IDM_TASKIDS_MAX)
943 isp->sess_itt = IDM_TASKIDS_MAX;
953 while (isp->sess_cmd_table[isp->sess_itt %
955 isp->sess_itt++;
959 icmdp->cmd_itt = isp->sess_itt;
960 isp->sess_cmd_table[isp->sess_itt %
962 isp->sess_cmd_table_count++;
963 isp->sess_itt++;
972 iscsi_sess_release_itt(iscsi_sess_t *isp, iscsi_cmd_t *icmdp)
976 ASSERT(isp->sess_cmd_table[hash_index] != NULL);
979 isp->sess_cmd_table[hash_index] = NULL;
980 isp->sess_cmd_table_count--;
988 iscsi_sess_redrive_io(iscsi_sess_t *isp)
992 ASSERT(isp != NULL);
994 icp = isp->sess_conn_list;
1085 iscsi_sess_state_machine(iscsi_sess_t *isp, iscsi_sess_event_t event,
1088 ASSERT(isp != NULL);
1089 ASSERT(rw_read_locked(&isp->sess_state_rwlock) == 0);
1091 DTRACE_PROBE3(event, iscsi_sess_t *, isp,
1092 char *, iscsi_sess_state_str(isp->sess_state),
1096 idm_sm_audit_event(&isp->sess_state_audit,
1097 SAS_ISCSI_SESS, isp->sess_state, event, NULL);
1099 isp->sess_prev_state = isp->sess_state;
1100 isp->sess_state_lbolt = ddi_get_lbolt();
1103 "DEBUG: sess_state: isp: %p state: %d event: %d event count: %d",
1104 (void *)isp, isp->sess_state, event, event_count);
1105 switch (isp->sess_state) {
1107 iscsi_sess_state_free(isp, event, event_count);
1110 iscsi_sess_state_logged_in(isp, event, event_count);
1113 iscsi_sess_state_failed(isp, event, event_count);
1116 iscsi_sess_state_in_flush(isp, event, event_count);
1119 iscsi_sess_state_flushed(isp, event, event_count);
1126 if (isp->sess_prev_state != isp->sess_state) {
1127 idm_sm_audit_state_change(&isp->sess_state_audit,
1128 SAS_ISCSI_SESS, isp->sess_prev_state, isp->sess_state);
1169 iscsi_sess_state_free(iscsi_sess_t *isp, iscsi_sess_event_t event,
1175 ASSERT(isp != NULL);
1176 ihp = isp->sess_hba;
1178 ASSERT(isp->sess_state == ISCSI_SESS_STATE_FREE);
1186 isp->sess_state = ISCSI_SESS_STATE_LOGGED_IN;
1187 rw_downgrade(&isp->sess_state_rwlock);
1188 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1191 isp->sess_oid, isp->sess_name);
1193 iscsi_sess_enum_request(isp, B_TRUE,
1197 iscsi_sess_enum_query(isp);
1200 iscsi_sess_enum_warn(isp, enum_result);
1241 iscsi_sess_state_logged_in(iscsi_sess_t *isp, iscsi_sess_event_t event,
1246 ASSERT(isp != NULL);
1247 ASSERT(isp->sess_state == ISCSI_SESS_STATE_LOGGED_IN);
1260 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1261 rw_downgrade(&isp->sess_state_rwlock);
1263 iscsi_sess_enum_request(isp, B_TRUE, event_count);
1265 enum_result = iscsi_sess_enum_query(isp);
1268 iscsi_sess_enum_warn(isp, enum_result);
1288 isp->sess_state = ISCSI_SESS_STATE_FREE;
1290 isp->sess_state = ISCSI_SESS_STATE_FAILED;
1292 rw_downgrade(&isp->sess_state_rwlock);
1295 isp->sess_tpgt_nego = ISCSI_DEFAULT_TPGT;
1297 iscsi_sess_flush(isp);
1300 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1303 isp->sess_oid, isp->sess_name);
1314 iscsi_sess_offline_luns(isp);
1317 mutex_enter(&isp->sess_reset_mutex);
1318 isp->sess_reset_in_progress = B_FALSE;
1319 mutex_exit(&isp->sess_reset_mutex);
1321 iscsi_sess_update_busy_luns(isp, B_TRUE);
1340 isp->sess_state = ISCSI_SESS_STATE_IN_FLUSH;
1355 iscsi_sess_state_failed(iscsi_sess_t *isp, iscsi_sess_event_t event,
1361 ASSERT(isp != NULL);
1362 ihp = isp->sess_hba;
1364 ASSERT(isp->sess_state == ISCSI_SESS_STATE_FAILED);
1370 isp->sess_state = ISCSI_SESS_STATE_LOGGED_IN;
1371 rw_downgrade(&isp->sess_state_rwlock);
1372 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1374 iscsi_sess_enum_request(isp, B_TRUE,
1378 iscsi_sess_enum_query(isp);
1381 iscsi_sess_enum_warn(isp, enum_result);
1400 isp->sess_state = ISCSI_SESS_STATE_FREE;
1402 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1404 isp->sess_oid, isp->sess_name);
1407 rw_downgrade(&isp->sess_state_rwlock);
1408 iscsi_sess_offline_luns(isp);
1431 iscsi_sess_state_in_flush(iscsi_sess_t *isp, iscsi_sess_event_t event,
1434 ASSERT(isp != NULL);
1435 ASSERT(isp->sess_state == ISCSI_SESS_STATE_IN_FLUSH);
1459 isp->sess_state = ISCSI_SESS_STATE_FREE;
1461 isp->sess_state = ISCSI_SESS_STATE_FLUSHED;
1463 rw_downgrade(&isp->sess_state_rwlock);
1466 isp->sess_tpgt_nego = ISCSI_DEFAULT_TPGT;
1467 iscsi_sess_flush(isp);
1470 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1473 isp->sess_oid, isp->sess_name);
1484 iscsi_sess_offline_luns(isp);
1487 mutex_enter(&isp->sess_reset_mutex);
1488 isp->sess_reset_in_progress = B_FALSE;
1489 mutex_exit(&isp->sess_reset_mutex);
1491 iscsi_sess_update_busy_luns(isp, B_TRUE);
1525 iscsi_sess_state_flushed(iscsi_sess_t *isp, iscsi_sess_event_t event,
1531 ASSERT(isp != NULL);
1532 ASSERT(isp->sess_state == ISCSI_SESS_STATE_FLUSHED);
1533 ihp = isp->sess_hba;
1540 isp->sess_state = ISCSI_SESS_STATE_LOGGED_IN;
1541 rw_downgrade(&isp->sess_state_rwlock);
1542 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1544 iscsi_sess_enum_request(isp, B_TRUE,
1548 iscsi_sess_enum_query(isp);
1551 iscsi_sess_enum_warn(isp, enum_result);
1563 isp->sess_state = ISCSI_SESS_STATE_FREE;
1564 rw_downgrade(&isp->sess_state_rwlock);
1566 if (isp->sess_type == ISCSI_SESS_TYPE_NORMAL) {
1568 isp->sess_oid, isp->sess_name);
1571 iscsi_sess_offline_luns(isp);
1616 iscsi_sess_threads_create(iscsi_sess_t *isp)
1621 ASSERT(isp != NULL);
1622 ihp = isp->sess_hba;
1628 isp->sess_oid) >= sizeof (th_name)) {
1632 isp->sess_ic_thread = iscsi_thread_create(ihp->hba_dip,
1633 th_name, iscsi_ic_thread, isp);
1635 if (isp->sess_ic_thread == NULL) {
1639 (void) iscsi_thread_start(isp->sess_ic_thread);
1656 iscsi_sess_t *isp;
1662 isp = (iscsi_sess_t *)itp->t_arg;
1663 ASSERT(isp != NULL);
1669 rval = iscsi_sess_testunitready(isp, event_count);
1676 rval = iscsi_sess_reportluns(isp, event_count);
1684 if (isp->sess_lun_list == NULL) {
1685 iscsi_sess_inquiry(isp, 0, 0, event_count,
1694 mutex_enter(&isp->sess_enum_lock);
1695 if (isp->sess_enum_result_count != 0) {
1696 isp->sess_enum_status = ISCSI_SESS_ENUM_DONE;
1698 isp->sess_enum_status = ISCSI_SESS_ENUM_FREE;
1700 isp->sess_enum_result = enum_result;
1701 cv_broadcast(&isp->sess_enum_cv);
1702 mutex_exit(&isp->sess_enum_lock);
1710 iscsi_sess_testunitready(iscsi_sess_t *isp, uint32_t event_count)
1717 ASSERT(isp != NULL);
1721 (isp->sess_state_event_count == event_count)) {
1732 rval = iscsi_handle_passthru(isp, 0, &ucmd);
1763 iscsi_sess_reportluns(iscsi_sess_t *isp, uint32_t event_count)
1782 ASSERT(isp != NULL);
1783 ihp = isp->sess_hba;
1791 (isp->sess_state_event_count == event_count)) {
1819 rval = iscsi_handle_passthru(isp, 0, &ucmd);
1852 if (isp->sess_state_event_count != event_count) {
1875 * walk the isp->sess_lun_list
1889 rw_enter(&isp->sess_lun_list_rwlock, RW_WRITER);
1890 for (ilp = isp->sess_lun_list; ilp; ilp = ilp_next) {
1891 if (isp->sess_state_event_count != event_count)
1924 rw_exit(&isp->sess_lun_list_rwlock);
1925 iscsi_sess_inquiry(isp, ilp->lun_num,
1928 rw_enter(&isp->sess_lun_list_rwlock,
1941 if (retrieve_lundata(lun_count, buf, isp,
1955 rw_exit(&isp->sess_lun_list_rwlock);
1956 iscsi_sess_inquiry(isp, lun_num,
1958 rw_enter(&isp->sess_lun_list_rwlock,
1980 rw_exit(&isp->sess_lun_list_rwlock);
1992 if (retrieve_lundata(lun_count, buf, isp,
2012 rw_enter(&isp->sess_lun_list_rwlock, RW_READER);
2013 for (ilp = isp->sess_lun_list; ilp; ilp = ilp->lun_next) {
2018 rw_exit(&isp->sess_lun_list_rwlock);
2022 iscsi_sess_inquiry(isp, lun_num, lun_addr_type,
2027 "Target(%s)", lun_num, isp->sess_name);
2064 iscsi_sess_inquiry(iscsi_sess_t *isp, uint16_t lun_num, uint8_t lun_addr_type,
2084 ASSERT(isp != NULL);
2085 ihp = isp->sess_hba;
2103 if (isp->sess_state_event_count != event_count) {
2111 " obsolete logical unit %d", isp->sess_oid, lun_num);
2141 (isp->sess_state_event_count == event_count)) {
2143 rval = iscsi_handle_passthru(isp, lun_num, &ucmd);
2164 isp->sess_oid, lun_num);
2218 (isp->sess_state_event_count == event_count)) {
2220 rval = iscsi_handle_passthru(isp, lun_num, &ucmd);
2277 if (isp->sess_state_event_count == event_count) {
2282 if (isp->sess_state_event_count == event_count) {
2283 (void) iscsi_lun_create(isp, lun_num, lun_addr_type,
2300 retrieve_lundata(uint32_t lun_count, unsigned char *buf, iscsi_sess_t *isp,
2334 isp->sess_oid);
2344 iscsi_sess_flush(iscsi_sess_t *isp)
2348 ASSERT(isp != NULL);
2349 ASSERT(isp->sess_state != ISCSI_SESS_STATE_LOGGED_IN);
2355 mutex_enter(&isp->sess_queue_pending.mutex);
2356 icmdp = isp->sess_queue_pending.head;
2358 if (isp->sess_state == ISCSI_SESS_STATE_FAILED) {
2367 ISCSI_CMD_EVENT_E7, isp);
2368 icmdp = isp->sess_queue_pending.head;
2370 mutex_exit(&isp->sess_queue_pending.mutex);
2377 iscsi_sess_offline_luns(iscsi_sess_t *isp)
2382 ASSERT(isp != NULL);
2383 ASSERT(isp->sess_state != ISCSI_SESS_STATE_LOGGED_IN);
2384 ihp = isp->sess_hba;
2387 rw_enter(&isp->sess_lun_list_rwlock, RW_READER);
2388 ilp = isp->sess_lun_list;
2393 rw_exit(&isp->sess_lun_list_rwlock);
2409 iscsi_sess_t *isp = NULL;
2415 for (isp = ihp->hba_sess_list; isp; isp = isp->sess_next) {
2420 if (isp->sess_target_oid == target_oid) {
2427 if (isp != NULL) {
2429 *ispp = isp;
2437 iscsi_sess_update_busy_luns(iscsi_sess_t *isp, boolean_t clear)
2442 ASSERT(isp != NULL);
2443 ihp = isp->sess_hba;
2446 rw_enter(&isp->sess_lun_list_rwlock, RW_WRITER);
2447 ilp = isp->sess_lun_list;
2456 rw_exit(&isp->sess_lun_list_rwlock);
2466 iscsi_sess_enum_request(iscsi_sess_t *isp, boolean_t wait,
2471 itp->t_arg = isp;
2474 mutex_enter(&isp->sess_enum_lock);
2475 while ((isp->sess_enum_status != ISCSI_SESS_ENUM_FREE) &&
2476 (isp->sess_enum_status != ISCSI_SESS_ENUM_INPROG)) {
2477 cv_wait(&isp->sess_enum_cv, &isp->sess_enum_lock);
2479 if (isp->sess_enum_status == ISCSI_SESS_ENUM_INPROG) {
2482 isp->sess_enum_result_count ++;
2484 mutex_exit(&isp->sess_enum_lock);
2489 ASSERT(isp->sess_enum_status == ISCSI_SESS_ENUM_FREE);
2490 ASSERT(isp->sess_enum_result_count == 0);
2492 isp->sess_enum_status = ISCSI_SESS_ENUM_INPROG;
2493 if (ddi_taskq_dispatch(isp->sess_enum_taskq,
2495 isp->sess_enum_status = ISCSI_SESS_ENUM_FREE;
2496 mutex_exit(&isp->sess_enum_lock);
2501 isp->sess_enum_result_count ++;
2503 mutex_exit(&isp->sess_enum_lock);
2512 iscsi_sess_enum_query(iscsi_sess_t *isp) {
2515 mutex_enter(&isp->sess_enum_lock);
2516 while (isp->sess_enum_status != ISCSI_SESS_ENUM_DONE) {
2517 cv_wait(&isp->sess_enum_cv, &isp->sess_enum_lock);
2519 ret = isp->sess_enum_result;
2520 isp->sess_enum_result_count --;
2521 if (isp->sess_enum_result_count == 0) {
2522 isp->sess_enum_status = ISCSI_SESS_ENUM_FREE;
2523 cv_broadcast(&isp->sess_enum_cv);
2525 mutex_exit(&isp->sess_enum_lock);
2531 iscsi_sess_enum_warn(iscsi_sess_t *isp, iscsi_enum_result_t r) {
2533 isp->sess_oid, iscsi_sess_enum_warn_msgs[r]);
2537 iscsi_sess_enter_state_zone(iscsi_sess_t *isp) {
2538 mutex_enter(&isp->sess_state_wmutex);
2539 while (isp->sess_state_hasw == B_TRUE) {
2540 cv_wait(&isp->sess_state_wcv, &isp->sess_state_wmutex);
2542 isp->sess_state_hasw = B_TRUE;
2543 mutex_exit(&isp->sess_state_wmutex);
2545 rw_enter(&isp->sess_state_rwlock, RW_WRITER);
2549 iscsi_sess_exit_state_zone(iscsi_sess_t *isp) {
2550 rw_exit(&isp->sess_state_rwlock);
2552 mutex_enter(&isp->sess_state_wmutex);
2553 isp->sess_state_hasw = B_FALSE;
2554 cv_signal(&isp->sess_state_wcv);
2555 mutex_exit(&isp->sess_state_wmutex);