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>
NEX-6018 Return of the walking dead idm_refcnt_wait_ref comstar threads
Reviewed by:  Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by:  Evan Layton <evan.layton@nexenta.com>
NEX-3177 enums and string arrays required to be in sync.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Steve Peng <steve.peng@nexenta.com>
        
@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef _IDM_H
 #define _IDM_H
@@ -29,10 +30,12 @@
 
 #ifdef  __cplusplus
 extern "C" {
 #endif
 
+#include <sys/stmf_defines.h>
+
 typedef enum {
         IDM_STATUS_SUCCESS = 0,
         IDM_STATUS_FAIL,
         IDM_STATUS_NORESOURCES,
         IDM_STATUS_REJECT,
@@ -43,35 +46,33 @@
         IDM_STATUS_DATA_DIGEST,
         IDM_STATUS_PROTOCOL_ERROR,
         IDM_STATUS_LOGIN_FAIL
 } idm_status_t;
 
+#define IDM_CLIENT_NOTIFY_LIST() \
+        item(CN_UNDEFINED) \
+        item(CN_CONNECT_ACCEPT)         /* Target only */ \
+        item(CN_LOGIN_FAIL) \
+        item(CN_READY_FOR_LOGIN)        /* Initiator only */ \
+        item(CN_FFP_ENABLED) \
+        item(CN_FFP_DISABLED) \
+        item(CN_CONNECT_LOST) \
+        item(CN_CONNECT_DESTROY) \
+        item(CN_CONNECT_FAIL) \
+        item(CN_MAX)
 
 typedef enum {
-        CN_CONNECT_ACCEPT = 1,  /* Target only */
-        CN_LOGIN_FAIL,
-        CN_READY_FOR_LOGIN,     /* Initiator only */
-        CN_FFP_ENABLED,
-        CN_FFP_DISABLED,
-        CN_CONNECT_LOST,
-        CN_CONNECT_DESTROY,
-        CN_CONNECT_FAIL,
-        CN_MAX
+#define item(a) a,
+        IDM_CLIENT_NOTIFY_LIST()
+#undef  item
 } idm_client_notify_t;
 
 #ifdef IDM_CN_NOTIFY_STRINGS
 static const char *idm_cn_strings[CN_MAX + 1] = {
-        "CN_UNDEFINED",
-        "CN_CONNECT_ACCEPT",
-        "CN_LOGIN_FAIL",
-        "CN_READY_FOR_LOGIN",
-        "CN_FFP_ENABLED",
-        "CN_FFP_DISABLED",
-        "CN_CONNECT_LOST",
-        "CN_CONNECT_DESTROY",
-        "CN_CONNECT_FAIL",
-        "CN_MAX"
+#define item(a) #a,
+        IDM_CLIENT_NOTIFY_LIST()
+#undef  item
 };
 #endif
 
 typedef enum {
         FD_CONN_FAIL,
@@ -83,31 +84,31 @@
         AT_INTERNAL_SUSPEND,
         AT_INTERNAL_ABORT,
         AT_TASK_MGMT_ABORT
 } idm_abort_type_t;
 
+#define IDM_TASK_STATE_LIST() \
+        item(TASK_IDLE) \
+        item(TASK_ACTIVE) \
+        item(TASK_SUSPENDING) \
+        item(TASK_SUSPENDED) \
+        item(TASK_ABORTING) \
+        item(TASK_ABORTED) \
+        item(TASK_COMPLETE) \
+        item(TASK_MAX_STATE)
+
 typedef enum {
-        TASK_IDLE,
-        TASK_ACTIVE,
-        TASK_SUSPENDING,
-        TASK_SUSPENDED,
-        TASK_ABORTING,
-        TASK_ABORTED,
-        TASK_COMPLETE,
-        TASK_MAX_STATE
+#define item(a) a,
+        IDM_TASK_STATE_LIST()
+#undef  item
 } idm_task_state_t;
 
 #ifdef IDM_TASK_SM_STRINGS
 static const char *idm_ts_name[TASK_MAX_STATE+1] = {
-        "TASK_IDLE",
-        "TASK_ACTIVE",
-        "TASK_SUSPENDING",
-        "TASK_SUSPENDED",
-        "TASK_ABORTING",
-        "TASK_ABORTED",
-        "TASK_COMPLETE",
-        "TASK_MAX_STATE"
+#define item(a) #a,
+        IDM_TASK_STATE_LIST()
+#undef  item
 };
 #endif
 
 typedef enum {
         KV_HANDLED = 0,
@@ -439,11 +440,11 @@
 idm_task_alloc(idm_conn_t *ic);
 
 void
 idm_task_start(idm_task_t *idt, uintptr_t handle);
 
-void
+stmf_status_t
 idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type);
 
 void
 idm_task_cleanup(idm_task_t *idt);
 
@@ -522,10 +523,12 @@
 idm_refcnt_wait_ref(idm_refcnt_t *refcnt);
 
 void
 idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func);
 
+int
+idm_refcnt_is_held(idm_refcnt_t *refcnt);
 
 #ifdef  __cplusplus
 }
 #endif