Print this page
NEX-9981 Deadman timer panic from idm_refcnt_wait_ref thread while offlining iSCSI targets
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
        
*** 20,29 ****
--- 20,30 ----
   */
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   *
+  * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
   * iSCSI command interfaces
   */
  
  #include "iscsi.h"
  
*** 794,805 ****
                                   * calls us back.  Set the status to use
                                   * when we complete the command.
                                   */
                                  ISCSI_CMD_SET_REASON_STAT(
                                      t_icmdp, CMD_TIMEOUT, STAT_ABORTED);
!                                 idm_task_abort(icp->conn_ic, t_icmdp->cmd_itp,
!                                     AT_TASK_MGMT_ABORT);
                          } else {
                                  cv_broadcast(&t_icmdp->cmd_completion);
                          }
                          mutex_exit(&t_icmdp->cmd_mutex);
                          icmdp->cmd_un.abort.icmdp = NULL;
--- 795,806 ----
                                   * calls us back.  Set the status to use
                                   * when we complete the command.
                                   */
                                  ISCSI_CMD_SET_REASON_STAT(
                                      t_icmdp, CMD_TIMEOUT, STAT_ABORTED);
!                                 (void) idm_task_abort(icp->conn_ic,
!                                     t_icmdp->cmd_itp, AT_TASK_MGMT_ABORT);
                          } else {
                                  cv_broadcast(&t_icmdp->cmd_completion);
                          }
                          mutex_exit(&t_icmdp->cmd_mutex);
                          icmdp->cmd_un.abort.icmdp = NULL;
*** 940,950 ****
                                           * calls us back.  Set the status to use
                                           * when we complete the command.
                                           */
                                          ISCSI_CMD_SET_REASON_STAT(t_icmdp,
                                              CMD_TIMEOUT, STAT_TIMEOUT);
!                                         idm_task_abort(icp->conn_ic,
                                              t_icmdp->cmd_itp,
                                              AT_TASK_MGMT_ABORT);
                                  } else {
                                          cv_broadcast(&t_icmdp->cmd_completion);
                                  }
--- 941,951 ----
                                           * calls us back.  Set the status to use
                                           * when we complete the command.
                                           */
                                          ISCSI_CMD_SET_REASON_STAT(t_icmdp,
                                              CMD_TIMEOUT, STAT_TIMEOUT);
!                                         (void) idm_task_abort(icp->conn_ic,
                                              t_icmdp->cmd_itp,
                                              AT_TASK_MGMT_ABORT);
                                  } else {
                                          cv_broadcast(&t_icmdp->cmd_completion);
                                  }
*** 1025,1035 ****
                          mutex_enter(&icp->conn_queue_idm_aborting.mutex);
                          iscsi_enqueue_idm_aborting_cmd(icmdp->cmd_conn, icmdp);
                          mutex_exit(&icp->conn_queue_idm_aborting.mutex);
                          ISCSI_CMD_SET_REASON_STAT(icmdp,
                              CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
!                         idm_task_abort(icp->conn_ic, icmdp->cmd_itp,
                              AT_TASK_MGMT_ABORT);
                          break;
  
                  case ISCSI_CMD_TYPE_NOP:
                          icmdp->cmd_state = ISCSI_CMD_STATE_FREE;
--- 1026,1036 ----
                          mutex_enter(&icp->conn_queue_idm_aborting.mutex);
                          iscsi_enqueue_idm_aborting_cmd(icmdp->cmd_conn, icmdp);
                          mutex_exit(&icp->conn_queue_idm_aborting.mutex);
                          ISCSI_CMD_SET_REASON_STAT(icmdp,
                              CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
!                         (void) idm_task_abort(icp->conn_ic, icmdp->cmd_itp,
                              AT_TASK_MGMT_ABORT);
                          break;
  
                  case ISCSI_CMD_TYPE_NOP:
                          icmdp->cmd_state = ISCSI_CMD_STATE_FREE;
*** 1206,1216 ****
                  }
  
                  ISCSI_CMD_SET_REASON_STAT(icmdp,
                      CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
  
!                 idm_task_abort(icmdp->cmd_conn->conn_ic, icmdp->cmd_itp,
                      AT_TASK_MGMT_ABORT);
                  break;
  
          /* -E9: IDM is no longer processing this command */
          case ISCSI_CMD_EVENT_E9:
--- 1207,1217 ----
                  }
  
                  ISCSI_CMD_SET_REASON_STAT(icmdp,
                      CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
  
!                 (void) idm_task_abort(icmdp->cmd_conn->conn_ic, icmdp->cmd_itp,
                      AT_TASK_MGMT_ABORT);
                  break;
  
          /* -E9: IDM is no longer processing this command */
          case ISCSI_CMD_EVENT_E9: