/* * Convenience function to get slice stats. This is where we are going to * depart from the illumos implementation - libdiskmgt on that * platform has a lot more tricks that are not applicable * to O3X. */ void dm_get_slice_stats(char *slice, nvlist_t **dev_stats, int *errp) { *dev_stats = NULL; *errp = 0; if (slice == NULL) { return; } *dev_stats = dm_get_stats(slice, DM_SLICE_STAT_USE, errp); }
static void get_slice_use(dm_descriptor_t slice, char *name, char **used_name, char **used_by, int *error) { /* Get slice use statistics */ nvlist_t *stats = dm_get_stats(slice, DM_SLICE_STAT_USE, error); if (*error != 0) { handle_error("could not get stats of slice %s", name); } else { *used_name = NULL; *used_by = NULL; if (stats != NULL) { char *tmp; nvpair_t *match; /* Get the type of usage for this slice */ match = zjni_nvlist_walk_nvpair( stats, DM_USED_BY, DATA_TYPE_STRING, NULL); if (match != NULL && nvpair_value_string(match, &tmp) == 0) { *used_name = strdup(tmp); if (*used_name == NULL) { *error = -1; handle_error("out of memory"); } else { /* Get the object using this slice */ match = zjni_nvlist_walk_nvpair(stats, DM_USED_NAME, DATA_TYPE_STRING, NULL); if (match != NULL && nvpair_value_string(match, &tmp) == 0) { *used_by = strdup(tmp); if (*used_by == NULL) { *error = -1; handle_error( "out of memory"); } } } } nvlist_free(stats); } } }
/*ARGSUSED*/ static int disk_temp_reading(topo_mod_t *mod, tnode_t *node, topo_version_t vers, nvlist_t *in, nvlist_t **out) { char *devid; uint32_t temp; dm_descriptor_t drive_descr = NULL; nvlist_t *drive_stats, *pargs, *nvl; int err; if (vers > TOPO_METH_DISK_TEMP_VERSION) return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW)); if (nvlist_lookup_nvlist(in, TOPO_PROP_ARGS, &pargs) != 0 || nvlist_lookup_string(pargs, TOPO_IO_DEVID, &devid) != 0) { topo_mod_dprintf(mod, "Failed to lookup %s arg", TOPO_IO_DEVID); return (topo_mod_seterrno(mod, EMOD_NVL_INVAL)); } if ((drive_descr = dm_get_descriptor_by_name(DM_DRIVE, devid, &err)) == NULL) { topo_mod_dprintf(mod, "failed to get drive decriptor for %s", devid); return (topo_mod_seterrno(mod, EMOD_UNKNOWN)); } if ((drive_stats = dm_get_stats(drive_descr, DM_DRV_STAT_TEMPERATURE, &err)) == NULL || nvlist_lookup_uint32(drive_stats, DM_TEMPERATURE, &temp) != 0) { topo_mod_dprintf(mod, "failed to read disk temp for %s", devid); dm_free_descriptor(drive_descr); return (topo_mod_seterrno(mod, EMOD_UNKNOWN)); } dm_free_descriptor(drive_descr); if (topo_mod_nvalloc(mod, &nvl, NV_UNIQUE_NAME) != 0 || nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, TOPO_SENSOR_READING) != 0 || nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, TOPO_TYPE_DOUBLE) != 0 || nvlist_add_double(nvl, TOPO_PROP_VAL_VAL, (double)temp) != 0) { topo_mod_dprintf(mod, "Failed to allocate 'out' nvlist\n"); nvlist_free(nvl); return (topo_mod_seterrno(mod, EMOD_NOMEM)); } *out = nvl; return (0); }
/* * Convenience function to get slice stats */ void dm_get_slice_stats(char *slice, nvlist_t **dev_stats, int *errp) { dm_descriptor_t devp; *dev_stats = NULL; *errp = 0; if (slice == NULL) { return; } /* * Errors must be handled by the caller. The dm_descriptor_t * * values will be NULL if an error occured in these calls. */ devp = dm_get_descriptor_by_name(DM_SLICE, slice, errp); if (devp != NULL) { *dev_stats = dm_get_stats(devp, DM_SLICE_STAT_USE, errp); dm_free_descriptor(devp); } }