2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A#include "libzfs_jni_util.h"
2N/A#include "libzfs_jni_pool.h"
2N/A#include <strings.h>
2N/A
2N/A/*
2N/A * Types
2N/A */
2N/A
2N/Atypedef struct ImportablePoolBean {
2N/A zjni_Object_t super;
2N/A PoolStatsBean_t interface_PoolStats;
2N/A
2N/A jmethodID method_setName;
2N/A jmethodID method_setId;
2N/A} ImportablePoolBean_t;
2N/A
2N/Atypedef struct VirtualDeviceBean {
2N/A zjni_Object_t super;
2N/A DeviceStatsBean_t interface_DeviceStats;
2N/A
2N/A jmethodID method_setPoolName;
2N/A jmethodID method_setParentIndex;
2N/A jmethodID method_setIndex;
2N/A} VirtualDeviceBean_t;
2N/A
2N/Atypedef struct LeafVirtualDeviceBean {
2N/A VirtualDeviceBean_t super;
2N/A
2N/A jmethodID method_setName;
2N/A} LeafVirtualDeviceBean_t;
2N/A
2N/Atypedef struct DiskVirtualDeviceBean {
2N/A LeafVirtualDeviceBean_t super;
2N/A} DiskVirtualDeviceBean_t;
2N/A
2N/Atypedef struct SliceVirtualDeviceBean {
2N/A LeafVirtualDeviceBean_t super;
2N/A} SliceVirtualDeviceBean_t;
2N/A
2N/Atypedef struct FileVirtualDeviceBean {
2N/A LeafVirtualDeviceBean_t super;
2N/A} FileVirtualDeviceBean_t;
2N/A
2N/Atypedef struct RAIDVirtualDeviceBean {
2N/A VirtualDeviceBean_t super;
2N/A
2N/A jmethodID method_setParity;
2N/A} RAIDVirtualDeviceBean_t;
2N/A
2N/Atypedef struct MirrorVirtualDeviceBean {
2N/A VirtualDeviceBean_t super;
2N/A} MirrorVirtualDeviceBean_t;
2N/A
2N/A/*
2N/A * Data
2N/A */
2N/A
2N/A/* vdev_state_t to DeviceStats$DeviceState map */
2N/Astatic zjni_field_mapping_t vdev_state_map[] = {
2N/A { VDEV_STATE_UNUSABLE, "VDEV_STATE_UNUSABLE" },
2N/A { VDEV_STATE_CLOSED, "VDEV_STATE_CLOSED" },
2N/A { VDEV_STATE_DEGRADED, "VDEV_STATE_DEGRADED" },
2N/A { VDEV_STATE_HEALTHY, "VDEV_STATE_HEALTHY" },
2N/A { VDEV_STATE_OFFLINE, "VDEV_STATE_OFFLINE" },
2N/A { VDEV_STATE_UNKNOWN, "VDEV_STATE_UNKNOWN" },
2N/A { -1, NULL },
2N/A};
2N/A
2N/A/* vdev_aux_t to DeviceStats$DeviceStatus map */
2N/Astatic zjni_field_mapping_t vdev_aux_map[] = {
2N/A { VDEV_AUX_NONE, "VDEV_AUX_NONE" },
2N/A { VDEV_AUX_OPEN_FAILED, "VDEV_AUX_OPEN_FAILED" },
2N/A { VDEV_AUX_CORRUPT_DATA, "VDEV_AUX_CORRUPT_DATA" },
2N/A { VDEV_AUX_NO_REPLICAS, "VDEV_AUX_NO_REPLICAS" },
2N/A { VDEV_AUX_BAD_GUID_SUM, "VDEV_AUX_BAD_GUID_SUM" },
2N/A { VDEV_AUX_TOO_SMALL, "VDEV_AUX_TOO_SMALL" },
2N/A { VDEV_AUX_BAD_LABEL, "VDEV_AUX_BAD_LABEL" },
2N/A { -1, NULL },
2N/A};
2N/A
2N/A/* zpool_state_t to PoolStats$PoolState map */
2N/Astatic zjni_field_mapping_t pool_state_map[] = {
2N/A { POOL_STATE_ACTIVE, "POOL_STATE_ACTIVE" },
2N/A { POOL_STATE_EXPORTED, "POOL_STATE_EXPORTED" },
2N/A { POOL_STATE_DESTROYED, "POOL_STATE_DESTROYED" },
2N/A { POOL_STATE_SPARE, "POOL_STATE_SPARE" },
2N/A { POOL_STATE_UNINITIALIZED, "POOL_STATE_UNINITIALIZED" },
2N/A { POOL_STATE_UNAVAIL, "POOL_STATE_UNAVAIL" },
2N/A { POOL_STATE_POTENTIALLY_ACTIVE, "POOL_STATE_POTENTIALLY_ACTIVE" },
2N/A { -1, NULL },
2N/A};
2N/A
2N/A/* zpool_status_t to PoolStats$PoolStatus map */
2N/Astatic zjni_field_mapping_t zpool_status_map[] = {
2N/A { ZPOOL_STATUS_CORRUPT_CACHE, "ZPOOL_STATUS_CORRUPT_CACHE" },
2N/A { ZPOOL_STATUS_BAD_GUID_SUM, "ZPOOL_STATUS_BAD_GUID_SUM" },
2N/A { ZPOOL_STATUS_CORRUPT_POOL, "ZPOOL_STATUS_CORRUPT_POOL" },
2N/A { ZPOOL_STATUS_CORRUPT_DATA, "ZPOOL_STATUS_CORRUPT_DATA" },
2N/A { ZPOOL_STATUS_FAILING_DEV, "ZPOOL_STATUS_FAILING_DEV" },
2N/A { ZPOOL_STATUS_VERSION_NEWER, "ZPOOL_STATUS_VERSION_NEWER" },
2N/A { ZPOOL_STATUS_HOSTID_MISMATCH, "ZPOOL_STATUS_HOSTID_MISMATCH" },
2N/A { ZPOOL_STATUS_UNUSABLE_DEV_R, "ZPOOL_STATUS_UNUSABLE_DEV_R" },
2N/A { ZPOOL_STATUS_UNUSABLE_DEV_NR, "ZPOOL_STATUS_UNUSABLE_DEV_NR" },
2N/A { ZPOOL_STATUS_DEGRADED_DEV_DTL, "ZPOOL_STATUS_DEGRADED_DEV_DTL" },
2N/A { ZPOOL_STATUS_BAD_LOG, "ZPOOL_STATUS_BAD_LOG" },
2N/A { ZPOOL_STATUS_VERSION_OLDER, "ZPOOL_STATUS_VERSION_OLDER" },
2N/A { ZPOOL_STATUS_RESILVERING, "ZPOOL_STATUS_RESILVERING" },
2N/A { ZPOOL_STATUS_OFFLINE_DEV, "ZPOOL_STATUS_OFFLINE_DEV" },
2N/A { ZPOOL_STATUS_REMOVED_DEV, "ZPOOL_STATUS_REMOVED_DEV" },
2N/A { ZPOOL_STATUS_OK, "ZPOOL_STATUS_OK" },
2N/A { -1, NULL }
2N/A};
2N/A
2N/A/*
2N/A * Function prototypes
2N/A */
2N/A
2N/Astatic void new_ImportablePoolBean(JNIEnv *, ImportablePoolBean_t *);
2N/Astatic void new_VirtualDevice(JNIEnv *, VirtualDeviceBean_t *);
2N/Astatic void new_LeafVirtualDevice(JNIEnv *, LeafVirtualDeviceBean_t *);
2N/Astatic void new_DiskVirtualDeviceBean(JNIEnv *, DiskVirtualDeviceBean_t *);
2N/Astatic void new_SliceVirtualDeviceBean(JNIEnv *, SliceVirtualDeviceBean_t *);
2N/Astatic void new_FileVirtualDeviceBean(JNIEnv *, FileVirtualDeviceBean_t *);
2N/Astatic void new_RAIDVirtualDeviceBean(JNIEnv *, RAIDVirtualDeviceBean_t *);
2N/Astatic void new_MirrorVirtualDeviceBean(JNIEnv *, MirrorVirtualDeviceBean_t *);
2N/Astatic int populate_ImportablePoolBean(
2N/A JNIEnv *, ImportablePoolBean_t *, nvlist_t *);
2N/Astatic int populate_VirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, VirtualDeviceBean_t *);
2N/Astatic int populate_LeafVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, LeafVirtualDeviceBean_t *);
2N/Astatic int populate_DiskVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, DiskVirtualDeviceBean_t *);
2N/Astatic int populate_SliceVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, SliceVirtualDeviceBean_t *);
2N/Astatic int populate_FileVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, FileVirtualDeviceBean_t *);
2N/Astatic int populate_RAIDVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, RAIDVirtualDeviceBean_t *);
2N/Astatic int populate_MirrorVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
2N/A nvlist_t *, uint64_t *p_vdev_id, MirrorVirtualDeviceBean_t *);
2N/Astatic jobject create_ImportablePoolBean(JNIEnv *, nvlist_t *);
2N/Astatic jobject create_DiskVirtualDeviceBean(
2N/A JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
2N/Astatic jobject create_SliceVirtualDeviceBean(
2N/A JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
2N/Astatic jobject create_FileVirtualDeviceBean(
2N/A JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
2N/Astatic jobject create_RAIDVirtualDeviceBean(
2N/A JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
2N/Astatic jobject create_MirrorVirtualDeviceBean(
2N/A JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
2N/Astatic char *find_field(const zjni_field_mapping_t *, int);
2N/Astatic jobject zjni_vdev_state_to_obj(JNIEnv *, vdev_state_t);
2N/Astatic jobject zjni_vdev_aux_to_obj(JNIEnv *, vdev_aux_t);
2N/A
2N/A/*
2N/A * Static functions
2N/A */
2N/A
2N/A/* Create a ImportablePoolBean */
2N/Astatic void
2N/Anew_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class =
2N/A (*env)->FindClass(env,
2N/A ZFSJNI_PACKAGE_DATA "ImportablePoolBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_PoolStats(env, &(bean->interface_PoolStats), object);
2N/A
2N/A bean->method_setName = (*env)->GetMethodID(
2N/A env, object->class, "setName", "(Ljava/lang/String;)V");
2N/A
2N/A bean->method_setId = (*env)->GetMethodID(
2N/A env, object->class, "setId", "(J)V");
2N/A}
2N/A
2N/A/* Create a VirtualDeviceBean */
2N/Astatic void
2N/Anew_VirtualDevice(JNIEnv *env, VirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class =
2N/A (*env)->FindClass(env,
2N/A ZFSJNI_PACKAGE_DATA "VirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_DeviceStats(env, &(bean->interface_DeviceStats), object);
2N/A
2N/A bean->method_setPoolName = (*env)->GetMethodID(
2N/A env, object->class, "setPoolName", "(Ljava/lang/String;)V");
2N/A
2N/A bean->method_setParentIndex = (*env)->GetMethodID(
2N/A env, object->class, "setParentIndex", "(Ljava/lang/Long;)V");
2N/A
2N/A bean->method_setIndex = (*env)->GetMethodID(
2N/A env, object->class, "setIndex", "(J)V");
2N/A}
2N/A
2N/A/* Create a LeafVirtualDeviceBean */
2N/Astatic void
2N/Anew_LeafVirtualDevice(JNIEnv *env, LeafVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class =
2N/A (*env)->FindClass(env,
2N/A ZFSJNI_PACKAGE_DATA "LeafVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
2N/A
2N/A bean->method_setName = (*env)->GetMethodID(
2N/A env, object->class, "setName", "(Ljava/lang/String;)V");
2N/A}
2N/A
2N/A/* Create a DiskVirtualDeviceBean */
2N/Astatic void
2N/Anew_DiskVirtualDeviceBean(JNIEnv *env, DiskVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class = (*env)->FindClass(
2N/A env, ZFSJNI_PACKAGE_DATA "DiskVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
2N/A}
2N/A
2N/A/* Create a SliceVirtualDeviceBean */
2N/Astatic void
2N/Anew_SliceVirtualDeviceBean(JNIEnv *env, SliceVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class = (*env)->FindClass(
2N/A env, ZFSJNI_PACKAGE_DATA "SliceVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
2N/A}
2N/A
2N/A/* Create a FileVirtualDeviceBean */
2N/Astatic void
2N/Anew_FileVirtualDeviceBean(JNIEnv *env, FileVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class = (*env)->FindClass(
2N/A env, ZFSJNI_PACKAGE_DATA "FileVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
2N/A}
2N/A
2N/A/* Create a RAIDVirtualDeviceBean */
2N/Astatic void
2N/Anew_RAIDVirtualDeviceBean(JNIEnv *env, RAIDVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A
2N/A object->class = (*env)->FindClass(
2N/A env, ZFSJNI_PACKAGE_DATA "RAIDVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
2N/A
2N/A bean->method_setParity = (*env)->GetMethodID(
2N/A env, object->class, "setParity", "(J)V");
2N/A}
2N/A
2N/A/* Create a MirrorVirtualDeviceBean */
2N/Astatic void
2N/Anew_MirrorVirtualDeviceBean(JNIEnv *env, MirrorVirtualDeviceBean_t *bean)
2N/A{
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A
2N/A if (object->object == NULL) {
2N/A object->class = (*env)->FindClass(
2N/A env, ZFSJNI_PACKAGE_DATA "MirrorVirtualDeviceBean");
2N/A
2N/A object->constructor =
2N/A (*env)->GetMethodID(env, object->class, "<init>", "()V");
2N/A
2N/A object->object =
2N/A (*env)->NewObject(env, object->class, object->constructor);
2N/A }
2N/A
2N/A new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean,
2N/A nvlist_t *config)
2N/A{
2N/A char *c;
2N/A char *name;
2N/A uint64_t guid;
2N/A uint64_t state;
2N/A uint64_t version;
2N/A nvlist_t *devices;
2N/A
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A PoolStatsBean_t *pool_stats = &(bean->interface_PoolStats);
2N/A DeviceStatsBean_t *dev_stats = (DeviceStatsBean_t *)pool_stats;
2N/A
2N/A if (nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &name) ||
2N/A nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) ||
2N/A nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, &state) ||
2N/A nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) ||
2N/A nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &devices) ||
2N/A populate_DeviceStatsBean(env, devices, dev_stats, object)) {
2N/A return (-1);
2N/A }
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setName, (*env)->NewStringUTF(env, name));
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setId, (jlong)guid);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A pool_stats->method_setPoolState,
2N/A zjni_pool_state_to_obj(env, (pool_state_t)state));
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A pool_stats->method_setPoolStatus,
2N/A zjni_pool_status_to_obj(env, zpool_import_status(config, &c)));
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A pool_stats->method_setPoolVersion, (jlong)version);
2N/A
2N/A return (0);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_VirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, VirtualDeviceBean_t *bean)
2N/A{
2N/A int result;
2N/A uint64_t vdev_id;
2N/A jstring poolUTF;
2N/A
2N/A zjni_Object_t *object = (zjni_Object_t *)bean;
2N/A DeviceStatsBean_t *stats = &(bean->interface_DeviceStats);
2N/A
2N/A result = populate_DeviceStatsBean(env, vdev, stats, object);
2N/A if (result != 0) {
2N/A return (1);
2N/A }
2N/A
2N/A /* Set pool name */
2N/A poolUTF = (*env)->NewStringUTF(env, zpool_get_name(zhp));
2N/A (*env)->CallVoidMethod(
2N/A env, object->object, bean->method_setPoolName, poolUTF);
2N/A
2N/A /* Set parent vdev index */
2N/A (*env)->CallVoidMethod(
2N/A env, object->object, bean->method_setParentIndex,
2N/A p_vdev_id == NULL ? NULL :
2N/A zjni_long_to_Long(env, *p_vdev_id));
2N/A
2N/A /* Get index */
2N/A result = nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &vdev_id);
2N/A if (result != 0) {
2N/A zjni_throw_exception(env,
2N/A "could not retrieve virtual device ID (pool %s)",
2N/A zpool_get_name(zhp));
2N/A return (1);
2N/A }
2N/A
2N/A (*env)->CallVoidMethod(
2N/A env, object->object, bean->method_setIndex, (jlong)vdev_id);
2N/A
2N/A return (0);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_LeafVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, LeafVirtualDeviceBean_t *bean)
2N/A{
2N/A return (populate_VirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, (VirtualDeviceBean_t *)bean));
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, DiskVirtualDeviceBean_t *bean)
2N/A{
2N/A char *path;
2N/A int result = populate_LeafVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
2N/A
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (-1);
2N/A }
2N/A
2N/A /* Set path */
2N/A result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
2N/A if (result != 0) {
2N/A zjni_throw_exception(env,
2N/A "could not retrieve path from disk virtual device "
2N/A "(pool %s)", zpool_get_name(zhp));
2N/A } else {
2N/A
2N/A regex_t re;
2N/A regmatch_t matches[2];
2N/A jstring pathUTF = NULL;
2N/A
2N/A /* Strip off slice portion of name, if applicable */
2N/A if (regcomp(&re, "^(/dev/dsk/.*)s[0-9]+$", REG_EXTENDED) == 0) {
2N/A if (regexec(&re, path, 2, matches, 0) == 0) {
2N/A regmatch_t *match = matches + 1;
2N/A if (match->rm_so != -1 && match->rm_eo != -1) {
2N/A char *tmp = strdup(path);
2N/A if (tmp != NULL) {
2N/A char *end = tmp + match->rm_eo;
2N/A *end = '\0';
2N/A pathUTF = (*env)->NewStringUTF(
2N/A env, tmp);
2N/A free(tmp);
2N/A }
2N/A }
2N/A }
2N/A regfree(&re);
2N/A }
2N/A if (regcomp(&re, "^(/dev/dsk/.*)s[0-9]+/old$", REG_EXTENDED) ==
2N/A 0) {
2N/A if (regexec(&re, path, 2, matches, 0) == 0) {
2N/A regmatch_t *match = matches + 1;
2N/A if (match->rm_so != -1 && match->rm_eo != -1) {
2N/A char *tmp = strdup(path);
2N/A if (tmp != NULL) {
2N/A (void) strcpy(tmp +
2N/A match->rm_eo, "/old");
2N/A pathUTF = (*env)->NewStringUTF(
2N/A env, tmp);
2N/A free(tmp);
2N/A }
2N/A }
2N/A }
2N/A regfree(&re);
2N/A }
2N/A
2N/A if (pathUTF == NULL) {
2N/A pathUTF = (*env)->NewStringUTF(env, path);
2N/A }
2N/A
2N/A (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
2N/A ((LeafVirtualDeviceBean_t *)bean)->method_setName, pathUTF);
2N/A }
2N/A
2N/A return (result != 0);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_SliceVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, SliceVirtualDeviceBean_t *bean)
2N/A{
2N/A char *path;
2N/A int result = populate_LeafVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
2N/A
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (-1);
2N/A }
2N/A
2N/A /* Set path */
2N/A result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
2N/A if (result != 0) {
2N/A zjni_throw_exception(env,
2N/A "could not retrieve path from slice virtual device (pool "
2N/A "%s)", zpool_get_name(zhp));
2N/A } else {
2N/A
2N/A jstring pathUTF = (*env)->NewStringUTF(env, path);
2N/A (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
2N/A ((LeafVirtualDeviceBean_t *)bean)->method_setName,
2N/A pathUTF);
2N/A }
2N/A
2N/A return (result != 0);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, FileVirtualDeviceBean_t *bean)
2N/A{
2N/A char *path;
2N/A int result = populate_LeafVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
2N/A
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (-1);
2N/A }
2N/A
2N/A /* Set path */
2N/A result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
2N/A if (result != 0) {
2N/A zjni_throw_exception(env,
2N/A "could not retrieve path from disk virtual device "
2N/A "(pool %s)", zpool_get_name(zhp));
2N/A } else {
2N/A
2N/A jstring pathUTF = (*env)->NewStringUTF(env, path);
2N/A (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
2N/A ((LeafVirtualDeviceBean_t *)bean)->method_setName, pathUTF);
2N/A }
2N/A
2N/A return (result != 0);
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, RAIDVirtualDeviceBean_t *bean)
2N/A{
2N/A return (populate_VirtualDeviceBean(env, zhp, vdev, p_vdev_id,
2N/A (VirtualDeviceBean_t *)bean));
2N/A}
2N/A
2N/Astatic int
2N/Apopulate_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id, MirrorVirtualDeviceBean_t *bean)
2N/A{
2N/A return (populate_VirtualDeviceBean(env, zhp, vdev, p_vdev_id,
2N/A (VirtualDeviceBean_t *)bean));
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_ImportablePoolBean(JNIEnv *env, nvlist_t *config)
2N/A{
2N/A int result;
2N/A ImportablePoolBean_t bean_obj = {0};
2N/A ImportablePoolBean_t *bean = &bean_obj;
2N/A
2N/A /* Construct ImportablePoolBean */
2N/A new_ImportablePoolBean(env, bean);
2N/A
2N/A result = populate_ImportablePoolBean(env, bean, config);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A DiskVirtualDeviceBean_t bean_obj = {0};
2N/A DiskVirtualDeviceBean_t *bean = &bean_obj;
2N/A
2N/A /* Construct DiskVirtualDeviceBean */
2N/A new_DiskVirtualDeviceBean(env, bean);
2N/A
2N/A result = populate_DiskVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, bean);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_SliceVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A SliceVirtualDeviceBean_t bean_obj = {0};
2N/A SliceVirtualDeviceBean_t *bean = &bean_obj;
2N/A
2N/A /* Construct SliceVirtualDeviceBean */
2N/A new_SliceVirtualDeviceBean(env, bean);
2N/A
2N/A result = populate_SliceVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, bean);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A FileVirtualDeviceBean_t bean_obj = {0};
2N/A FileVirtualDeviceBean_t *bean = &bean_obj;
2N/A
2N/A /* Construct FileVirtualDeviceBean */
2N/A new_FileVirtualDeviceBean(env, bean);
2N/A
2N/A result = populate_FileVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, bean);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A uint64_t parity;
2N/A RAIDVirtualDeviceBean_t bean_obj = {0};
2N/A RAIDVirtualDeviceBean_t *bean = &bean_obj;
2N/A
2N/A ((zjni_Object_t *)bean)->object = NULL;
2N/A
2N/A /* Construct RAIDVirtualDeviceBean */
2N/A new_RAIDVirtualDeviceBean(env, bean);
2N/A
2N/A /* Set parity bit */
2N/A result = nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_NPARITY,
2N/A &parity);
2N/A if (result) {
2N/A /* Default to RAID-Z1 in case of error */
2N/A parity = 1;
2N/A }
2N/A
2N/A (*env)->CallVoidMethod(
2N/A env, ((zjni_Object_t *)bean)->object, bean->method_setParity,
2N/A (jlong)parity);
2N/A
2N/A
2N/A result = populate_RAIDVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, bean);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic jobject
2N/Acreate_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A MirrorVirtualDeviceBean_t bean_obj = {0};
2N/A MirrorVirtualDeviceBean_t *bean = &bean_obj;
2N/A
2N/A /* Construct MirrorVirtualDeviceBean */
2N/A new_MirrorVirtualDeviceBean(env, bean);
2N/A
2N/A result = populate_MirrorVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id, bean);
2N/A if (result) {
2N/A /* Must not call any more Java methods to preserve exception */
2N/A return (NULL);
2N/A }
2N/A
2N/A return (((zjni_Object_t *)bean)->object);
2N/A}
2N/A
2N/Astatic char *
2N/Afind_field(const zjni_field_mapping_t *mapping, int value) {
2N/A int i;
2N/A for (i = 0; mapping[i].name != NULL; i++) {
2N/A if (value == mapping[i].value) {
2N/A return (mapping[i].name);
2N/A }
2N/A }
2N/A return (NULL);
2N/A}
2N/A
2N/A/*
2N/A * Converts a vdev_state_t to a Java DeviceStats$DeviceState object.
2N/A */
2N/Astatic jobject
2N/Azjni_vdev_state_to_obj(JNIEnv *env, vdev_state_t state)
2N/A{
2N/A return (zjni_int_to_enum(env, state,
2N/A ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState",
2N/A "VDEV_STATE_UNKNOWN", vdev_state_map));
2N/A}
2N/A
2N/A/*
2N/A * Converts a vdev_aux_t to a Java DeviceStats$DeviceStatus object.
2N/A */
2N/Astatic jobject
2N/Azjni_vdev_aux_to_obj(JNIEnv *env, vdev_aux_t aux)
2N/A{
2N/A return (zjni_int_to_enum(env, aux,
2N/A ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus",
2N/A "VDEV_AUX_NONE", vdev_aux_map));
2N/A}
2N/A
2N/A/*
2N/A * Package-private functions
2N/A */
2N/A
2N/A/* Create a DeviceStatsBean */
2N/Avoid
2N/Anew_DeviceStats(JNIEnv *env, DeviceStatsBean_t *bean, zjni_Object_t *object)
2N/A{
2N/A bean->method_setSize = (*env)->GetMethodID(
2N/A env, object->class, "setSize", "(J)V");
2N/A
2N/A bean->method_setReplacementSize = (*env)->GetMethodID(
2N/A env, object->class, "setReplacementSize", "(J)V");
2N/A
2N/A bean->method_setUsed = (*env)->GetMethodID(
2N/A env, object->class, "setUsed", "(J)V");
2N/A
2N/A bean->method_setReadBytes = (*env)->GetMethodID(
2N/A env, object->class, "setReadBytes", "(J)V");
2N/A
2N/A bean->method_setWriteBytes = (*env)->GetMethodID(
2N/A env, object->class, "setWriteBytes", "(J)V");
2N/A
2N/A bean->method_setReadOperations = (*env)->GetMethodID(
2N/A env, object->class, "setReadOperations", "(J)V");
2N/A
2N/A bean->method_setWriteOperations = (*env)->GetMethodID(
2N/A env, object->class, "setWriteOperations", "(J)V");
2N/A
2N/A bean->method_setReadErrors = (*env)->GetMethodID(
2N/A env, object->class, "setReadErrors", "(J)V");
2N/A
2N/A bean->method_setWriteErrors = (*env)->GetMethodID(
2N/A env, object->class, "setWriteErrors", "(J)V");
2N/A
2N/A bean->method_setChecksumErrors = (*env)->GetMethodID(
2N/A env, object->class, "setChecksumErrors", "(J)V");
2N/A
2N/A bean->method_setDeviceState = (*env)->GetMethodID(
2N/A env, object->class, "setDeviceState",
2N/A "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState;)V");
2N/A
2N/A bean->method_setDeviceStatus = (*env)->GetMethodID(
2N/A env, object->class, "setDeviceStatus",
2N/A "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus;)V");
2N/A}
2N/A
2N/A/* Create a PoolStatsBean */
2N/Avoid
2N/Anew_PoolStats(JNIEnv *env, PoolStatsBean_t *bean, zjni_Object_t *object)
2N/A{
2N/A new_DeviceStats(env, (DeviceStatsBean_t *)bean, object);
2N/A
2N/A bean->method_setPoolState = (*env)->GetMethodID(
2N/A env, object->class, "setPoolState",
2N/A "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolState;)V");
2N/A
2N/A bean->method_setPoolStatus = (*env)->GetMethodID(
2N/A env, object->class, "setPoolStatus",
2N/A "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus;)V");
2N/A
2N/A bean->method_setPoolVersion = (*env)->GetMethodID(
2N/A env, object->class, "setPoolVersion", "(J)V");
2N/A}
2N/A
2N/A/*
2N/A * Gets the root vdev (an nvlist_t *) for the given pool.
2N/A */
2N/Anvlist_t *
2N/Azjni_get_root_vdev(zpool_handle_t *zhp)
2N/A{
2N/A nvlist_t *root = NULL;
2N/A
2N/A if (zhp != NULL) {
2N/A nvlist_t *attrs = zpool_get_config(zhp, NULL);
2N/A
2N/A if (attrs != NULL) {
2N/A int result = nvlist_lookup_nvlist(
2N/A attrs, ZPOOL_CONFIG_VDEV_TREE, &root);
2N/A if (result != 0) {
2N/A root = NULL;
2N/A }
2N/A }
2N/A }
2N/A
2N/A return (root);
2N/A}
2N/A
2N/A/*
2N/A * Gets the vdev (an nvlist_t *) with the given vdev_id, below the
2N/A * given vdev. If the given vdev is NULL, all vdevs within the given
2N/A * pool are searched.
2N/A *
2N/A * If p_vdev_id is not NULL, it will be set to the ID of the parent
2N/A * vdev, if any, or to vdev_id_to_find if the searched-for vdev is a
2N/A * toplevel vdev.
2N/A */
2N/Anvlist_t *
2N/Azjni_get_vdev(zpool_handle_t *zhp, nvlist_t *vdev_parent,
2N/A uint64_t vdev_id_to_find, uint64_t *p_vdev_id)
2N/A{
2N/A int result;
2N/A uint64_t id = vdev_id_to_find;
2N/A
2N/A /* Was a vdev specified? */
2N/A if (vdev_parent == NULL) {
2N/A /* No -- retrieve the top-level pool vdev */
2N/A vdev_parent = zjni_get_root_vdev(zhp);
2N/A } else {
2N/A /* Get index of this vdev and compare with vdev_id_to_find */
2N/A result = nvlist_lookup_uint64(
2N/A vdev_parent, ZPOOL_CONFIG_GUID, &id);
2N/A if (result == 0 && id == vdev_id_to_find) {
2N/A return (vdev_parent);
2N/A }
2N/A }
2N/A
2N/A if (vdev_parent != NULL) {
2N/A
2N/A nvlist_t **children;
2N/A uint_t nelem = 0;
2N/A
2N/A /* Get the vdevs under this vdev */
2N/A result = nvlist_lookup_nvlist_array(
2N/A vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
2N/A
2N/A if (result == 0) {
2N/A
2N/A int i;
2N/A nvlist_t *child;
2N/A
2N/A /* For each vdev child... */
2N/A for (i = 0; i < nelem; i++) {
2N/A if (p_vdev_id != NULL) {
2N/A /* Save parent vdev id */
2N/A *p_vdev_id = id;
2N/A }
2N/A
2N/A child = zjni_get_vdev(zhp, children[i],
2N/A vdev_id_to_find, p_vdev_id);
2N/A if (child != NULL) {
2N/A return (child);
2N/A }
2N/A }
2N/A }
2N/A }
2N/A
2N/A return (NULL);
2N/A}
2N/A
2N/Ajobject
2N/Azjni_get_VirtualDevice_from_vdev(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev, uint64_t *p_vdev_id)
2N/A{
2N/A jobject obj = NULL;
2N/A char *type = NULL;
2N/A int result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_TYPE, &type);
2N/A
2N/A if (result == 0) {
2N/A if (strcmp(type, VDEV_TYPE_DISK) == 0) {
2N/A uint64_t wholedisk;
2N/A if (nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
2N/A &wholedisk) == 0 && wholedisk) {
2N/A obj = create_DiskVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id);
2N/A } else {
2N/A obj = create_SliceVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id);
2N/A }
2N/A } else if (strcmp(type, VDEV_TYPE_FILE) == 0) {
2N/A obj = create_FileVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id);
2N/A } else if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) {
2N/A obj = create_RAIDVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id);
2N/A } else if (strcmp(type, VDEV_TYPE_MIRROR) == 0) {
2N/A obj = create_MirrorVirtualDeviceBean(
2N/A env, zhp, vdev, p_vdev_id);
2N/A } else if (strcmp(type, VDEV_TYPE_REPLACING) == 0) {
2N/A
2N/A /* Get the vdevs under this vdev */
2N/A nvlist_t **children;
2N/A uint_t nelem = 0;
2N/A int result = nvlist_lookup_nvlist_array(
2N/A vdev, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
2N/A
2N/A if (result == 0 && nelem > 0) {
2N/A
2N/A /* Get last vdev child (replacement device) */
2N/A nvlist_t *child = children[nelem - 1];
2N/A
2N/A obj = zjni_get_VirtualDevice_from_vdev(env,
2N/A zhp, child, p_vdev_id);
2N/A }
2N/A }
2N/A }
2N/A
2N/A return (obj);
2N/A}
2N/A
2N/Ajobject
2N/Azjni_get_VirtualDevices_from_vdev(JNIEnv *env, zpool_handle_t *zhp,
2N/A nvlist_t *vdev_parent, uint64_t *p_vdev_id)
2N/A{
2N/A /* Create an array list for the vdevs */
2N/A zjni_ArrayList_t list_class = {0};
2N/A zjni_ArrayList_t *list_class_p = &list_class;
2N/A zjni_new_ArrayList(env, list_class_p);
2N/A
2N/A /* Was a vdev specified? */
2N/A if (vdev_parent == NULL) {
2N/A /* No -- retrieve the top-level pool vdev */
2N/A vdev_parent = zjni_get_root_vdev(zhp);
2N/A }
2N/A
2N/A if (vdev_parent != NULL) {
2N/A
2N/A /* Get the vdevs under this vdev */
2N/A nvlist_t **children;
2N/A uint_t nelem = 0;
2N/A int result = nvlist_lookup_nvlist_array(
2N/A vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
2N/A
2N/A if (result == 0) {
2N/A
2N/A /* For each vdev child... */
2N/A int i;
2N/A for (i = 0; i < nelem; i++) {
2N/A nvlist_t *child = children[i];
2N/A
2N/A /* Create a Java object from this vdev */
2N/A jobject obj =
2N/A zjni_get_VirtualDevice_from_vdev(env,
2N/A zhp, child, p_vdev_id);
2N/A
2N/A if ((*env)->ExceptionOccurred(env) != NULL) {
2N/A /*
2N/A * Must not call any more Java methods
2N/A * to preserve exception
2N/A */
2N/A return (NULL);
2N/A }
2N/A
2N/A if (obj != NULL) {
2N/A /* Add child to child vdev list */
2N/A (*env)->CallBooleanMethod(env,
2N/A ((zjni_Object_t *)
2N/A list_class_p)->object,
2N/A ((zjni_Collection_t *)
2N/A list_class_p)->method_add, obj);
2N/A }
2N/A }
2N/A }
2N/A }
2N/A
2N/A return (zjni_Collection_to_array(
2N/A env, (zjni_Collection_t *)list_class_p,
2N/A ZFSJNI_PACKAGE_DATA "VirtualDevice"));
2N/A}
2N/A
2N/Aint
2N/Azjni_create_add_ImportablePool(nvlist_t *config, void *data) {
2N/A
2N/A JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
2N/A zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
2N/A
2N/A /* Construct ImportablePool object */
2N/A jobject bean = create_ImportablePoolBean(env, config);
2N/A if (bean == NULL) {
2N/A return (-1);
2N/A }
2N/A
2N/A /* Add bean to list */
2N/A (*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
2N/A ((zjni_Collection_t *)list)->method_add, bean);
2N/A
2N/A return (0);
2N/A}
2N/A
2N/Aint
2N/Apopulate_DeviceStatsBean(JNIEnv *env, nvlist_t *vdev,
2N/A DeviceStatsBean_t *bean, zjni_Object_t *object)
2N/A{
2N/A uint_t c;
2N/A vdev_stat_t *vs;
2N/A
2N/A int result = nvlist_lookup_uint64_array(
2N/A vdev, ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &c);
2N/A if (result != 0) {
2N/A zjni_throw_exception(env,
2N/A "could not retrieve virtual device statistics");
2N/A return (1);
2N/A }
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setUsed, (jlong)vs->vs_alloc);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setSize, (jlong)vs->vs_space);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setReplacementSize, (jlong)vs->vs_rsize);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setReadBytes, (jlong)vs->vs_bytes[ZIO_TYPE_READ]);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setWriteBytes, (jlong)vs->vs_bytes[ZIO_TYPE_WRITE]);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setReadOperations, (jlong)vs->vs_ops[ZIO_TYPE_READ]);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setWriteOperations, (jlong)vs->vs_ops[ZIO_TYPE_WRITE]);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setReadErrors, (jlong)vs->vs_read_errors);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setWriteErrors, (jlong)vs->vs_write_errors);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setChecksumErrors, (jlong)vs->vs_checksum_errors);
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setDeviceState,
2N/A zjni_vdev_state_to_obj(env, vs->vs_state));
2N/A
2N/A (*env)->CallVoidMethod(env, object->object,
2N/A bean->method_setDeviceStatus,
2N/A zjni_vdev_aux_to_obj(env, vs->vs_aux));
2N/A
2N/A return (0);
2N/A}
2N/A
2N/A/*
2N/A * Converts a pool_state_t to a Java PoolStats$PoolState object.
2N/A */
2N/Ajobject
2N/Azjni_pool_state_to_obj(JNIEnv *env, pool_state_t state)
2N/A{
2N/A return (zjni_int_to_enum(env, state,
2N/A ZFSJNI_PACKAGE_DATA "PoolStats$PoolState",
2N/A "POOL_STATE_ACTIVE", pool_state_map));
2N/A}
2N/A
2N/A/*
2N/A * Converts a zpool_status_t to a Java PoolStats$PoolStatus object.
2N/A */
2N/Ajobject
2N/Azjni_pool_status_to_obj(JNIEnv *env, zpool_status_t status)
2N/A{
2N/A return (zjni_int_to_enum(env, status,
2N/A ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus",
2N/A "ZPOOL_STATUS_OK", zpool_status_map));
2N/A}
2N/A
2N/A/*
2N/A * Extern functions
2N/A */
2N/A
2N/A/*
2N/A * Iterates through each importable pool on the system. For each
2N/A * importable pool, runs the given function with the given void as the
2N/A * last arg.
2N/A */
2N/Aint
2N/Azjni_ipool_iter(int argc, char **argv, zjni_ipool_iter_f func, void *data)
2N/A{
2N/A nvlist_t *pools = zpool_find_import(g_zfs, argc, argv);
2N/A
2N/A if (pools != NULL) {
2N/A nvpair_t *elem = NULL;
2N/A
2N/A while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
2N/A nvlist_t *config;
2N/A
2N/A if (nvpair_value_nvlist(elem, &config) != 0 ||
2N/A func(config, data)) {
2N/A return (-1);
2N/A }
2N/A }
2N/A }
2N/A
2N/A return (0);
2N/A}
2N/A
2N/Achar *
2N/Azjni_vdev_state_to_str(vdev_state_t state) {
2N/A return (find_field(vdev_state_map, state));
2N/A}
2N/A
2N/Achar *
2N/Azjni_vdev_aux_to_str(vdev_aux_t aux) {
2N/A return (find_field(vdev_aux_map, aux));
2N/A}
2N/A
2N/Achar *
2N/Azjni_pool_state_to_str(pool_state_t state) {
2N/A return (find_field(pool_state_map, state));
2N/A}
2N/A
2N/Achar *
2N/Azjni_pool_status_to_str(zpool_status_t status) {
2N/A return (find_field(zpool_status_map, status));
2N/A}