Exemplo n.º 1
0
/*
 * 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);
}
Exemplo n.º 2
0
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);
        }
    }
}
Exemplo n.º 3
0
/*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);
}
Exemplo n.º 4
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);
	}
}