diff options
| author | talley <none@none> | 2006-01-03 20:07:12 -0800 |
|---|---|---|
| committer | talley <none@none> | 2006-01-03 20:07:12 -0800 |
| commit | fbfd10ff571cfd0139aa5127460f1b8a53dac971 (patch) | |
| tree | 5d165ea048e4ceeb13cbbd9a1898fd3e2f81e76e | |
| parent | adccf2f268a15d5b03cd4d65d7ad9d2392ded017 (diff) | |
| download | illumos-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/Makefile | 4 | ||||
| -rw-r--r-- | usr/src/cmd/availdevs/availdevs.c | 76 | ||||
| -rw-r--r-- | usr/src/cmd/availdevs/availdevs.h | 19 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_dataset.c | 106 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_ipool.h | 10 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_main.c | 5 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c | 433 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_pool.h | 36 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_property.c | 58 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_property.h | 4 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_util.c | 40 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_util.h | 9 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_jni/spec/libzfs_jni.spec | 18 |
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 |
