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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_cmd.c
          +++ new/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_cmd.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
  24   24   *
       25 + * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  25   26   * iSCSI command interfaces
  26   27   */
  27   28  
  28   29  #include "iscsi.h"
  29   30  
  30   31  /* internal interfaces */
  31   32  static void iscsi_cmd_state_free(iscsi_cmd_t *icmdp,
  32   33      iscsi_cmd_event_t event, void *arg);
  33   34  static void iscsi_cmd_state_pending(iscsi_cmd_t *icmdp,
  34   35      iscsi_cmd_event_t event, void *arg);
↓ open down ↓ 754 lines elided ↑ open up ↑
 789  790                                      t_icmdp);
 790  791                                  mutex_exit(&icp->conn_queue_idm_aborting.mutex);
 791  792  
 792  793                                  /*
 793  794                                   * Complete abort processing after IDM
 794  795                                   * calls us back.  Set the status to use
 795  796                                   * when we complete the command.
 796  797                                   */
 797  798                                  ISCSI_CMD_SET_REASON_STAT(
 798  799                                      t_icmdp, CMD_TIMEOUT, STAT_ABORTED);
 799      -                                idm_task_abort(icp->conn_ic, t_icmdp->cmd_itp,
 800      -                                    AT_TASK_MGMT_ABORT);
      800 +                                (void) idm_task_abort(icp->conn_ic,
      801 +                                    t_icmdp->cmd_itp, AT_TASK_MGMT_ABORT);
 801  802                          } else {
 802  803                                  cv_broadcast(&t_icmdp->cmd_completion);
 803  804                          }
 804  805                          mutex_exit(&t_icmdp->cmd_mutex);
 805  806                          icmdp->cmd_un.abort.icmdp = NULL;
 806  807  
 807  808                          icmdp->cmd_misc_flags |=
 808  809                              ISCSI_CMD_MISCFLAG_FREE;
 809  810  
 810  811                          break;
↓ open down ↓ 124 lines elided ↑ open up ↑
 935  936                                              t_icmdp->cmd_conn,  t_icmdp);
 936  937                                          mutex_exit(&icp->
 937  938                                              conn_queue_idm_aborting.mutex);
 938  939                                          /*
 939  940                                           * Complete abort processing after IDM
 940  941                                           * calls us back.  Set the status to use
 941  942                                           * when we complete the command.
 942  943                                           */
 943  944                                          ISCSI_CMD_SET_REASON_STAT(t_icmdp,
 944  945                                              CMD_TIMEOUT, STAT_TIMEOUT);
 945      -                                        idm_task_abort(icp->conn_ic,
      946 +                                        (void) idm_task_abort(icp->conn_ic,
 946  947                                              t_icmdp->cmd_itp,
 947  948                                              AT_TASK_MGMT_ABORT);
 948  949                                  } else {
 949  950                                          cv_broadcast(&t_icmdp->cmd_completion);
 950  951                                  }
 951  952                                  mutex_exit(&t_icmdp->cmd_mutex);
 952  953                          } else {
 953  954                                  t_icmdp->cmd_un.scsi.abort_icmdp = NULL;
 954  955                          }
 955  956                          icmdp->cmd_un.abort.icmdp = NULL;
↓ open down ↓ 64 lines elided ↑ open up ↑
1020 1021                  iscsi_dequeue_active_cmd(icmdp->cmd_conn, icmdp);
1021 1022  
1022 1023                  switch (icmdp->cmd_type) {
1023 1024                  case ISCSI_CMD_TYPE_SCSI:
1024 1025                          mutex_exit(&isp->sess_cmdsn_mutex);
1025 1026                          mutex_enter(&icp->conn_queue_idm_aborting.mutex);
1026 1027                          iscsi_enqueue_idm_aborting_cmd(icmdp->cmd_conn, icmdp);
1027 1028                          mutex_exit(&icp->conn_queue_idm_aborting.mutex);
1028 1029                          ISCSI_CMD_SET_REASON_STAT(icmdp,
1029 1030                              CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
1030      -                        idm_task_abort(icp->conn_ic, icmdp->cmd_itp,
     1031 +                        (void) idm_task_abort(icp->conn_ic, icmdp->cmd_itp,
1031 1032                              AT_TASK_MGMT_ABORT);
1032 1033                          break;
1033 1034  
1034 1035                  case ISCSI_CMD_TYPE_NOP:
1035 1036                          icmdp->cmd_state = ISCSI_CMD_STATE_FREE;
1036 1037                          iscsi_sess_release_itt(isp, icmdp);
1037 1038                          mutex_exit(&isp->sess_cmdsn_mutex);
1038 1039  
1039 1040                          icmdp->cmd_misc_flags |=
1040 1041                              ISCSI_CMD_MISCFLAG_FREE;
↓ open down ↓ 160 lines elided ↑ open up ↑
1201 1202                   * it to complete immediately.
1202 1203                   */
1203 1204                  if ((a_icmdp = icmdp->cmd_un.scsi.abort_icmdp) != NULL) {
1204 1205                          iscsi_cmd_state_machine(a_icmdp,
1205 1206                              ISCSI_CMD_EVENT_E10, arg);
1206 1207                  }
1207 1208  
1208 1209                  ISCSI_CMD_SET_REASON_STAT(icmdp,
1209 1210                      CMD_TRAN_ERR, icmdp->cmd_un.scsi.pkt_stat);
1210 1211  
1211      -                idm_task_abort(icmdp->cmd_conn->conn_ic, icmdp->cmd_itp,
     1212 +                (void) idm_task_abort(icmdp->cmd_conn->conn_ic, icmdp->cmd_itp,
1212 1213                      AT_TASK_MGMT_ABORT);
1213 1214                  break;
1214 1215  
1215 1216          /* -E9: IDM is no longer processing this command */
1216 1217          case ISCSI_CMD_EVENT_E9:
1217 1218                  iscsi_dequeue_active_cmd(icmdp->cmd_conn, icmdp);
1218 1219  
1219 1220                  iscsi_task_cleanup(ISCSI_OP_SCSI_RSP, icmdp);
1220 1221                  iscsi_sess_release_scsi_itt(icmdp);
1221 1222  
↓ open down ↓ 203 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX