static void dm_fault_execute_actions(fmd_hdl_t *hdl, diskmon_t *diskp, nvlist_t *nvl) { const char *action_prop = NULL; const char *action_string; /* * The predictive failure action is the activation of the fault * indicator. */ if (fmd_nvl_class_match(hdl, nvl, DISK_ERROR_CLASS "." FM_FAULT_DISK_OVERTEMP)) action_prop = DISK_PROP_OTEMPACTION; if (fmd_nvl_class_match(hdl, nvl, DISK_ERROR_CLASS "." FM_FAULT_DISK_TESTFAIL)) action_prop = DISK_PROP_STFAILACTION; dm_fault_indicator_set(diskp, INDICATOR_ON); if (action_prop != NULL && (action_string = dm_prop_lookup(diskp->props, action_prop)) != NULL) { if (dm_platform_indicator_execute(action_string) != 0) { log_warn("Fault action `%s' did not successfully " "complete.\n", action_string); } } }
static const cma_subscriber_t * nvl2subr(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t **asrup) { const cma_subscriber_t *sp; nvlist_t *asru; char *scheme; uint8_t version; boolean_t retire; if (nvlist_lookup_boolean_value(nvl, FM_SUSPECT_RETIRE, &retire) == 0 && retire == 0) { fmd_hdl_debug(hdl, "cma_recv: retire suppressed"); return (NULL); } if (nvlist_lookup_nvlist(nvl, FM_FAULT_ASRU, &asru) != 0 || nvlist_lookup_string(asru, FM_FMRI_SCHEME, &scheme) != 0 || nvlist_lookup_uint8(asru, FM_VERSION, &version) != 0) { cma_stats.bad_flts.fmds_value.ui64++; return (NULL); } for (sp = cma_subrs; sp->subr_class != NULL; sp++) { if (fmd_nvl_class_match(hdl, nvl, sp->subr_class) && strcmp(scheme, sp->subr_sname) == 0 && version <= sp->subr_svers) { *asrup = asru; return (sp); } } cma_stats.nop_flts.fmds_value.ui64++; return (NULL); }