Print this page
NEX-15497 Multiple iSCSI targets stuck offlining and an old thread in idm_refcnt_wait_ref
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15497 Multiple iSCSI targets stuck offlining and an old thread in idm_refcnt_wait_ref
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-7907 uts/common/sys/scsi/scsi_names.h should define IQN as 223 bytes, not utf-8 characters
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-2756 iscsit should fold the case of scsi names that we get from initiators
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-3622 COMSTAR should have per remote port kstats for I/O and latency
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
SUP-776 iSCSI target portals not isolating IQNs on different subnets

*** 44,53 **** --- 44,54 ---- #include <sys/stmf.h> #include <sys/stmf_ioctl.h> #include <sys/portif.h> #include <sys/idm/idm.h> #include <sys/idm/idm_text.h> + #include <sys/idm/idm_so.h> #define ISCSIT_LOGIN_SM_STRINGS #include "iscsit.h" #include "iscsit_auth.h"
*** 730,740 **** (int)lsm->icl_login_state, (int)new_state); lsm->icl_login_last_state = lsm->icl_login_state; lsm->icl_login_state = new_state; mutex_exit(&lsm->icl_mutex); ! switch (lsm->icl_login_state) { case ILS_LOGIN_WAITING: /* Do nothing, waiting for more login PDU's */ break; case ILS_LOGIN_PROCESSING: /* All login PDU's received, process login request */ --- 731,771 ---- (int)lsm->icl_login_state, (int)new_state); lsm->icl_login_last_state = lsm->icl_login_state; lsm->icl_login_state = new_state; mutex_exit(&lsm->icl_mutex); ! /* ! * Tale of caution here. The use of new_state instead of using ! * lsm->icl_login_state is deliberate (which had been used originally). ! * Since the icl_mutex is dropped under the right circumstances ! * the login state changes between setting the state and examining ! * the state to proceed. No big surprise since the lock was being ! * used in the first place to prevent just that type of change. ! * ! * There has been a case where network errors occurred while a client ! * was attempting to reinstate the connection causing multiple ! * login packets to arrive into the state machine. Those multiple ! * packets which were processed incorrectly caused the reference ! * count on the connection to be one higher than it should be and ! * from then on the connection can't close correctly causing a hang. ! * ! * Upon examination of the core it was found that the connection ! * audit data had calls looking like: ! * login_sm_event_dispatch ! * login_sm_processing ! * login_sm_new_state ! * That call sequence means the new state was/is ILS_LOGIN_ERROR ! * yet the audit trail continues with a call to ! * login_sm_send_next_response ! * which could only occur if icl_login_state had changed. Had the ! * design of COMSTAR taken this into account the code would ! * originally have held the icl_mutex across the processing of the ! * state processing. Lock order and calls which sleep prevent that ! * from being possible. The next best solution is to use the local ! * variable which holds the state. ! */ ! switch (new_state) { case ILS_LOGIN_WAITING: /* Do nothing, waiting for more login PDU's */ break; case ILS_LOGIN_PROCESSING: /* All login PDU's received, process login request */
*** 1746,1755 **** --- 1777,1788 ---- { iscsit_sess_t *ist = ict->ict_sess; stmf_scsi_session_t *ss; iscsi_transport_id_t *iscsi_tptid; uint16_t ident_len, adn_len, tptid_sz; + char prop_buf[KSTAT_STRLEN + 1]; + char peer_buf[IDM_SA_NTOP_BUFSIZ]; /* * Hold target mutex until we have finished registering with STMF */ mutex_enter(&ist->ist_tgt->target_mutex);
*** 1806,1815 **** --- 1839,1853 ---- } ss->ss_port_private = ict->ict_sess; ict->ict_sess->ist_stmf_sess = ss; mutex_exit(&ist->ist_tgt->target_mutex); + (void) snprintf(prop_buf, sizeof (prop_buf), "peername_%"PRIxPTR"", + (uintptr_t)ict->ict_sess); + (void) idm_sa_ntop(&ict->ict_ic->ic_raddr, peer_buf, + sizeof (peer_buf)); + (void) stmf_add_rport_info(ss, prop_buf, peer_buf); return (IDM_STATUS_SUCCESS); }
*** 2724,2751 **** return (NULL); /* Check for one of the supported name types */ if (strncasecmp(name, SNS_EUI ".", strlen(SNS_EUI) + 1) == 0) { sns = SNS_EUI; ! *buflen = SNS_EUI_U8_LEN_MAX + 1; flag |= U8_TEXTPREP_TOUPPER; } else if (strncasecmp(name, SNS_IQN ".", strlen(SNS_IQN) + 1) == 0) { sns = SNS_IQN; ! *buflen = SNS_IQN_U8_LEN_MAX + 1; flag |= U8_TEXTPREP_TOLOWER; } else if (strncasecmp(name, SNS_NAA ".", strlen(SNS_NAA) + 1) == 0) { sns = SNS_NAA; ! *buflen = SNS_NAA_U8_LEN_MAX + 1; flag |= U8_TEXTPREP_TOUPPER; } else { return (NULL); } ret = kmem_zalloc(*buflen, KM_SLEEP); coff = strlen(sns); inlen = strlen(name) - coff; ! outlen = *buflen - coff; /* Fold the case and normalize string */ if (u8_textprep_str(name + coff, &inlen, ret + coff, &outlen, flag, U8_UNICODE_320, &errnum) == (size_t)-1) { kmem_free(ret, *buflen); --- 2762,2789 ---- return (NULL); /* Check for one of the supported name types */ if (strncasecmp(name, SNS_EUI ".", strlen(SNS_EUI) + 1) == 0) { sns = SNS_EUI; ! *buflen = SNS_EUI_LEN_MAX + 1; flag |= U8_TEXTPREP_TOUPPER; } else if (strncasecmp(name, SNS_IQN ".", strlen(SNS_IQN) + 1) == 0) { sns = SNS_IQN; ! *buflen = SNS_IQN_LEN_MAX + 1; flag |= U8_TEXTPREP_TOLOWER; } else if (strncasecmp(name, SNS_NAA ".", strlen(SNS_NAA) + 1) == 0) { sns = SNS_NAA; ! *buflen = SNS_NAA_LEN_MAX + 1; flag |= U8_TEXTPREP_TOUPPER; } else { return (NULL); } ret = kmem_zalloc(*buflen, KM_SLEEP); coff = strlen(sns); inlen = strlen(name) - coff; ! outlen = *buflen - coff - 1; /* Fold the case and normalize string */ if (u8_textprep_str(name + coff, &inlen, ret + coff, &outlen, flag, U8_UNICODE_320, &errnum) == (size_t)-1) { kmem_free(ret, *buflen);