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);