summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortalley <none@none>2006-01-03 20:07:12 -0800
committertalley <none@none>2006-01-03 20:07:12 -0800
commitfbfd10ff571cfd0139aa5127460f1b8a53dac971 (patch)
tree5d165ea048e4ceeb13cbbd9a1898fd3e2f81e76e
parentadccf2f268a15d5b03cd4d65d7ad9d2392ded017 (diff)
downloadillumos-joyent-fbfd10ff571cfd0139aa5127460f1b8a53dac971.tar.gz
6362897 JNI throws an UnsupportedOperationException on invalid dataset path
6363276 Update JNI to support IO statistics 6364781 JNI should support pool state
-rw-r--r--usr/src/cmd/availdevs/Makefile4
-rw-r--r--usr/src/cmd/availdevs/availdevs.c76
-rw-r--r--usr/src/cmd/availdevs/availdevs.h19
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c106
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h10
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_main.c5
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c433
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h36
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_property.c58
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_property.h4
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_util.c40
-rw-r--r--usr/src/lib/libzfs_jni/common/libzfs_jni_util.h9
-rw-r--r--usr/src/lib/libzfs_jni/spec/libzfs_jni.spec18
13 files changed, 557 insertions, 261 deletions
diff --git a/usr/src/cmd/availdevs/Makefile b/usr/src/cmd/availdevs/Makefile
index 5870b0fadf..571c88cd3d 100644
--- a/usr/src/cmd/availdevs/Makefile
+++ b/usr/src/cmd/availdevs/Makefile
@@ -20,7 +20,7 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -38,7 +38,7 @@ INCS += -I/usr/include/libxml2
# There is no lint library for libxml2, so we need to avoid linking against
# it during lint, as well as turning off the warnings lint would generate.
#
-LDLIBS += -lzfs_jni
+LDLIBS += -lzfs_jni -lnvpair -lzfs
all install := LDLIBS += -lxml2
LINTFLAGS += -xerroff=E_NAME_USED_NOT_DEF2
diff --git a/usr/src/cmd/availdevs/availdevs.c b/usr/src/cmd/availdevs/availdevs.c
index c4a8365da6..0a35a163ae 100644
--- a/usr/src/cmd/availdevs/availdevs.c
+++ b/usr/src/cmd/availdevs/availdevs.c
@@ -20,13 +20,14 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include "availdevs.h"
+#include <libzfs.h>
#include <libzfs_jni_diskmgt.h>
#include <libzfs_jni_ipool.h>
#include <libxml/parser.h>
@@ -37,7 +38,7 @@
static void handle_error(const char *, va_list);
static int add_disk_to_xml(dmgt_disk_t *, void *);
-static int add_pool_to_xml(char *, uint64_t, uint64_t, char *, void *);
+static int add_pool_to_xml(nvlist_t *, void *);
static xmlDocPtr create_doc();
int main();
@@ -112,27 +113,74 @@ add_disk_to_xml(dmgt_disk_t *dp, void *data)
}
static int
-add_pool_to_xml(char *name, uint64_t guid,
- uint64_t pool_state, char *health, void *data)
+add_pool_to_xml(nvlist_t *config, void *data)
{
- char *state;
+ char *c;
+ char *name;
+ uint64_t guid;
+ uint64_t state;
+ nvlist_t *devices;
+ uint_t n;
+ vdev_stat_t *vs;
char tmp[64];
+ xmlNodePtr pool;
xmlNodePtr importable = *((xmlNodePtr *)data);
- xmlNodePtr pool = xmlNewChild(
- importable, NULL, (xmlChar *)ELEMENT_POOL, NULL);
- xmlSetProp(pool, (xmlChar *)ATTR_POOL_NAME, (xmlChar *)name);
-
- state = zjni_get_state_str(pool_state);
- if (state == NULL) {
- state = "";
+ if (nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &name) ||
+ nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) ||
+ nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, &state) ||
+ nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &devices) ||
+ nvlist_lookup_uint64_array(
+ devices, ZPOOL_CONFIG_STATS, (uint64_t **)&vs, &n)) {
+ return (-1);
}
- xmlSetProp(pool, (xmlChar *)ATTR_POOL_STATE, (xmlChar *)state);
- xmlSetProp(pool, (xmlChar *)ATTR_POOL_HEALTH, (xmlChar *)health);
+
+ pool = xmlNewChild(importable, NULL, (xmlChar *)ELEMENT_POOL, NULL);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_NAME, (xmlChar *)name);
(void) snprintf(tmp, sizeof (tmp), "%llu", guid);
xmlSetProp(pool, (xmlChar *)ATTR_POOL_ID, (xmlChar *)tmp);
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_alloc);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_USED, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_space);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_SIZE, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_bytes[ZIO_TYPE_READ]);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_READ_BYTES, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu",
+ vs->vs_bytes[ZIO_TYPE_WRITE]);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_WRITE_BYTES, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_ops[ZIO_TYPE_READ]);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_READ_OPERATIONS, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_ops[ZIO_TYPE_WRITE]);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_WRITE_OPERATIONS, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_read_errors);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_READ_ERRORS, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_write_errors);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_WRITE_ERRORS, (xmlChar *)tmp);
+
+ (void) snprintf(tmp, sizeof (tmp), "%llu", vs->vs_checksum_errors);
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_CHECKSUM_ERRORS, (xmlChar *)tmp);
+
+ xmlSetProp(pool, (xmlChar *)ATTR_DEVICE_STATE,
+ (xmlChar *)zjni_vdev_state_to_str(vs->vs_state));
+
+ xmlSetProp(pool, (xmlChar *)ATTR_DEVICE_STATUS,
+ (xmlChar *)zjni_vdev_aux_to_str(vs->vs_aux));
+
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_STATE,
+ (xmlChar *)zjni_pool_state_to_str(state));
+
+ xmlSetProp(pool, (xmlChar *)ATTR_POOL_STATUS, (xmlChar *)
+ zjni_pool_status_to_str(zpool_import_status(config, &c)));
+
return (0);
}
diff --git a/usr/src/cmd/availdevs/availdevs.h b/usr/src/cmd/availdevs/availdevs.h
index d4db171647..5268d3d168 100644
--- a/usr/src/cmd/availdevs/availdevs.h
+++ b/usr/src/cmd/availdevs/availdevs.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -51,19 +51,32 @@ extern "C" {
#define ELEMENT_POOL "pool"
#define ELEMENT_ROOT "zfsconfig"
#define ELEMENT_SLICE "slice"
+
#define ATTR_ALIAS_NAME "name"
+#define ATTR_DEVICE_STATE "devicestate"
+#define ATTR_DEVICE_STATUS "devicestatus"
#define ATTR_DISK_INUSE "inuse"
#define ATTR_DISK_NAME "name"
#define ATTR_DISK_SIZE "size"
-#define ATTR_POOL_HEALTH "health"
+#define ATTR_POOL_CHECKSUM_ERRORS "checksumerrors"
#define ATTR_POOL_ID "id"
#define ATTR_POOL_NAME "name"
-#define ATTR_POOL_STATE "state"
+#define ATTR_POOL_READ_BYTES "readbytes"
+#define ATTR_POOL_READ_ERRORS "readerrors"
+#define ATTR_POOL_READ_OPERATIONS "readoperations"
+#define ATTR_POOL_SIZE "size"
+#define ATTR_POOL_STATE "poolstate"
+#define ATTR_POOL_STATUS "poolstatus"
+#define ATTR_POOL_USED "used"
+#define ATTR_POOL_WRITE_BYTES "writebytes"
+#define ATTR_POOL_WRITE_ERRORS "writeerrors"
+#define ATTR_POOL_WRITE_OPERATIONS "writeoperations"
#define ATTR_SLICE_NAME "name"
#define ATTR_SLICE_SIZE "size"
#define ATTR_SLICE_START "start"
#define ATTR_SLICE_USED_BY "used-by"
#define ATTR_SLICE_USED_NAME "used-name"
+
#define VAL_ATTR_FALSE "false"
#define VAL_ATTR_TRUE "true"
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c
index 4bcdd1f561..4e12620ea3 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c
@@ -20,14 +20,16 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
+#include "libzfs_jni_util.h"
#include "libzfs_jni_dataset.h"
#include "libzfs_jni_property.h"
+#include "libzfs_jni_pool.h"
#include <strings.h>
#define REGEX_ZFS_NAME "^((([^/]*)(/.+)?)[/@])?([^/]+)/*"
@@ -56,8 +58,7 @@ typedef struct FileSystemBean {
typedef struct PoolBean {
FileSystemBean_t super;
-
- jmethodID method_setSize;
+ PoolStatsBean_t interface_PoolStats;
} PoolBean_t;
typedef struct VolumeBean {
@@ -165,10 +166,8 @@ new_PoolBean(JNIEnv *env, PoolBean_t *bean)
(*env)->NewObject(env, object->class, object->constructor);
}
- bean->method_setSize = (*env)->GetMethodID(
- env, object->class, "setSize", "(J)V");
-
new_FileSystemBean(env, (FileSystemBean_t *)bean);
+ new_PoolStats(env, &(bean->interface_PoolStats), object);
}
/* Create a FileSystemBean */
@@ -340,20 +339,49 @@ populate_DatasetBean(JNIEnv *env, zfs_handle_t *zhp, DatasetBean_t *bean)
static int
populate_PoolBean(JNIEnv *env, zfs_handle_t *zhp, PoolBean_t *bean)
{
- zjni_Object_t *object = (zjni_Object_t *)bean;
+ int result = 0;
const char *name = zfs_get_name(zhp);
zpool_handle_t *zphp = zpool_open_canfail(name);
if (zphp == NULL) {
- return (-1);
- }
+ result = -1;
+ } else {
+ zjni_Object_t *object = (zjni_Object_t *)bean;
+ PoolStatsBean_t *pool_stats = &(bean->interface_PoolStats);
+ DeviceStatsBean_t *dev_stats = (DeviceStatsBean_t *)pool_stats;
+ nvlist_t *devices = zjni_get_root_vdev(zphp);
+
+ if (devices == NULL ||
+ populate_DeviceStatsBean(env, devices, dev_stats, object)) {
+ result = -1;
+ } else {
+ char *msgid;
+
+ /* Override value set in populate_DeviceStatsBean */
+ (*env)->CallVoidMethod(env, object->object,
+ dev_stats->method_setSize,
+ zpool_get_space_total(zphp));
+
+ (*env)->CallVoidMethod(env, object->object,
+ pool_stats->method_setPoolState,
+ zjni_pool_state_to_obj(
+ env, zpool_get_state(zphp)));
+
+ (*env)->CallVoidMethod(env, object->object,
+ pool_stats->method_setPoolStatus,
+ zjni_pool_status_to_obj(env,
+ zpool_get_status(zphp, &msgid)));
+ }
- (*env)->CallVoidMethod(env, object->object,
- bean->method_setSize, zpool_get_space_total(zphp));
+ zpool_close(zphp);
- zpool_close(zphp);
+ if (result == 0) {
+ result = populate_FileSystemBean(
+ env, zhp, (FileSystemBean_t *)bean);
+ }
+ }
- return (populate_FileSystemBean(env, zhp, (FileSystemBean_t *)bean));
+ return (result != 0);
}
static int
@@ -561,10 +589,6 @@ open_device(JNIEnv *env, jstring nameUTF, zfs_type_t typemask)
(*env)->GetStringUTFChars(env, nameUTF, NULL);
zhp = zfs_open(name, typemask);
- if (zhp == NULL) {
- zjni_throw_exception(env, "invalid device name: %s",
- name);
- }
(*env)->ReleaseStringUTFChars(env, nameUTF, name);
}
@@ -627,27 +651,19 @@ zjni_get_Datasets_below(JNIEnv *env, jstring parentUTF,
/* Retrieve parent */
zhp = open_device(env, parentUTF, parent_typemask);
if (zhp != NULL) {
+ zjni_DatasetArrayCallbackData_t data = {0};
+ data.data.env = env;
+ data.data.list = (zjni_Collection_t *)list;
+ data.typemask = child_typemask;
- if (!(zfs_get_type(zhp) & parent_typemask)) {
- zjni_throw_exception(env, "wrong type: %s",
- zfs_get_name(zhp));
- } else {
-
- zjni_DatasetArrayCallbackData_t data = {0};
- data.data.env = env;
- data.data.list = (zjni_Collection_t *)list;
- data.typemask = child_typemask;
-
- (void) zfs_iter_children(zhp, zjni_create_add_Dataset,
- &data);
- }
+ (void) zfs_iter_children(zhp, zjni_create_add_Dataset, &data);
zfs_close(zhp);
- }
- if ((*env)->ExceptionOccurred(env) == NULL) {
- array = zjni_Collection_to_array(
- env, (zjni_Collection_t *)list, arrayClass);
+ if ((*env)->ExceptionOccurred(env) == NULL) {
+ array = zjni_Collection_to_array(
+ env, (zjni_Collection_t *)list, arrayClass);
+ }
}
return (array);
@@ -677,11 +693,7 @@ zjni_get_Datasets_dependents(JNIEnv *env, jobjectArray paths)
((*env)->GetObjectArrayElement(env, paths, i));
zfs_handle_t *zhp = open_device(env, pathUTF, ZFS_TYPE_ANY);
- if (zhp == NULL) {
- /* Clear the exception */
- (*env)->ExceptionClear(env);
- } else {
-
+ if (zhp != NULL) {
/* Add all dependents of this Dataset to the list */
(void) zfs_iter_dependents(zhp,
zjni_create_add_Dataset, &data);
@@ -708,19 +720,9 @@ zjni_get_Dataset(JNIEnv *env, jstring nameUTF, zfs_type_t typemask)
{
jobject device = NULL;
zfs_handle_t *zhp = open_device(env, nameUTF, typemask);
- if (zhp == NULL) {
- /*
- * Clear the exception -- this function returns NULL
- * on invalid device
- */
- (*env)->ExceptionClear(env);
- } else {
-
- /* Is this device the expected type? */
- if (zfs_get_type(zhp) & typemask) {
- /* Creates an object of the appropriate class */
- device = create_DatasetBean(env, zhp);
- }
+ if (zhp != NULL) {
+ /* Creates an object of the appropriate class */
+ device = create_DatasetBean(env, zhp);
zfs_close(zhp);
}
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h b/usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h
index 4420ce7ea0..a952ea0c17 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -38,8 +38,7 @@ extern "C" {
*/
/* Callback function for importable pool iteration */
-typedef int (*zjni_ipool_iter_f)(char *name,
- uint64_t guid, uint64_t pool_state, char *health, void *data);
+typedef int (*zjni_ipool_iter_f)(nvlist_t *config, void *data);
/*
* Function prototypes
@@ -47,7 +46,10 @@ typedef int (*zjni_ipool_iter_f)(char *name,
extern int zjni_ipool_iter(
int argc, char **argv, zjni_ipool_iter_f func, void *data);
-extern char *zjni_get_state_str(uint64_t pool_state);
+extern char *zjni_vdev_state_to_str(vdev_state_t state);
+extern char *zjni_vdev_aux_to_str(vdev_aux_t aux);
+extern char *zjni_pool_state_to_str(pool_state_t state);
+extern char *zjni_pool_status_to_str(zpool_status_t status);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c
index c874140544..3b66b34e3f 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -302,7 +302,8 @@ Java_com_sun_zfs_common_model_SystemDataModel_getDatasets(JNIEnv *env,
}
return (zjni_get_Datasets_below(env, containerUTF,
- ZFS_TYPE_FILESYSTEM, ZFS_TYPE_ANY, ZFSJNI_PACKAGE_DATA "Dataset"));
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, ZFS_TYPE_ANY,
+ ZFSJNI_PACKAGE_DATA "Dataset"));
}
/*
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c
index 4bbf428595..96180c11fd 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c
@@ -20,14 +20,13 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include "libzfs_jni_pool.h"
-#include "libzfs_jni_util.h"
#include <strings.h>
/*
@@ -36,20 +35,18 @@
typedef struct ImportablePoolBean {
zjni_Object_t super;
+ PoolStatsBean_t interface_PoolStats;
jmethodID method_setName;
jmethodID method_setId;
- jmethodID method_setState;
- jmethodID method_setHealth;
} ImportablePoolBean_t;
typedef struct VirtualDeviceBean {
zjni_Object_t super;
+ DeviceStatsBean_t interface_DeviceStats;
jmethodID method_setPoolName;
jmethodID method_setIndex;
- jmethodID method_setSize;
- jmethodID method_setUsed;
} VirtualDeviceBean_t;
typedef struct DiskVirtualDeviceBean {
@@ -73,6 +70,67 @@ typedef struct MirrorVirtualDeviceBean {
} MirrorVirtualDeviceBean_t;
/*
+ * Data
+ */
+
+/* vdev_state_t to DeviceStats$DeviceState map */
+static zjni_field_mapping_t vdev_state_map[] = {
+ { VDEV_STATE_CANT_OPEN, "VDEV_STATE_CANT_OPEN" },
+ { VDEV_STATE_CLOSED, "VDEV_STATE_CLOSED" },
+ { VDEV_STATE_DEGRADED, "VDEV_STATE_DEGRADED" },
+ { VDEV_STATE_HEALTHY, "VDEV_STATE_HEALTHY" },
+ { VDEV_STATE_OFFLINE, "VDEV_STATE_OFFLINE" },
+ { VDEV_STATE_UNKNOWN, "VDEV_STATE_UNKNOWN" },
+ { -1, NULL },
+};
+
+/* vdev_aux_t to DeviceStats$DeviceStatus map */
+static zjni_field_mapping_t vdev_aux_map[] = {
+ { VDEV_AUX_NONE, "VDEV_AUX_NONE" },
+ { VDEV_AUX_OPEN_FAILED, "VDEV_AUX_OPEN_FAILED" },
+ { VDEV_AUX_CORRUPT_DATA, "VDEV_AUX_CORRUPT_DATA" },
+ { VDEV_AUX_NO_REPLICAS, "VDEV_AUX_NO_REPLICAS" },
+ { VDEV_AUX_BAD_GUID_SUM, "VDEV_AUX_BAD_GUID_SUM" },
+ { VDEV_AUX_TOO_SMALL, "VDEV_AUX_TOO_SMALL" },
+ { VDEV_AUX_BAD_LABEL, "VDEV_AUX_BAD_LABEL" },
+ { -1, NULL },
+};
+
+/* zpool_state_t to PoolStats$PoolState map */
+static zjni_field_mapping_t pool_state_map[] = {
+ { POOL_STATE_ACTIVE, "POOL_STATE_ACTIVE" },
+ { POOL_STATE_EXPORTED, "POOL_STATE_EXPORTED" },
+ { POOL_STATE_DESTROYED, "POOL_STATE_DESTROYED" },
+ { POOL_STATE_UNINITIALIZED, "POOL_STATE_UNINITIALIZED" },
+ { POOL_STATE_UNAVAIL, "POOL_STATE_UNAVAIL" },
+ { -1, NULL },
+};
+
+/* zpool_status_t to PoolStats$PoolStatus map */
+static zjni_field_mapping_t zpool_status_map[] = {
+ { ZPOOL_STATUS_CORRUPT_CACHE,
+ "ZPOOL_STATUS_CORRUPT_CACHE" },
+ { ZPOOL_STATUS_MISSING_DEV_R,
+ "ZPOOL_STATUS_MISSING_DEV_R" },
+ { ZPOOL_STATUS_MISSING_DEV_NR,
+ "ZPOOL_STATUS_MISSING_DEV_NR" },
+ { ZPOOL_STATUS_CORRUPT_LABEL_R,
+ "ZPOOL_STATUS_CORRUPT_LABEL_R" },
+ { ZPOOL_STATUS_CORRUPT_LABEL_NR,
+ "ZPOOL_STATUS_CORRUPT_LABEL_NR" },
+ { ZPOOL_STATUS_BAD_GUID_SUM, "ZPOOL_STATUS_BAD_GUID_SUM" },
+ { ZPOOL_STATUS_CORRUPT_POOL, "ZPOOL_STATUS_CORRUPT_POOL" },
+ { ZPOOL_STATUS_CORRUPT_DATA, "ZPOOL_STATUS_CORRUPT_DATA" },
+ { ZPOOL_STATUS_FAILING_DEV, "ZPOOL_STATUS_FAILING_DEV" },
+ { ZPOOL_STATUS_VERSION_MISMATCH,
+ "ZPOOL_STATUS_VERSION_MISMATCH" },
+ { ZPOOL_STATUS_RESILVERING, "ZPOOL_STATUS_RESILVERING" },
+ { ZPOOL_STATUS_OFFLINE_DEV, "ZPOOL_STATUS_OFFLINE_DEV" },
+ { ZPOOL_STATUS_OK, "ZPOOL_STATUS_OK" },
+ { -1, NULL },
+};
+
+/*
* Function prototypes
*/
@@ -82,9 +140,8 @@ static void new_DiskVirtualDeviceBean(JNIEnv *, DiskVirtualDeviceBean_t *);
static void new_FileVirtualDeviceBean(JNIEnv *, FileVirtualDeviceBean_t *);
static void new_RAIDVirtualDeviceBean(JNIEnv *, RAIDVirtualDeviceBean_t *);
static void new_MirrorVirtualDeviceBean(JNIEnv *, MirrorVirtualDeviceBean_t *);
-static jobject uint64_to_state(JNIEnv *, uint64_t);
static int populate_ImportablePoolBean(
- JNIEnv *, ImportablePoolBean_t *, char *, uint64_t, uint64_t, char *);
+ JNIEnv *, ImportablePoolBean_t *, nvlist_t *);
static int populate_VirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *, VirtualDeviceBean_t *);
static int populate_DiskVirtualDeviceBean(
@@ -95,8 +152,7 @@ static int populate_RAIDVirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *, RAIDVirtualDeviceBean_t *);
static int populate_MirrorVirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *, MirrorVirtualDeviceBean_t *);
-static jobject create_ImportablePoolBean(
- JNIEnv *, char *, uint64_t, uint64_t, char *);
+static jobject create_ImportablePoolBean(JNIEnv *, nvlist_t *);
static jobject create_DiskVirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *);
static jobject create_FileVirtualDeviceBean(
@@ -105,6 +161,9 @@ static jobject create_RAIDVirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *);
static jobject create_MirrorVirtualDeviceBean(
JNIEnv *, zpool_handle_t *, nvlist_t *);
+static char *find_field(const zjni_field_mapping_t *, int);
+static jobject zjni_vdev_state_to_obj(JNIEnv *, vdev_state_t);
+static jobject zjni_vdev_aux_to_obj(JNIEnv *, vdev_aux_t);
/*
* Static functions
@@ -128,18 +187,13 @@ new_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean)
(*env)->NewObject(env, object->class, object->constructor);
}
+ new_PoolStats(env, &(bean->interface_PoolStats), object);
+
bean->method_setName = (*env)->GetMethodID(
env, object->class, "setName", "(Ljava/lang/String;)V");
bean->method_setId = (*env)->GetMethodID(
env, object->class, "setId", "(J)V");
-
- bean->method_setState = (*env)->GetMethodID(
- env, object->class, "setState",
- "(L" ZFSJNI_PACKAGE_DATA "ImportablePool$State;)V");
-
- bean->method_setHealth = (*env)->GetMethodID(
- env, object->class, "setHealth", "(Ljava/lang/String;)V");
}
/* Create a VirtualDeviceBean */
@@ -160,17 +214,13 @@ new_VirtualDevice(JNIEnv *env, VirtualDeviceBean_t *bean)
(*env)->NewObject(env, object->class, object->constructor);
}
+ new_DeviceStats(env, &(bean->interface_DeviceStats), object);
+
bean->method_setPoolName = (*env)->GetMethodID(
env, object->class, "setPoolName", "(Ljava/lang/String;)V");
bean->method_setIndex = (*env)->GetMethodID(
env, object->class, "setIndex", "(J)V");
-
- bean->method_setSize = (*env)->GetMethodID(
- env, object->class, "setSize", "(J)V");
-
- bean->method_setUsed = (*env)->GetMethodID(
- env, object->class, "setUsed", "(J)V");
}
/* Create a DiskVirtualDeviceBean */
@@ -261,52 +311,41 @@ new_MirrorVirtualDeviceBean(JNIEnv *env, MirrorVirtualDeviceBean_t *bean)
new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
}
-static jobject
-uint64_to_state(JNIEnv *env, uint64_t pool_state)
-{
- jobject state_obj;
-
- jclass class_State = (*env)->FindClass(
- env, ZFSJNI_PACKAGE_DATA "ImportablePool$State");
-
- jmethodID method_valueOf = (*env)->GetStaticMethodID(
- env, class_State, "valueOf",
- "(Ljava/lang/String;)L"
- ZFSJNI_PACKAGE_DATA "ImportablePool$State;");
-
- char *str = zjni_get_state_str(pool_state);
- if (str != NULL) {
- jstring utf = (*env)->NewStringUTF(env, str);
-
- state_obj = (*env)->CallStaticObjectMethod(
- env, class_State, method_valueOf, utf);
- }
-
- return (state_obj);
-}
-
static int
populate_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean,
- char *name, uint64_t guid, uint64_t pool_state, char *health)
+ nvlist_t *config)
{
+ char *c;
+ char *name;
+ uint64_t guid;
+ uint64_t state;
+ nvlist_t *devices;
+
zjni_Object_t *object = (zjni_Object_t *)bean;
+ PoolStatsBean_t *pool_stats = &(bean->interface_PoolStats);
+ DeviceStatsBean_t *dev_stats = (DeviceStatsBean_t *)pool_stats;
+
+ if (nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &name) ||
+ nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) ||
+ nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, &state) ||
+ nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &devices) ||
+ populate_DeviceStatsBean(env, devices, dev_stats, object)) {
+ return (-1);
+ }
- /* Set name */
- (*env)->CallVoidMethod(env, object->object, bean->method_setName,
- (*env)->NewStringUTF(env, name));
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setName, (*env)->NewStringUTF(env, name));
- /* Set state */
- (*env)->CallVoidMethod(
- env, object->object, bean->method_setState,
- uint64_to_state(env, pool_state));
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setId, (jlong)guid);
- /* Set guid */
- (*env)->CallVoidMethod(
- env, object->object, bean->method_setId, (jlong)guid);
+ (*env)->CallVoidMethod(env, object->object,
+ pool_stats->method_setPoolState,
+ zjni_pool_state_to_obj(env, (pool_state_t)state));
- /* Set health */
- (*env)->CallVoidMethod(env, object->object, bean->method_setHealth,
- (*env)->NewStringUTF(env, health));
+ (*env)->CallVoidMethod(env, object->object,
+ pool_stats->method_setPoolStatus,
+ zjni_pool_status_to_obj(env, zpool_import_status(config, &c)));
return (0);
}
@@ -317,10 +356,18 @@ populate_VirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
{
int result;
uint64_t vdev_id;
+ jstring poolUTF;
+
zjni_Object_t *object = (zjni_Object_t *)bean;
+ DeviceStatsBean_t *stats = &(bean->interface_DeviceStats);
+
+ result = populate_DeviceStatsBean(env, vdev, stats, object);
+ if (result != 0) {
+ return (1);
+ }
/* Set pool name */
- jstring poolUTF = (*env)->NewStringUTF(env, zpool_get_name(zhp));
+ poolUTF = (*env)->NewStringUTF(env, zpool_get_name(zhp));
(*env)->CallVoidMethod(
env, object->object, bean->method_setPoolName, poolUTF);
@@ -330,28 +377,13 @@ populate_VirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
zjni_throw_exception(env,
"could not retrieve virtual device ID (pool %s)",
zpool_get_name(zhp));
- } else {
-
- uint64_t used;
- uint64_t total;
-
- (*env)->CallVoidMethod(
- env, object->object, bean->method_setIndex, (jlong)vdev_id);
-
- /* Set used space */
- used = zpool_get_space_used(zhp);
-
- (*env)->CallVoidMethod(
- env, object->object, bean->method_setUsed, (jlong)used);
-
- /* Set available space */
- total = zpool_get_space_total(zhp);
-
- (*env)->CallVoidMethod(
- env, object->object, bean->method_setSize, (jlong)total);
+ return (1);
}
- return (result != 0);
+ (*env)->CallVoidMethod(
+ env, object->object, bean->method_setIndex, (jlong)vdev_id);
+
+ return (0);
}
static int
@@ -429,8 +461,7 @@ populate_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
}
static jobject
-create_ImportablePoolBean(JNIEnv *env, char *name,
- uint64_t guid, uint64_t pool_state, char *health)
+create_ImportablePoolBean(JNIEnv *env, nvlist_t *config)
{
int result;
ImportablePoolBean_t bean_obj = {0};
@@ -439,8 +470,7 @@ create_ImportablePoolBean(JNIEnv *env, char *name,
/* Construct ImportablePoolBean */
new_ImportablePoolBean(env, bean);
- result = populate_ImportablePoolBean(
- env, bean, name, guid, pool_state, health);
+ result = populate_ImportablePoolBean(env, bean, config);
if (result) {
/* Must not call any more Java methods to preserve exception */
return (NULL);
@@ -527,10 +557,98 @@ create_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, nvlist_t *vdev)
return (((zjni_Object_t *)bean)->object);
}
+static char *
+find_field(const zjni_field_mapping_t *mapping, int value) {
+ int i;
+ for (i = 0; mapping[i].name != NULL; i++) {
+ if (value == mapping[i].value) {
+ return (mapping[i].name);
+ }
+ }
+ return (NULL);
+}
+
+/*
+ * Converts a vdev_state_t to a Java DeviceStats$DeviceState object.
+ */
+static jobject
+zjni_vdev_state_to_obj(JNIEnv *env, vdev_state_t state)
+{
+ return (zjni_int_to_enum(env, state,
+ ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState",
+ "VDEV_STATE_UNKNOWN", vdev_state_map));
+}
+
+/*
+ * Converts a vdev_aux_t to a Java DeviceStats$DeviceStatus object.
+ */
+static jobject
+zjni_vdev_aux_to_obj(JNIEnv *env, vdev_aux_t aux)
+{
+ return (zjni_int_to_enum(env, aux,
+ ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus",
+ "VDEV_AUX_NONE", vdev_aux_map));
+}
+
/*
* Package-private functions
*/
+/* Create a DeviceStatsBean */
+void
+new_DeviceStats(JNIEnv *env, DeviceStatsBean_t *bean, zjni_Object_t *object)
+{
+ bean->method_setSize = (*env)->GetMethodID(
+ env, object->class, "setSize", "(J)V");
+
+ bean->method_setUsed = (*env)->GetMethodID(
+ env, object->class, "setUsed", "(J)V");
+
+ bean->method_setReadBytes = (*env)->GetMethodID(
+ env, object->class, "setReadBytes", "(J)V");
+
+ bean->method_setWriteBytes = (*env)->GetMethodID(
+ env, object->class, "setWriteBytes", "(J)V");
+
+ bean->method_setReadOperations = (*env)->GetMethodID(
+ env, object->class, "setReadOperations", "(J)V");
+
+ bean->method_setWriteOperations = (*env)->GetMethodID(
+ env, object->class, "setWriteOperations", "(J)V");
+
+ bean->method_setReadErrors = (*env)->GetMethodID(
+ env, object->class, "setReadErrors", "(J)V");
+
+ bean->method_setWriteErrors = (*env)->GetMethodID(
+ env, object->class, "setWriteErrors", "(J)V");
+
+ bean->method_setChecksumErrors = (*env)->GetMethodID(
+ env, object->class, "setChecksumErrors", "(J)V");
+
+ bean->method_setDeviceState = (*env)->GetMethodID(
+ env, object->class, "setDeviceState",
+ "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState;)V");
+
+ bean->method_setDeviceStatus = (*env)->GetMethodID(
+ env, object->class, "setDeviceStatus",
+ "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus;)V");
+}
+
+/* Create a PoolStatsBean */
+void
+new_PoolStats(JNIEnv *env, PoolStatsBean_t *bean, zjni_Object_t *object)
+{
+ new_DeviceStats(env, (DeviceStatsBean_t *)bean, object);
+
+ bean->method_setPoolState = (*env)->GetMethodID(
+ env, object->class, "setPoolState",
+ "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolState;)V");
+
+ bean->method_setPoolStatus = (*env)->GetMethodID(
+ env, object->class, "setPoolStatus",
+ "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus;)V");
+}
+
/*
* Gets the root vdev (an nvlist_t *) for the given pool.
*/
@@ -706,15 +824,13 @@ zjni_get_VirtualDevices_from_vdev(JNIEnv *env, zpool_handle_t *zhp,
}
int
-zjni_create_add_ImportablePool(char *name,
- uint64_t guid, uint64_t pool_state, char *health, void *data) {
+zjni_create_add_ImportablePool(nvlist_t *config, void *data) {
JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
/* Construct ImportablePool object */
- jobject bean = create_ImportablePoolBean(
- env, name, guid, pool_state, health);
+ jobject bean = create_ImportablePoolBean(env, config);
if (bean == NULL) {
return (-1);
}
@@ -726,6 +842,81 @@ zjni_create_add_ImportablePool(char *name,
return (0);
}
+int
+populate_DeviceStatsBean(JNIEnv *env, nvlist_t *vdev,
+ DeviceStatsBean_t *bean, zjni_Object_t *object)
+{
+ uint_t c;
+ vdev_stat_t *vs;
+
+ int result = nvlist_lookup_uint64_array(
+ vdev, ZPOOL_CONFIG_STATS, (uint64_t **)&vs, &c);
+ if (result != 0) {
+ zjni_throw_exception(env,
+ "could not retrieve virtual device statistics");
+ return (1);
+ }
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setUsed, (jlong)vs->vs_alloc);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setSize, (jlong)vs->vs_space);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setReadBytes, (jlong)vs->vs_bytes[ZIO_TYPE_READ]);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setWriteBytes, (jlong)vs->vs_bytes[ZIO_TYPE_WRITE]);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setReadOperations, (jlong)vs->vs_ops[ZIO_TYPE_READ]);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setWriteOperations, (jlong)vs->vs_ops[ZIO_TYPE_WRITE]);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setReadErrors, (jlong)vs->vs_read_errors);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setWriteErrors, (jlong)vs->vs_write_errors);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setChecksumErrors, (jlong)vs->vs_checksum_errors);
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setDeviceState,
+ zjni_vdev_state_to_obj(env, vs->vs_state));
+
+ (*env)->CallVoidMethod(env, object->object,
+ bean->method_setDeviceStatus,
+ zjni_vdev_aux_to_obj(env, vs->vs_aux));
+
+ return (0);
+}
+
+/*
+ * Converts a pool_state_t to a Java PoolStats$PoolState object.
+ */
+jobject
+zjni_pool_state_to_obj(JNIEnv *env, pool_state_t state)
+{
+ return (zjni_int_to_enum(env, state,
+ ZFSJNI_PACKAGE_DATA "PoolStats$PoolState",
+ "POOL_STATE_ACTIVE", pool_state_map));
+}
+
+/*
+ * Converts a zpool_status_t to a Java PoolStats$PoolStatus object.
+ */
+jobject
+zjni_pool_status_to_obj(JNIEnv *env, zpool_status_t status)
+{
+ return (zjni_int_to_enum(env, status,
+ ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus",
+ "ZPOOL_STATUS_OK", zpool_status_map));
+}
+
/*
* Extern functions
*/
@@ -741,30 +932,13 @@ zjni_ipool_iter(int argc, char **argv, zjni_ipool_iter_f func, void *data)
nvlist_t *pools = zpool_find_import(argc, argv);
if (pools != NULL) {
-
nvpair_t *elem = NULL;
+
while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
nvlist_t *config;
- char *name;
- uint64_t guid;
- uint64_t pool_state;
- char *health;
if (nvpair_value_nvlist(elem, &config) != 0 ||
- nvlist_lookup_string(config,
- ZPOOL_CONFIG_POOL_NAME, &name) != 0 ||
- nvlist_lookup_uint64(config,
- ZPOOL_CONFIG_POOL_GUID, &guid) != 0 ||
- nvlist_lookup_uint64(config,
- ZPOOL_CONFIG_POOL_STATE, &pool_state) != 0 ||
- nvlist_lookup_string(config,
- ZPOOL_CONFIG_POOL_HEALTH, &health) != 0) {
-
- return (-1);
- }
-
- /* Run the given function */
- if (func(name, guid, pool_state, health, data)) {
+ func(config, data)) {
return (-1);
}
}
@@ -774,30 +948,21 @@ zjni_ipool_iter(int argc, char **argv, zjni_ipool_iter_f func, void *data)
}
char *
-zjni_get_state_str(uint64_t pool_state)
-{
- char *str = NULL;
- switch (pool_state) {
- case POOL_STATE_ACTIVE:
- str = "POOL_STATE_ACTIVE";
- break;
-
- case POOL_STATE_EXPORTED:
- str = "POOL_STATE_EXPORTED";
- break;
-
- case POOL_STATE_DESTROYED:
- str = "POOL_STATE_DESTROYED";
- break;
-
- case POOL_STATE_UNINITIALIZED:
- str = "POOL_STATE_UNINITIALIZED";
- break;
-
- case POOL_STATE_UNAVAIL:
- str = "POOL_STATE_UNAVAIL";
- break;
- }
+zjni_vdev_state_to_str(vdev_state_t state) {
+ return (find_field(vdev_state_map, state));
+}
+
+char *
+zjni_vdev_aux_to_str(vdev_aux_t aux) {
+ return (find_field(vdev_aux_map, aux));
+}
- return (str);
+char *
+zjni_pool_state_to_str(pool_state_t state) {
+ return (find_field(pool_state_map, state));
+}
+
+char *
+zjni_pool_status_to_str(zpool_status_t status) {
+ return (find_field(zpool_status_map, status));
}
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h b/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h
index ca9f06be4f..51c8fecc3c 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -37,19 +37,49 @@ extern "C" {
#include <libnvpair.h>
#include <libzfs.h>
#include <libzfs_jni_ipool.h>
+#include <libzfs_jni_util.h>
+
+/*
+ * Types
+ */
+
+typedef struct DeviceStatsBean {
+ jmethodID method_setSize;
+ jmethodID method_setUsed;
+ jmethodID method_setReadBytes;
+ jmethodID method_setWriteBytes;
+ jmethodID method_setReadOperations;
+ jmethodID method_setWriteOperations;
+ jmethodID method_setReadErrors;
+ jmethodID method_setWriteErrors;
+ jmethodID method_setChecksumErrors;
+ jmethodID method_setDeviceState;
+ jmethodID method_setDeviceStatus;
+} DeviceStatsBean_t;
+
+typedef struct PoolStatsBean {
+ DeviceStatsBean_t super;
+ jmethodID method_setPoolState;
+ jmethodID method_setPoolStatus;
+} PoolStatsBean_t;
/*
* Function prototypes
*/
+void new_DeviceStats(JNIEnv *, DeviceStatsBean_t *, zjni_Object_t *);
+void new_PoolStats(JNIEnv *, PoolStatsBean_t *, zjni_Object_t *);
nvlist_t *zjni_get_root_vdev(zpool_handle_t *);
nvlist_t *zjni_get_vdev(zpool_handle_t *, nvlist_t *, uint64_t);
jobject zjni_get_VirtualDevice_from_vdev(
JNIEnv *, zpool_handle_t *, nvlist_t *);
jobject zjni_get_VirtualDevices_from_vdev(
JNIEnv *, zpool_handle_t *, nvlist_t *);
-int zjni_create_add_ImportablePool(char *name,
- uint64_t guid, uint64_t pool_state, char *health, void *data);
+int zjni_create_add_ImportablePool(nvlist_t *, void *);
+int populate_DeviceStatsBean(
+ JNIEnv *, nvlist_t *, DeviceStatsBean_t *, zjni_Object_t *);
+jobject zjni_pool_state_to_obj(JNIEnv *, pool_state_t);
+jobject zjni_pool_status_to_obj(JNIEnv *, zpool_status_t);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c
index 6be4f79a9d..9d3c7f13f6 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -217,7 +217,7 @@ create_BasicProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
env, class, constructor, propName, propValue,
readOnly, propSource);
} else {
- jobject lineage = zjni_get_lineage(env, srctype);
+ jobject lineage = zjni_int_to_Lineage(env, srctype);
(void) snprintf(signature, sizeof (signature),
"(Ljava/lang/String;L%s;ZL"
@@ -305,7 +305,7 @@ create_ObjectProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
class, constructor, propValue, propSource);
} else {
- jobject lineage = zjni_get_lineage(env, srctype);
+ jobject lineage = zjni_int_to_Lineage(env, srctype);
(void) snprintf(signature, sizeof (signature),
"(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
@@ -354,7 +354,7 @@ create_default_BasicProperty(JNIEnv *env, zfs_prop_t prop,
jclass class = (*env)->FindClass(env, propClass);
jobject lineage =
- zjni_get_lineage(env, ZFS_SRC_DEFAULT);
+ zjni_int_to_Lineage(env, ZFS_SRC_DEFAULT);
(void) snprintf(signature, sizeof (signature),
"(Ljava/lang/String;L%s;ZL" ZFSJNI_PACKAGE_DATA
@@ -421,7 +421,7 @@ create_default_ObjectProperty(JNIEnv *env, zfs_prop_t prop,
jclass class = (*env)->FindClass(env, propClass);
jobject lineage =
- zjni_get_lineage(env, ZFS_SRC_DEFAULT);
+ zjni_int_to_Lineage(env, ZFS_SRC_DEFAULT);
(void) snprintf(signature, sizeof (signature),
"(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
@@ -549,42 +549,20 @@ zjni_get_property_from_name(const char *name)
}
jobject
-zjni_get_lineage(JNIEnv *env, zfs_source_t srctype)
+zjni_int_to_Lineage(JNIEnv *env, zfs_source_t srctype)
{
- char *field;
- jclass class_Lineage;
- jfieldID id;
-
- switch (srctype) {
- case ZFS_SRC_NONE:
- field = "ZFS_PROP_LINEAGE_NOTINHERITABLE";
- break;
-
- case ZFS_SRC_DEFAULT:
- field = "ZFS_PROP_LINEAGE_DEFAULT";
- break;
-
- case ZFS_SRC_LOCAL:
- field = "ZFS_PROP_LINEAGE_LOCAL";
- break;
-
- case ZFS_SRC_TEMPORARY:
- field = "ZFS_PROP_LINEAGE_TEMPORARY";
- break;
-
- default:
- case ZFS_SRC_INHERITED:
- field = "ZFS_PROP_LINEAGE_INHERITED";
- break;
- }
-
- class_Lineage = (*env)->FindClass(
- env, ZFSJNI_PACKAGE_DATA "Property$Lineage");
-
- id = (*env)->GetStaticFieldID(env, class_Lineage,
- field, "L" ZFSJNI_PACKAGE_DATA "Property$Lineage;");
-
- return (*env)->GetStaticObjectField(env, class_Lineage, id);
+ /* zfs_source_t to Property$Lineage map */
+ static zjni_field_mapping_t lineage_map[] = {
+ { ZFS_SRC_NONE, "ZFS_PROP_LINEAGE_NOTINHERITABLE" },
+ { ZFS_SRC_DEFAULT, "ZFS_PROP_LINEAGE_DEFAULT" },
+ { ZFS_SRC_LOCAL, "ZFS_PROP_LINEAGE_LOCAL" },
+ { ZFS_SRC_TEMPORARY, "ZFS_PROP_LINEAGE_TEMPORARY" },
+ { ZFS_SRC_INHERITED, "ZFS_PROP_LINEAGE_INHERITED" }
+ };
+
+ return (zjni_int_to_enum(env, srctype,
+ ZFSJNI_PACKAGE_DATA "Property$Lineage",
+ "ZFS_PROP_LINEAGE_INHERITED", lineage_map));
}
jobjectArray
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.h b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.h
index 8ab1c41b6a..cae14c4dfb 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.h
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -41,7 +41,7 @@ extern "C" {
#include <libzfs.h>
jobject zjni_get_default_property(JNIEnv *, zfs_prop_t);
-jobject zjni_get_lineage(JNIEnv *, zfs_source_t);
+jobject zjni_int_to_Lineage(JNIEnv *, zfs_source_t);
jobjectArray zjni_get_Dataset_properties(JNIEnv *, zfs_handle_t *);
zfs_prop_t zjni_get_property_from_name(const char *);
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_util.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_util.c
index 4f3b070b7c..d895fb8be4 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_util.c
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_util.c
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -178,6 +178,44 @@ zjni_int_to_boolean(JNIEnv *env, uint64_t value)
}
jobject
+zjni_int_to_enum(JNIEnv *env, int value, char *class_name,
+ char *default_field_name, zjni_field_mapping_t *mapping)
+{
+ int i;
+ char *field_name;
+ jclass class;
+ jfieldID id;
+ jobject field_value = NULL;
+ int found = 0;
+
+ for (i = 0; mapping[i].name != NULL; i++) {
+ if (value == mapping[i].value) {
+ field_name = mapping[i].name;
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ field_name = default_field_name;
+ }
+
+ if (field_name != NULL) {
+ char signature[1024];
+
+ (void) snprintf(signature, sizeof (signature), "L%s;",
+ class_name);
+
+ class = (*env)->FindClass(env, class_name);
+ id = (*env)->GetStaticFieldID(
+ env, class, field_name, signature);
+ field_value = (*env)->GetStaticObjectField(env, class, id);
+ }
+
+ return (field_value);
+}
+
+jobject
zjni_str_to_long(JNIEnv *env, char *str)
{
jobject value = NULL;
diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_util.h b/usr/src/lib/libzfs_jni/common/libzfs_jni_util.h
index 149384c3a5..3c2776d4fa 100644
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_util.h
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_util.h
@@ -20,7 +20,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -74,6 +74,11 @@ typedef struct zjni_ArrayCallbackData {
zjni_Collection_t *list;
} zjni_ArrayCallbackData_t;
+typedef struct zjni_field_mapping {
+ int value;
+ char *name;
+} zjni_field_mapping_t;
+
/* Signature for function to free data */
typedef void (*zjni_free_f)(void *);
@@ -89,6 +94,8 @@ jobjectArray zjni_Collection_to_array(JNIEnv *, zjni_Collection_t *, char *);
void zjni_new_ArrayList(JNIEnv *, zjni_ArrayList_t *);
void zjni_new_DatasetSet(JNIEnv *, zjni_DatasetSet_t *);
jobject zjni_int_to_boolean(JNIEnv *, uint64_t);
+jobject zjni_int_to_enum(
+ JNIEnv *, int, char *, char *, zjni_field_mapping_t *);
jobject zjni_str_to_long(JNIEnv *, char *);
jobject zjni_long_to_Long(JNIEnv *, uint64_t);
jobject zjni_str_to_date(JNIEnv *, char *);
diff --git a/usr/src/lib/libzfs_jni/spec/libzfs_jni.spec b/usr/src/lib/libzfs_jni/spec/libzfs_jni.spec
index ae95929401..5da10c71fb 100644
--- a/usr/src/lib/libzfs_jni/spec/libzfs_jni.spec
+++ b/usr/src/lib/libzfs_jni/spec/libzfs_jni.spec
@@ -1,5 +1,5 @@
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# CDDL HEADER START
@@ -23,7 +23,7 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
@@ -120,6 +120,18 @@ function zjni_ipool_iter
version SUNWprivate_1.1
end
-function zjni_get_state_str
+function zjni_vdev_state_to_str
+version SUNWprivate_1.1
+end
+
+function zjni_vdev_aux_to_str
+version SUNWprivate_1.1
+end
+
+function zjni_pool_state_to_str
+version SUNWprivate_1.1
+end
+
+function zjni_pool_status_to_str
version SUNWprivate_1.1
end