Print this page
6740 ISCSI_OP_SCSI_RSP needs support
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
        
*** 19,29 ****
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
   *
!  * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
   */
  
  #include <sys/cpuvar.h>
  #include <sys/types.h>
  #include <sys/conf.h>
--- 19,29 ----
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
   *
!  * Copyright 2014, 2015 Nexenta Systems, Inc. All rights reserved.
   */
  
  #include <sys/cpuvar.h>
  #include <sys/types.h>
  #include <sys/conf.h>
*** 942,952 ****
--- 942,968 ----
  iscsit_rx_pdu_error(idm_conn_t *ic, idm_pdu_t *rx_pdu, idm_status_t status)
  {
          idm_pdu_complete(rx_pdu, IDM_STATUS_SUCCESS);
  }
  
+ /*
+  * iscsit_rx_scsi_rsp -- cause the connection to be closed if response rx'd
+  *
+  * A target sends an SCSI Response PDU, it should never receive one.
+  * This has been seen when running the Codemonicon suite of tests which
+  * does negative testing of the protocol. If such a condition occurs using
+  * a normal initiator it most likely means there's data corruption in the
+  * header and that's grounds for dropping the connection as well.
+  */
  void
+ iscsit_rx_scsi_rsp(idm_conn_t *ic, idm_pdu_t *rx_pdu)
+ {
+         idm_pdu_complete(rx_pdu, IDM_STATUS_SUCCESS);
+         idm_conn_event(ic, CE_TRANSPORT_FAIL, NULL);
+ }
+ 
+ void
  iscsit_task_aborted(idm_task_t *idt, idm_status_t status)
  {
          iscsit_task_t *itask = idt->idt_private;
  
          switch (status) {
*** 2389,2401 ****
                           */
  
                          if (iscsit_cmdsn_in_window(ict, refcmdsn) &&
                              iscsit_sna_lt(refcmdsn, cmdsn)) {
                                  mutex_enter(&ict->ict_sess->ist_sn_mutex);
!                                 (void) iscsit_remove_pdu_from_queue(
!                                     ict->ict_sess, refcmdsn);
                                  iscsit_conn_dispatch_rele(ict);
                                  mutex_exit(&ict->ict_sess->ist_sn_mutex);
                                  iscsit_send_task_mgmt_resp(tm_resp_pdu,
                                      SCSI_TCP_TM_RESP_COMPLETE);
                          } else {
                                  iscsit_send_task_mgmt_resp(tm_resp_pdu,
--- 2405,2418 ----
                           */
  
                          if (iscsit_cmdsn_in_window(ict, refcmdsn) &&
                              iscsit_sna_lt(refcmdsn, cmdsn)) {
                                  mutex_enter(&ict->ict_sess->ist_sn_mutex);
!                                 if (iscsit_remove_pdu_from_queue(
!                                     ict->ict_sess, refcmdsn)) {
                                          iscsit_conn_dispatch_rele(ict);
+                                 }
                                  mutex_exit(&ict->ict_sess->ist_sn_mutex);
                                  iscsit_send_task_mgmt_resp(tm_resp_pdu,
                                      SCSI_TCP_TM_RESP_COMPLETE);
                          } else {
                                  iscsit_send_task_mgmt_resp(tm_resp_pdu,