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,