#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"
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 {
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;
{
int64_t tv_array[2];
timestruc_t tv;
+ uint64_t eid;
size_t nvl_size = 0;
zevent_t *ev;
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);
ev->ev_nvl = nvl;
ev->ev_detector = detector;
ev->ev_cb = cb;
+ ev->ev_eid = eid;
mutex_enter(&zevent_lock);
zfs_zevent_insert(ev);