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