fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Common Development and Distribution License, Version 1.0 only
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (the "License"). You may not use this file except in compliance
fa9e4066f08beec538e775443c5be79dd423fcabahrens * with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_jni_disk.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Function prototypes
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_DiskDeviceBean(JNIEnv *, dmgt_disk_t *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject get_SliceUsage_Use(JNIEnv *, char *);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp);
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobjectArray create_SliceDeviceBean_array(JNIEnv *, dmgt_slice_t **);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Static functions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenscreate_DiskDeviceBean(JNIEnv *env, dmgt_disk_t *dp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject disk = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens int naliases = zjni_count_elements((void **)dp->aliases);
c8e9ed14d97e244b9753db14caf8481f181f5750talley jobjectArray aliases = zjni_c_string_array_to_java(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, dp->aliases, naliases);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (aliases != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobjectArray slices = create_SliceDeviceBean_array(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dp->slices);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (slices != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring nameUTF = (*env)->NewStringUTF(env, dp->name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dc307942eac821bc70a7a69cbb1ddec4184607c1talley jboolean in_use = dp->in_use ? JNI_TRUE : JNI_FALSE;
dc307942eac821bc70a7a69cbb1ddec4184607c1talley
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_DiskDeviceBean = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ZFSJNI_PACKAGE_DATA "DiskDeviceBean");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID constructor =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, class_DiskDeviceBean,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "<init>",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(JLjava/lang/String;[Ljava/lang/String;[L"
dc307942eac821bc70a7a69cbb1ddec4184607c1talley ZFSJNI_PACKAGE_DATA "SliceDeviceBean;Z)V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens disk = (*env)->NewObject(env, class_DiskDeviceBean,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley constructor, dp->size, nameUTF, aliases, slices,
dc307942eac821bc70a7a69cbb1ddec4184607c1talley in_use);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (disk);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrensget_SliceUsage_Use(JNIEnv *env, char *dm_usage)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject enumVal = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dm_usage != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_SliceUsage_Use = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ZFSJNI_PACKAGE_DATA "SliceUsage$Use");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jfieldID id = (*env)->GetStaticFieldID(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens class_SliceUsage_Use,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm_usage, "L" ZFSJNI_PACKAGE_DATA "SliceUsage$Use;");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (id != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Retrieve the proper SliceUsage$Use enum value */
fa9e4066f08beec538e775443c5be79dd423fcabahrens enumVal = (*env)->GetStaticObjectField(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, class_SliceUsage_Use, id);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) fprintf(stderr, "Unknown slice usage: %s\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens dm_usage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* DEBUG */
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (enumVal);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenscreate_SliceUsage(JNIEnv *env, dmgt_slice_t *sp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject usage = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sp->used_name != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject use = get_SliceUsage_Use(env, sp->used_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (use != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring usedByUTF =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->NewStringUTF(env, sp->used_by);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_SliceUsage = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ZFSJNI_PACKAGE_DATA "SliceUsage");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID constructor =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, class_SliceUsage, "<init>",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(L" ZFSJNI_PACKAGE_DATA
fa9e4066f08beec538e775443c5be79dd423fcabahrens "SliceUsage$Use;Ljava/lang/String;)V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens usage = (*env)->NewObject(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens class_SliceUsage, constructor, use, usedByUTF);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (usage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobject
fa9e4066f08beec538e775443c5be79dd423fcabahrenscreate_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject slice = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* May be NULL if unused */
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject usage = create_SliceUsage(env, sp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jstring nameUTF = (*env)->NewStringUTF(env, sp->name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jclass class_SliceDeviceBean = (*env)->FindClass(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, ZFSJNI_PACKAGE_DATA "SliceDeviceBean");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens jmethodID constructor =
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->GetMethodID(env, class_SliceDeviceBean, "<init>",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(JLjava/lang/String;JL" ZFSJNI_PACKAGE_DATA "SliceUsage;)V");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens slice = (*env)->NewObject(env, class_SliceDeviceBean,
fa9e4066f08beec538e775443c5be79dd423fcabahrens constructor, sp->size, nameUTF, sp->start, usage);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (slice);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic jobjectArray
fa9e4066f08beec538e775443c5be79dd423fcabahrenscreate_SliceDeviceBean_array(JNIEnv *env, dmgt_slice_t **slices)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Create an array list */
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_ArrayList_t list_class = {0};
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_ArrayList_t *list_class_p = &list_class;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_new_ArrayList(env, list_class_p);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (slices != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; slices[i] != NULL; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dmgt_slice_t *slice = slices[i];
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject obj;
fa9e4066f08beec538e775443c5be79dd423fcabahrens obj = create_SliceDeviceBean(env, slice);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (obj != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->CallBooleanMethod(env,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Object_t *)list_class_p)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)list_class_p)->
fa9e4066f08beec538e775443c5be79dd423fcabahrens method_add, obj);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zjni_Collection_to_array(
fa9e4066f08beec538e775443c5be79dd423fcabahrens env, (zjni_Collection_t *)list_class_p,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ZFSJNI_PACKAGE_DATA "SliceDeviceBean"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Package-private functions
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
fa9e4066f08beec538e775443c5be79dd423fcabahrenszjni_create_add_DiskDevice(dmgt_disk_t *dp, void *data)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
fa9e4066f08beec538e775443c5be79dd423fcabahrens zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens jobject disk = create_DiskDeviceBean(env, dp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* Add disk to zjni_ArrayList */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((zjni_Collection_t *)list)->method_add, disk);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}