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,28 **** --- 19,29 ---- * 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,38 **** --- 30,41 ---- #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,77 **** IDM_STATUS_DATA_DIGEST, IDM_STATUS_PROTOCOL_ERROR, IDM_STATUS_LOGIN_FAIL } idm_status_t; 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 } 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" }; #endif typedef enum { FD_CONN_FAIL, --- 46,78 ---- 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 { ! #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] = { ! #define item(a) #a, ! IDM_CLIENT_NOTIFY_LIST() ! #undef item }; #endif typedef enum { FD_CONN_FAIL,
*** 83,113 **** AT_INTERNAL_SUSPEND, AT_INTERNAL_ABORT, AT_TASK_MGMT_ABORT } idm_abort_type_t; typedef enum { ! TASK_IDLE, ! TASK_ACTIVE, ! TASK_SUSPENDING, ! TASK_SUSPENDED, ! TASK_ABORTING, ! TASK_ABORTED, ! TASK_COMPLETE, ! TASK_MAX_STATE } 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" }; #endif typedef enum { KV_HANDLED = 0, --- 84,114 ---- 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 { ! #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] = { ! #define item(a) #a, ! IDM_TASK_STATE_LIST() ! #undef item }; #endif typedef enum { KV_HANDLED = 0,
*** 439,449 **** idm_task_alloc(idm_conn_t *ic); void idm_task_start(idm_task_t *idt, uintptr_t handle); ! void 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); --- 440,450 ---- idm_task_alloc(idm_conn_t *ic); void idm_task_start(idm_task_t *idt, uintptr_t handle); ! 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,531 **** --- 523,534 ---- 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