diff --git a/include/sys/fm/protocol.h b/include/sys/fm/protocol.h index 1ee221286..de05bb296 100644 --- a/include/sys/fm/protocol.h +++ b/include/sys/fm/protocol.h @@ -70,6 +70,7 @@ extern "C" { #define FM_EREPORT_DETECTOR "detector" #define FM_EREPORT_ENA "ena" #define FM_EREPORT_TIME "time" +#define FM_EREPORT_EID "eid" /* list.* event payload member names */ #define FM_LIST_EVENT_SIZE "list-sz" diff --git a/include/sys/fm/util.h b/include/sys/fm/util.h index 2f03d1011..9dfd436c1 100644 --- a/include/sys/fm/util.h +++ b/include/sys/fm/util.h @@ -81,6 +81,7 @@ typedef struct zevent_s { list_t ev_ze_list; /* " */ list_node_t ev_node; /* " */ zevent_cb_t *ev_cb; /* " */ + uint64_t ev_eid; } zevent_t; typedef struct zfs_zevent { diff --git a/module/zfs/fm.c b/module/zfs/fm.c index 002827b52..fe9223ff8 100644 --- a/module/zfs/fm.c +++ b/module/zfs/fm.c @@ -84,6 +84,14 @@ static int zevent_len_cur = 0; static int zevent_waiters = 0; static int zevent_flags = 0; +/* + * The EID (Event IDentifier) is used to uniquely tag a zevent when it is + * posted. The posted EIDs are monotonically increasing but not persistent. + * They will be reset to the initial value (1) each time the kernel module is + * loaded. + */ +static uint64_t zevent_eid = 0; + static kmutex_t zevent_lock; static list_t zevent_list; static kcondvar_t zevent_cv; @@ -498,6 +506,7 @@ zfs_zevent_post(nvlist_t *nvl, nvlist_t *detector, zevent_cb_t *cb) { int64_t tv_array[2]; timestruc_t tv; + uint64_t eid; size_t nvl_size = 0; zevent_t *ev; @@ -509,6 +518,12 @@ zfs_zevent_post(nvlist_t *nvl, nvlist_t *detector, zevent_cb_t *cb) return; } + eid = atomic_inc_64_nv(&zevent_eid); + if (nvlist_add_uint64(nvl, FM_EREPORT_EID, eid)) { + atomic_add_64(&erpt_kstat_data.erpt_set_failed.value.ui64, 1); + return; + } + (void) nvlist_size(nvl, &nvl_size, NV_ENCODE_NATIVE); if (nvl_size > ERPT_DATA_SZ || nvl_size == 0) { atomic_add_64(&erpt_kstat_data.erpt_dropped.value.ui64, 1); @@ -527,6 +542,7 @@ zfs_zevent_post(nvlist_t *nvl, nvlist_t *detector, zevent_cb_t *cb) ev->ev_nvl = nvl; ev->ev_detector = detector; ev->ev_cb = cb; + ev->ev_eid = eid; mutex_enter(&zevent_lock); zfs_zevent_insert(ev);