1fa9e4066Sahrens /* 2fa9e4066Sahrens * CDDL HEADER START 3fa9e4066Sahrens * 4fa9e4066Sahrens * The contents of this file are subject to the terms of the 5fa9e4066Sahrens * Common Development and Distribution License, Version 1.0 only 6fa9e4066Sahrens * (the "License"). You may not use this file except in compliance 7fa9e4066Sahrens * with the License. 8fa9e4066Sahrens * 9fa9e4066Sahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10fa9e4066Sahrens * or http://www.opensolaris.org/os/licensing. 11fa9e4066Sahrens * See the License for the specific language governing permissions 12fa9e4066Sahrens * and limitations under the License. 13fa9e4066Sahrens * 14fa9e4066Sahrens * When distributing Covered Code, include this CDDL HEADER in each 15fa9e4066Sahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16fa9e4066Sahrens * If applicable, add the following below this CDDL HEADER, with the 17fa9e4066Sahrens * fields enclosed by brackets "[]" replaced with your own identifying 18fa9e4066Sahrens * information: Portions Copyright [yyyy] [name of copyright owner] 19fa9e4066Sahrens * 20fa9e4066Sahrens * CDDL HEADER END 21fa9e4066Sahrens */ 22fa9e4066Sahrens /* 23fa9e4066Sahrens * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24fa9e4066Sahrens * Use is subject to license terms. 25fa9e4066Sahrens */ 26fa9e4066Sahrens 27fa9e4066Sahrens #pragma ident "%Z%%M% %I% %E% SMI" 28fa9e4066Sahrens 29fa9e4066Sahrens #include "libzfs_jni_pool.h" 30fa9e4066Sahrens #include "libzfs_jni_util.h" 31fa9e4066Sahrens #include <strings.h> 32fa9e4066Sahrens 33fa9e4066Sahrens /* 34fa9e4066Sahrens * Types 35fa9e4066Sahrens */ 36fa9e4066Sahrens 37*c8e9ed14Stalley typedef struct ImportablePoolBean { 38*c8e9ed14Stalley zjni_Object_t super; 39*c8e9ed14Stalley 40*c8e9ed14Stalley jmethodID method_setName; 41*c8e9ed14Stalley jmethodID method_setId; 42*c8e9ed14Stalley jmethodID method_setState; 43*c8e9ed14Stalley jmethodID method_setHealth; 44*c8e9ed14Stalley } ImportablePoolBean_t; 45*c8e9ed14Stalley 46fa9e4066Sahrens typedef struct VirtualDeviceBean { 47fa9e4066Sahrens zjni_Object_t super; 48fa9e4066Sahrens 49fa9e4066Sahrens jmethodID method_setPoolName; 50fa9e4066Sahrens jmethodID method_setIndex; 51fa9e4066Sahrens jmethodID method_setSize; 52fa9e4066Sahrens jmethodID method_setUsed; 53fa9e4066Sahrens } VirtualDeviceBean_t; 54fa9e4066Sahrens 55fa9e4066Sahrens typedef struct DiskVirtualDeviceBean { 56fa9e4066Sahrens VirtualDeviceBean_t super; 57fa9e4066Sahrens 58fa9e4066Sahrens jmethodID method_setDiskName; 59fa9e4066Sahrens } DiskVirtualDeviceBean_t; 60fa9e4066Sahrens 61fa9e4066Sahrens typedef struct FileVirtualDeviceBean { 62fa9e4066Sahrens VirtualDeviceBean_t super; 63fa9e4066Sahrens 64fa9e4066Sahrens jmethodID method_setFileName; 65fa9e4066Sahrens } FileVirtualDeviceBean_t; 66fa9e4066Sahrens 67fa9e4066Sahrens typedef struct RAIDVirtualDeviceBean { 68fa9e4066Sahrens VirtualDeviceBean_t super; 69fa9e4066Sahrens } RAIDVirtualDeviceBean_t; 70fa9e4066Sahrens 71fa9e4066Sahrens typedef struct MirrorVirtualDeviceBean { 72fa9e4066Sahrens VirtualDeviceBean_t super; 73fa9e4066Sahrens } MirrorVirtualDeviceBean_t; 74fa9e4066Sahrens 75fa9e4066Sahrens /* 76fa9e4066Sahrens * Function prototypes 77fa9e4066Sahrens */ 78fa9e4066Sahrens 79*c8e9ed14Stalley static void new_ImportablePoolBean(JNIEnv *, ImportablePoolBean_t *); 80fa9e4066Sahrens static void new_VirtualDevice(JNIEnv *, VirtualDeviceBean_t *); 81fa9e4066Sahrens static void new_DiskVirtualDeviceBean(JNIEnv *, DiskVirtualDeviceBean_t *); 82fa9e4066Sahrens static void new_FileVirtualDeviceBean(JNIEnv *, FileVirtualDeviceBean_t *); 83fa9e4066Sahrens static void new_RAIDVirtualDeviceBean(JNIEnv *, RAIDVirtualDeviceBean_t *); 84fa9e4066Sahrens static void new_MirrorVirtualDeviceBean(JNIEnv *, MirrorVirtualDeviceBean_t *); 85*c8e9ed14Stalley static jobject uint64_to_state(JNIEnv *, uint64_t); 86*c8e9ed14Stalley static int populate_ImportablePoolBean( 87*c8e9ed14Stalley JNIEnv *, ImportablePoolBean_t *, char *, uint64_t, uint64_t, char *); 88fa9e4066Sahrens static int populate_VirtualDeviceBean( 89fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *, VirtualDeviceBean_t *); 90fa9e4066Sahrens static int populate_DiskVirtualDeviceBean( 91fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *, DiskVirtualDeviceBean_t *); 92fa9e4066Sahrens static int populate_FileVirtualDeviceBean( 93fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *, FileVirtualDeviceBean_t *); 94fa9e4066Sahrens static int populate_RAIDVirtualDeviceBean( 95fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *, RAIDVirtualDeviceBean_t *); 96fa9e4066Sahrens static int populate_MirrorVirtualDeviceBean( 97fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *, MirrorVirtualDeviceBean_t *); 98*c8e9ed14Stalley static jobject create_ImportablePoolBean( 99*c8e9ed14Stalley JNIEnv *, char *, uint64_t, uint64_t, char *); 100fa9e4066Sahrens static jobject create_DiskVirtualDeviceBean( 101fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *); 102fa9e4066Sahrens static jobject create_FileVirtualDeviceBean( 103fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *); 104fa9e4066Sahrens static jobject create_RAIDVirtualDeviceBean( 105fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *); 106fa9e4066Sahrens static jobject create_MirrorVirtualDeviceBean( 107fa9e4066Sahrens JNIEnv *, zpool_handle_t *, nvlist_t *); 108fa9e4066Sahrens 109fa9e4066Sahrens /* 110fa9e4066Sahrens * Static functions 111fa9e4066Sahrens */ 112fa9e4066Sahrens 113*c8e9ed14Stalley /* Create a ImportablePoolBean */ 114*c8e9ed14Stalley static void 115*c8e9ed14Stalley new_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean) 116*c8e9ed14Stalley { 117*c8e9ed14Stalley zjni_Object_t *object = (zjni_Object_t *)bean; 118*c8e9ed14Stalley 119*c8e9ed14Stalley if (object->object == NULL) { 120*c8e9ed14Stalley object->class = 121*c8e9ed14Stalley (*env)->FindClass(env, 122*c8e9ed14Stalley ZFSJNI_PACKAGE_DATA "ImportablePoolBean"); 123*c8e9ed14Stalley 124*c8e9ed14Stalley object->constructor = 125*c8e9ed14Stalley (*env)->GetMethodID(env, object->class, "<init>", "()V"); 126*c8e9ed14Stalley 127*c8e9ed14Stalley object->object = 128*c8e9ed14Stalley (*env)->NewObject(env, object->class, object->constructor); 129*c8e9ed14Stalley } 130*c8e9ed14Stalley 131*c8e9ed14Stalley bean->method_setName = (*env)->GetMethodID( 132*c8e9ed14Stalley env, object->class, "setName", "(Ljava/lang/String;)V"); 133*c8e9ed14Stalley 134*c8e9ed14Stalley bean->method_setId = (*env)->GetMethodID( 135*c8e9ed14Stalley env, object->class, "setId", "(J)V"); 136*c8e9ed14Stalley 137*c8e9ed14Stalley bean->method_setState = (*env)->GetMethodID( 138*c8e9ed14Stalley env, object->class, "setState", 139*c8e9ed14Stalley "(L" ZFSJNI_PACKAGE_DATA "ImportablePool$State;)V"); 140*c8e9ed14Stalley 141*c8e9ed14Stalley bean->method_setHealth = (*env)->GetMethodID( 142*c8e9ed14Stalley env, object->class, "setHealth", "(Ljava/lang/String;)V"); 143*c8e9ed14Stalley } 144*c8e9ed14Stalley 145fa9e4066Sahrens /* Create a VirtualDeviceBean */ 146fa9e4066Sahrens static void 147fa9e4066Sahrens new_VirtualDevice(JNIEnv *env, VirtualDeviceBean_t *bean) 148fa9e4066Sahrens { 149fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 150fa9e4066Sahrens 151fa9e4066Sahrens if (object->object == NULL) { 152fa9e4066Sahrens object->class = 153fa9e4066Sahrens (*env)->FindClass(env, 154fa9e4066Sahrens ZFSJNI_PACKAGE_DATA "VirtualDeviceBean"); 155fa9e4066Sahrens 156fa9e4066Sahrens object->constructor = 157fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V"); 158fa9e4066Sahrens 159fa9e4066Sahrens object->object = 160fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor); 161fa9e4066Sahrens } 162fa9e4066Sahrens 163fa9e4066Sahrens bean->method_setPoolName = (*env)->GetMethodID( 164fa9e4066Sahrens env, object->class, "setPoolName", "(Ljava/lang/String;)V"); 165fa9e4066Sahrens 166fa9e4066Sahrens bean->method_setIndex = (*env)->GetMethodID( 167fa9e4066Sahrens env, object->class, "setIndex", "(J)V"); 168fa9e4066Sahrens 169fa9e4066Sahrens bean->method_setSize = (*env)->GetMethodID( 170fa9e4066Sahrens env, object->class, "setSize", "(J)V"); 171fa9e4066Sahrens 172fa9e4066Sahrens bean->method_setUsed = (*env)->GetMethodID( 173fa9e4066Sahrens env, object->class, "setUsed", "(J)V"); 174fa9e4066Sahrens } 175fa9e4066Sahrens 176fa9e4066Sahrens /* Create a DiskVirtualDeviceBean */ 177fa9e4066Sahrens static void 178fa9e4066Sahrens new_DiskVirtualDeviceBean(JNIEnv *env, DiskVirtualDeviceBean_t *bean) 179fa9e4066Sahrens { 180fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 181fa9e4066Sahrens 182fa9e4066Sahrens if (object->object == NULL) { 183fa9e4066Sahrens object->class = (*env)->FindClass( 184fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "DiskVirtualDeviceBean"); 185fa9e4066Sahrens 186fa9e4066Sahrens object->constructor = 187fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V"); 188fa9e4066Sahrens 189fa9e4066Sahrens object->object = 190fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor); 191fa9e4066Sahrens } 192fa9e4066Sahrens 193fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean); 194fa9e4066Sahrens 195fa9e4066Sahrens bean->method_setDiskName = (*env)->GetMethodID( 196fa9e4066Sahrens env, object->class, "setDiskName", "(Ljava/lang/String;)V"); 197fa9e4066Sahrens 198fa9e4066Sahrens } 199fa9e4066Sahrens 200fa9e4066Sahrens /* Create a FileVirtualDeviceBean */ 201fa9e4066Sahrens static void 202fa9e4066Sahrens new_FileVirtualDeviceBean(JNIEnv *env, FileVirtualDeviceBean_t *bean) 203fa9e4066Sahrens { 204fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 205fa9e4066Sahrens 206fa9e4066Sahrens if (object->object == NULL) { 207fa9e4066Sahrens object->class = (*env)->FindClass( 208fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "FileVirtualDeviceBean"); 209fa9e4066Sahrens 210fa9e4066Sahrens object->constructor = 211fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V"); 212fa9e4066Sahrens 213fa9e4066Sahrens object->object = 214fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor); 215fa9e4066Sahrens } 216fa9e4066Sahrens 217fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean); 218fa9e4066Sahrens 219fa9e4066Sahrens bean->method_setFileName = (*env)->GetMethodID( 220fa9e4066Sahrens env, object->class, "setFileName", "(Ljava/lang/String;)V"); 221fa9e4066Sahrens } 222fa9e4066Sahrens 223fa9e4066Sahrens /* Create a RAIDVirtualDeviceBean */ 224fa9e4066Sahrens static void 225fa9e4066Sahrens new_RAIDVirtualDeviceBean(JNIEnv *env, RAIDVirtualDeviceBean_t *bean) 226fa9e4066Sahrens { 227fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 228fa9e4066Sahrens 229fa9e4066Sahrens if (object->object == NULL) { 230fa9e4066Sahrens 231fa9e4066Sahrens object->class = (*env)->FindClass( 232fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "RAIDVirtualDeviceBean"); 233fa9e4066Sahrens 234fa9e4066Sahrens object->constructor = 235fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V"); 236fa9e4066Sahrens 237fa9e4066Sahrens object->object = 238fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor); 239fa9e4066Sahrens } 240fa9e4066Sahrens 241fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean); 242fa9e4066Sahrens } 243fa9e4066Sahrens 244fa9e4066Sahrens /* Create a MirrorVirtualDeviceBean */ 245fa9e4066Sahrens static void 246fa9e4066Sahrens new_MirrorVirtualDeviceBean(JNIEnv *env, MirrorVirtualDeviceBean_t *bean) 247fa9e4066Sahrens { 248fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 249fa9e4066Sahrens 250fa9e4066Sahrens if (object->object == NULL) { 251fa9e4066Sahrens object->class = (*env)->FindClass( 252fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "MirrorVirtualDeviceBean"); 253fa9e4066Sahrens 254fa9e4066Sahrens object->constructor = 255fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V"); 256fa9e4066Sahrens 257fa9e4066Sahrens object->object = 258fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor); 259fa9e4066Sahrens } 260fa9e4066Sahrens 261fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean); 262fa9e4066Sahrens } 263fa9e4066Sahrens 264*c8e9ed14Stalley static jobject 265*c8e9ed14Stalley uint64_to_state(JNIEnv *env, uint64_t pool_state) 266*c8e9ed14Stalley { 267*c8e9ed14Stalley jobject state_obj; 268*c8e9ed14Stalley 269*c8e9ed14Stalley jclass class_State = (*env)->FindClass( 270*c8e9ed14Stalley env, ZFSJNI_PACKAGE_DATA "ImportablePool$State"); 271*c8e9ed14Stalley 272*c8e9ed14Stalley jmethodID method_valueOf = (*env)->GetStaticMethodID( 273*c8e9ed14Stalley env, class_State, "valueOf", 274*c8e9ed14Stalley "(Ljava/lang/String;)L" 275*c8e9ed14Stalley ZFSJNI_PACKAGE_DATA "ImportablePool$State;"); 276*c8e9ed14Stalley 277*c8e9ed14Stalley char *str = zjni_get_state_str(pool_state); 278*c8e9ed14Stalley if (str != NULL) { 279*c8e9ed14Stalley jstring utf = (*env)->NewStringUTF(env, str); 280*c8e9ed14Stalley 281*c8e9ed14Stalley state_obj = (*env)->CallStaticObjectMethod( 282*c8e9ed14Stalley env, class_State, method_valueOf, utf); 283*c8e9ed14Stalley } 284*c8e9ed14Stalley 285*c8e9ed14Stalley return (state_obj); 286*c8e9ed14Stalley } 287*c8e9ed14Stalley 288*c8e9ed14Stalley static int 289*c8e9ed14Stalley populate_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean, 290*c8e9ed14Stalley char *name, uint64_t guid, uint64_t pool_state, char *health) 291*c8e9ed14Stalley { 292*c8e9ed14Stalley zjni_Object_t *object = (zjni_Object_t *)bean; 293*c8e9ed14Stalley 294*c8e9ed14Stalley /* Set name */ 295*c8e9ed14Stalley (*env)->CallVoidMethod(env, object->object, bean->method_setName, 296*c8e9ed14Stalley (*env)->NewStringUTF(env, name)); 297*c8e9ed14Stalley 298*c8e9ed14Stalley /* Set state */ 299*c8e9ed14Stalley (*env)->CallVoidMethod( 300*c8e9ed14Stalley env, object->object, bean->method_setState, 301*c8e9ed14Stalley uint64_to_state(env, pool_state)); 302*c8e9ed14Stalley 303*c8e9ed14Stalley /* Set guid */ 304*c8e9ed14Stalley (*env)->CallVoidMethod( 305*c8e9ed14Stalley env, object->object, bean->method_setId, (jlong)guid); 306*c8e9ed14Stalley 307*c8e9ed14Stalley /* Set health */ 308*c8e9ed14Stalley (*env)->CallVoidMethod(env, object->object, bean->method_setHealth, 309*c8e9ed14Stalley (*env)->NewStringUTF(env, health)); 310*c8e9ed14Stalley 311*c8e9ed14Stalley return (0); 312*c8e9ed14Stalley } 313*c8e9ed14Stalley 314fa9e4066Sahrens static int 315fa9e4066Sahrens populate_VirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, 316fa9e4066Sahrens nvlist_t *vdev, VirtualDeviceBean_t *bean) 317fa9e4066Sahrens { 318fa9e4066Sahrens int result; 319fa9e4066Sahrens uint64_t vdev_id; 320fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean; 321fa9e4066Sahrens 322fa9e4066Sahrens /* Set pool name */ 323fa9e4066Sahrens jstring poolUTF = (*env)->NewStringUTF(env, zpool_get_name(zhp)); 324fa9e4066Sahrens (*env)->CallVoidMethod( 325fa9e4066Sahrens env, object->object, bean->method_setPoolName, poolUTF); 326fa9e4066Sahrens 327fa9e4066Sahrens /* Get index */ 328fa9e4066Sahrens result = nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &vdev_id); 329fa9e4066Sahrens if (result != 0) { 330fa9e4066Sahrens zjni_throw_exception(env, 331fa9e4066Sahrens "could not retrieve virtual device ID (pool %s)", 332fa9e4066Sahrens zpool_get_name(zhp)); 333fa9e4066Sahrens } else { 334fa9e4066Sahrens 335fa9e4066Sahrens uint64_t used; 336fa9e4066Sahrens uint64_t total; 337fa9e4066Sahrens 338fa9e4066Sahrens (*env)->CallVoidMethod( 339fa9e4066Sahrens env, object->object, bean->method_setIndex, (jlong)vdev_id); 340fa9e4066Sahrens 341fa9e4066Sahrens /* Set used space */ 342fa9e4066Sahrens used = zpool_get_space_used(zhp); 343fa9e4066Sahrens 344fa9e4066Sahrens (*env)->CallVoidMethod( 345fa9e4066Sahrens env, object->object, bean->method_setUsed, (jlong)used); 346fa9e4066Sahrens 347fa9e4066Sahrens /* Set available space */ 348fa9e4066Sahrens total = zpool_get_space_total(zhp); 349fa9e4066Sahrens 350fa9e4066Sahrens (*env)->CallVoidMethod( 351fa9e4066Sahrens env, object->object, bean->method_setSize, (jlong)total); 352fa9e4066Sahrens } 353fa9e4066Sahrens 354fa9e4066Sahrens return (result != 0); 355fa9e4066Sahrens } 356fa9e4066Sahrens 357fa9e4066Sahrens static int 358fa9e4066Sahrens populate_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, 359fa9e4066Sahrens nvlist_t *vdev, DiskVirtualDeviceBean_t *bean) 360fa9e4066Sahrens { 361fa9e4066Sahrens char *path; 362fa9e4066Sahrens int result = populate_VirtualDeviceBean( 363fa9e4066Sahrens env, zhp, vdev, (VirtualDeviceBean_t *)bean); 364fa9e4066Sahrens 365fa9e4066Sahrens if (result) { 366fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 367fa9e4066Sahrens return (-1); 368fa9e4066Sahrens } 369fa9e4066Sahrens 370fa9e4066Sahrens /* Set path */ 371fa9e4066Sahrens result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path); 372fa9e4066Sahrens if (result != 0) { 373fa9e4066Sahrens zjni_throw_exception(env, 374fa9e4066Sahrens "could not retrive path from disk virtual device (pool %s)", 375fa9e4066Sahrens zpool_get_name(zhp)); 376fa9e4066Sahrens } else { 377fa9e4066Sahrens 378fa9e4066Sahrens jstring pathUTF = (*env)->NewStringUTF(env, path); 379fa9e4066Sahrens (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object, 380fa9e4066Sahrens bean->method_setDiskName, pathUTF); 381fa9e4066Sahrens } 382fa9e4066Sahrens 383fa9e4066Sahrens return (result != 0); 384fa9e4066Sahrens } 385fa9e4066Sahrens 386fa9e4066Sahrens static int 387fa9e4066Sahrens populate_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, 388fa9e4066Sahrens nvlist_t *vdev, FileVirtualDeviceBean_t *bean) 389fa9e4066Sahrens { 390fa9e4066Sahrens char *path; 391fa9e4066Sahrens int result = populate_VirtualDeviceBean( 392fa9e4066Sahrens env, zhp, vdev, (VirtualDeviceBean_t *)bean); 393fa9e4066Sahrens 394fa9e4066Sahrens if (result) { 395fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 396fa9e4066Sahrens return (-1); 397fa9e4066Sahrens } 398fa9e4066Sahrens 399fa9e4066Sahrens /* Set path */ 400fa9e4066Sahrens result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path); 401fa9e4066Sahrens if (result != 0) { 402fa9e4066Sahrens zjni_throw_exception(env, 403fa9e4066Sahrens "could not retrive path from disk virtual device (pool %s)", 404fa9e4066Sahrens zpool_get_name(zhp)); 405fa9e4066Sahrens } else { 406fa9e4066Sahrens 407fa9e4066Sahrens jstring pathUTF = (*env)->NewStringUTF(env, path); 408fa9e4066Sahrens (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object, 409fa9e4066Sahrens bean->method_setFileName, pathUTF); 410fa9e4066Sahrens } 411fa9e4066Sahrens 412fa9e4066Sahrens return (result != 0); 413fa9e4066Sahrens } 414fa9e4066Sahrens 415fa9e4066Sahrens static int 416fa9e4066Sahrens populate_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, 417fa9e4066Sahrens nvlist_t *vdev, RAIDVirtualDeviceBean_t *bean) 418fa9e4066Sahrens { 419fa9e4066Sahrens return (populate_VirtualDeviceBean(env, zhp, vdev, 420fa9e4066Sahrens (VirtualDeviceBean_t *)bean)); 421fa9e4066Sahrens } 422fa9e4066Sahrens 423fa9e4066Sahrens static int 424fa9e4066Sahrens populate_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, 425fa9e4066Sahrens nvlist_t *vdev, MirrorVirtualDeviceBean_t *bean) 426fa9e4066Sahrens { 427fa9e4066Sahrens return (populate_VirtualDeviceBean(env, zhp, vdev, 428fa9e4066Sahrens (VirtualDeviceBean_t *)bean)); 429fa9e4066Sahrens } 430fa9e4066Sahrens 431*c8e9ed14Stalley static jobject 432*c8e9ed14Stalley create_ImportablePoolBean(JNIEnv *env, char *name, 433*c8e9ed14Stalley uint64_t guid, uint64_t pool_state, char *health) 434*c8e9ed14Stalley { 435*c8e9ed14Stalley int result; 436*c8e9ed14Stalley ImportablePoolBean_t bean_obj = {0}; 437*c8e9ed14Stalley ImportablePoolBean_t *bean = &bean_obj; 438*c8e9ed14Stalley 439*c8e9ed14Stalley /* Construct ImportablePoolBean */ 440*c8e9ed14Stalley new_ImportablePoolBean(env, bean); 441*c8e9ed14Stalley 442*c8e9ed14Stalley result = populate_ImportablePoolBean( 443*c8e9ed14Stalley env, bean, name, guid, pool_state, health); 444*c8e9ed14Stalley if (result) { 445*c8e9ed14Stalley /* Must not call any more Java methods to preserve exception */ 446*c8e9ed14Stalley return (NULL); 447*c8e9ed14Stalley } 448*c8e9ed14Stalley 449*c8e9ed14Stalley return (((zjni_Object_t *)bean)->object); 450*c8e9ed14Stalley } 451*c8e9ed14Stalley 452fa9e4066Sahrens static jobject 453fa9e4066Sahrens create_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, nvlist_t *vdev) 454fa9e4066Sahrens { 455fa9e4066Sahrens int result; 456fa9e4066Sahrens DiskVirtualDeviceBean_t bean_obj = {0}; 457fa9e4066Sahrens DiskVirtualDeviceBean_t *bean = &bean_obj; 458fa9e4066Sahrens 459fa9e4066Sahrens /* Construct DiskVirtualDeviceBean */ 460fa9e4066Sahrens new_DiskVirtualDeviceBean(env, bean); 461fa9e4066Sahrens 462fa9e4066Sahrens result = populate_DiskVirtualDeviceBean(env, zhp, vdev, bean); 463fa9e4066Sahrens if (result) { 464fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 465fa9e4066Sahrens return (NULL); 466fa9e4066Sahrens } 467fa9e4066Sahrens 468fa9e4066Sahrens return (((zjni_Object_t *)bean)->object); 469fa9e4066Sahrens } 470fa9e4066Sahrens 471fa9e4066Sahrens static jobject 472fa9e4066Sahrens create_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, nvlist_t *vdev) 473fa9e4066Sahrens { 474fa9e4066Sahrens int result; 475fa9e4066Sahrens FileVirtualDeviceBean_t bean_obj = {0}; 476fa9e4066Sahrens FileVirtualDeviceBean_t *bean = &bean_obj; 477fa9e4066Sahrens 478fa9e4066Sahrens /* Construct FileVirtualDeviceBean */ 479fa9e4066Sahrens new_FileVirtualDeviceBean(env, bean); 480fa9e4066Sahrens 481fa9e4066Sahrens result = populate_FileVirtualDeviceBean(env, zhp, vdev, bean); 482fa9e4066Sahrens if (result) { 483fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 484fa9e4066Sahrens return (NULL); 485fa9e4066Sahrens } 486fa9e4066Sahrens 487fa9e4066Sahrens return (((zjni_Object_t *)bean)->object); 488fa9e4066Sahrens } 489fa9e4066Sahrens 490fa9e4066Sahrens static jobject 491fa9e4066Sahrens create_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, nvlist_t *vdev) 492fa9e4066Sahrens { 493fa9e4066Sahrens int result; 494fa9e4066Sahrens RAIDVirtualDeviceBean_t bean_obj = {0}; 495fa9e4066Sahrens RAIDVirtualDeviceBean_t *bean = &bean_obj; 496fa9e4066Sahrens 497fa9e4066Sahrens ((zjni_Object_t *)bean)->object = NULL; 498fa9e4066Sahrens 499fa9e4066Sahrens /* Construct RAIDVirtualDeviceBean */ 500fa9e4066Sahrens new_RAIDVirtualDeviceBean(env, bean); 501fa9e4066Sahrens 502fa9e4066Sahrens result = populate_RAIDVirtualDeviceBean(env, zhp, vdev, bean); 503fa9e4066Sahrens if (result) { 504fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 505fa9e4066Sahrens return (NULL); 506fa9e4066Sahrens } 507fa9e4066Sahrens 508fa9e4066Sahrens return (((zjni_Object_t *)bean)->object); 509fa9e4066Sahrens } 510fa9e4066Sahrens 511fa9e4066Sahrens static jobject 512fa9e4066Sahrens create_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp, nvlist_t *vdev) 513fa9e4066Sahrens { 514fa9e4066Sahrens int result; 515fa9e4066Sahrens MirrorVirtualDeviceBean_t bean_obj = {0}; 516fa9e4066Sahrens MirrorVirtualDeviceBean_t *bean = &bean_obj; 517fa9e4066Sahrens 518fa9e4066Sahrens /* Construct MirrorVirtualDeviceBean */ 519fa9e4066Sahrens new_MirrorVirtualDeviceBean(env, bean); 520fa9e4066Sahrens 521fa9e4066Sahrens result = populate_MirrorVirtualDeviceBean(env, zhp, vdev, bean); 522fa9e4066Sahrens if (result) { 523fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */ 524fa9e4066Sahrens return (NULL); 525fa9e4066Sahrens } 526fa9e4066Sahrens 527fa9e4066Sahrens return (((zjni_Object_t *)bean)->object); 528fa9e4066Sahrens } 529fa9e4066Sahrens 530fa9e4066Sahrens /* 531fa9e4066Sahrens * Package-private functions 532fa9e4066Sahrens */ 533fa9e4066Sahrens 534fa9e4066Sahrens /* 535fa9e4066Sahrens * Gets the root vdev (an nvlist_t *) for the given pool. 536fa9e4066Sahrens */ 537fa9e4066Sahrens nvlist_t * 538fa9e4066Sahrens zjni_get_root_vdev(zpool_handle_t *zhp) 539fa9e4066Sahrens { 540fa9e4066Sahrens nvlist_t *root = NULL; 541fa9e4066Sahrens 542fa9e4066Sahrens if (zhp != NULL) { 543fa9e4066Sahrens nvlist_t *attrs = zpool_get_config(zhp); 544fa9e4066Sahrens 545fa9e4066Sahrens if (attrs != NULL) { 546fa9e4066Sahrens int result = nvlist_lookup_nvlist( 547fa9e4066Sahrens attrs, ZPOOL_CONFIG_VDEV_TREE, &root); 548fa9e4066Sahrens if (result != 0) { 549fa9e4066Sahrens root = NULL; 550fa9e4066Sahrens } 551fa9e4066Sahrens } 552fa9e4066Sahrens } 553fa9e4066Sahrens 554fa9e4066Sahrens return (root); 555fa9e4066Sahrens } 556fa9e4066Sahrens 557fa9e4066Sahrens /* 558fa9e4066Sahrens * Gets the vdev (an nvlist_t *) with the given vdev_id, below the 559fa9e4066Sahrens * given vdev. If the given vdev is NULL, all vdevs within the given 560fa9e4066Sahrens * pool are searched. 561fa9e4066Sahrens */ 562fa9e4066Sahrens nvlist_t * 563fa9e4066Sahrens zjni_get_vdev(zpool_handle_t *zhp, nvlist_t *vdev_parent, 564fa9e4066Sahrens uint64_t vdev_id_to_find) 565fa9e4066Sahrens { 566fa9e4066Sahrens int result; 567fa9e4066Sahrens 568fa9e4066Sahrens /* Was a vdev specified? */ 569fa9e4066Sahrens if (vdev_parent == NULL) { 570fa9e4066Sahrens /* No -- retrieve the top-level pool vdev */ 571fa9e4066Sahrens vdev_parent = zjni_get_root_vdev(zhp); 572fa9e4066Sahrens } else { 573fa9e4066Sahrens /* Get index of this vdev and compare with vdev_id_to_find */ 574fa9e4066Sahrens uint64_t id; 575fa9e4066Sahrens result = nvlist_lookup_uint64( 576fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_GUID, &id); 577fa9e4066Sahrens if (result == 0 && id == vdev_id_to_find) { 578fa9e4066Sahrens return (vdev_parent); 579fa9e4066Sahrens } 580fa9e4066Sahrens } 581fa9e4066Sahrens 582fa9e4066Sahrens if (vdev_parent != NULL) { 583fa9e4066Sahrens 584fa9e4066Sahrens nvlist_t **children; 585fa9e4066Sahrens uint_t nelem = 0; 586fa9e4066Sahrens 587fa9e4066Sahrens /* Get the vdevs under this vdev */ 588fa9e4066Sahrens result = nvlist_lookup_nvlist_array( 589fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem); 590fa9e4066Sahrens 591fa9e4066Sahrens if (result == 0) { 592fa9e4066Sahrens 593fa9e4066Sahrens int i; 594fa9e4066Sahrens nvlist_t *child; 595fa9e4066Sahrens 596fa9e4066Sahrens /* For each vdev child... */ 597fa9e4066Sahrens for (i = 0; i < nelem; i++) { 598fa9e4066Sahrens child = zjni_get_vdev(zhp, children[i], 599fa9e4066Sahrens vdev_id_to_find); 600fa9e4066Sahrens if (child != NULL) { 601fa9e4066Sahrens return (child); 602fa9e4066Sahrens } 603fa9e4066Sahrens } 604fa9e4066Sahrens } 605fa9e4066Sahrens } 606fa9e4066Sahrens 607fa9e4066Sahrens return (NULL); 608fa9e4066Sahrens } 609fa9e4066Sahrens 610fa9e4066Sahrens jobject 611fa9e4066Sahrens zjni_get_VirtualDevice_from_vdev(JNIEnv *env, zpool_handle_t *zhp, 612fa9e4066Sahrens nvlist_t *vdev) 613fa9e4066Sahrens { 614fa9e4066Sahrens jobject obj = NULL; 615fa9e4066Sahrens char *type = NULL; 616fa9e4066Sahrens int result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_TYPE, &type); 617fa9e4066Sahrens 618fa9e4066Sahrens if (result == 0) { 619fa9e4066Sahrens if (strcmp(type, VDEV_TYPE_DISK) == 0) { 620fa9e4066Sahrens obj = create_DiskVirtualDeviceBean(env, zhp, vdev); 621fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_FILE) == 0) { 622*c8e9ed14Stalley obj = create_FileVirtualDeviceBean(env, zhp, vdev); 623fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) { 624*c8e9ed14Stalley obj = create_RAIDVirtualDeviceBean(env, zhp, vdev); 625fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_MIRROR) == 0) { 626fa9e4066Sahrens obj = create_MirrorVirtualDeviceBean(env, zhp, vdev); 627*c8e9ed14Stalley } else if (strcmp(type, VDEV_TYPE_REPLACING) == 0) { 628*c8e9ed14Stalley 629*c8e9ed14Stalley /* Get the vdevs under this vdev */ 630*c8e9ed14Stalley nvlist_t **children; 631*c8e9ed14Stalley uint_t nelem = 0; 632*c8e9ed14Stalley int result = nvlist_lookup_nvlist_array( 633*c8e9ed14Stalley vdev, ZPOOL_CONFIG_CHILDREN, &children, &nelem); 634*c8e9ed14Stalley 635*c8e9ed14Stalley if (result == 0 && nelem > 0) { 636*c8e9ed14Stalley 637*c8e9ed14Stalley /* Get last vdev child (replacement device) */ 638*c8e9ed14Stalley nvlist_t *child = children[nelem - 1]; 639*c8e9ed14Stalley 640*c8e9ed14Stalley obj = zjni_get_VirtualDevice_from_vdev(env, 641*c8e9ed14Stalley zhp, child); 642*c8e9ed14Stalley } 643fa9e4066Sahrens } 644fa9e4066Sahrens } 645fa9e4066Sahrens 646fa9e4066Sahrens return (obj); 647fa9e4066Sahrens } 648fa9e4066Sahrens 649fa9e4066Sahrens jobject 650fa9e4066Sahrens zjni_get_VirtualDevices_from_vdev(JNIEnv *env, zpool_handle_t *zhp, 651fa9e4066Sahrens nvlist_t *vdev_parent) 652fa9e4066Sahrens { 653fa9e4066Sahrens /* Create an array list for the vdevs */ 654fa9e4066Sahrens zjni_ArrayList_t list_class = {0}; 655fa9e4066Sahrens zjni_ArrayList_t *list_class_p = &list_class; 656fa9e4066Sahrens zjni_new_ArrayList(env, list_class_p); 657fa9e4066Sahrens 658fa9e4066Sahrens /* Was a vdev specified? */ 659fa9e4066Sahrens if (vdev_parent == NULL) { 660fa9e4066Sahrens /* No -- retrieve the top-level pool vdev */ 661fa9e4066Sahrens vdev_parent = zjni_get_root_vdev(zhp); 662fa9e4066Sahrens } 663fa9e4066Sahrens 664fa9e4066Sahrens if (vdev_parent != NULL) { 665fa9e4066Sahrens 666fa9e4066Sahrens /* Get the vdevs under this vdev */ 667fa9e4066Sahrens nvlist_t **children; 668fa9e4066Sahrens uint_t nelem = 0; 669fa9e4066Sahrens int result = nvlist_lookup_nvlist_array( 670fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem); 671fa9e4066Sahrens 672fa9e4066Sahrens if (result == 0) { 673fa9e4066Sahrens 674fa9e4066Sahrens /* For each vdev child... */ 675fa9e4066Sahrens int i; 676fa9e4066Sahrens for (i = 0; i < nelem; i++) { 677fa9e4066Sahrens nvlist_t *child = children[i]; 678fa9e4066Sahrens 679fa9e4066Sahrens /* Create a Java object from this vdev */ 680fa9e4066Sahrens jobject obj = 681fa9e4066Sahrens zjni_get_VirtualDevice_from_vdev(env, 682fa9e4066Sahrens zhp, child); 683fa9e4066Sahrens 684*c8e9ed14Stalley if ((*env)->ExceptionOccurred(env) != NULL) { 685fa9e4066Sahrens /* 686fa9e4066Sahrens * Must not call any more Java methods 687fa9e4066Sahrens * to preserve exception 688fa9e4066Sahrens */ 689fa9e4066Sahrens return (NULL); 690fa9e4066Sahrens } 691fa9e4066Sahrens 692*c8e9ed14Stalley if (obj != NULL) { 693*c8e9ed14Stalley /* Add child to child vdev list */ 694*c8e9ed14Stalley (*env)->CallBooleanMethod(env, 695*c8e9ed14Stalley ((zjni_Object_t *)list_class_p)->object, 696*c8e9ed14Stalley ((zjni_Collection_t *)list_class_p)-> 697*c8e9ed14Stalley method_add, obj); 698*c8e9ed14Stalley } 699fa9e4066Sahrens } 700fa9e4066Sahrens } 701fa9e4066Sahrens } 702fa9e4066Sahrens 703fa9e4066Sahrens return (zjni_Collection_to_array( 704fa9e4066Sahrens env, (zjni_Collection_t *)list_class_p, 705fa9e4066Sahrens ZFSJNI_PACKAGE_DATA "VirtualDevice")); 706fa9e4066Sahrens } 707*c8e9ed14Stalley 708*c8e9ed14Stalley int 709*c8e9ed14Stalley zjni_create_add_ImportablePool(char *name, 710*c8e9ed14Stalley uint64_t guid, uint64_t pool_state, char *health, void *data) { 711*c8e9ed14Stalley 712*c8e9ed14Stalley JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env; 713*c8e9ed14Stalley zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list; 714*c8e9ed14Stalley 715*c8e9ed14Stalley /* Construct ImportablePool object */ 716*c8e9ed14Stalley jobject bean = create_ImportablePoolBean( 717*c8e9ed14Stalley env, name, guid, pool_state, health); 718*c8e9ed14Stalley if (bean == NULL) { 719*c8e9ed14Stalley return (-1); 720*c8e9ed14Stalley } 721*c8e9ed14Stalley 722*c8e9ed14Stalley /* Add bean to list */ 723*c8e9ed14Stalley (*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object, 724*c8e9ed14Stalley ((zjni_Collection_t *)list)->method_add, bean); 725*c8e9ed14Stalley 726*c8e9ed14Stalley return (0); 727*c8e9ed14Stalley } 728*c8e9ed14Stalley 729*c8e9ed14Stalley /* 730*c8e9ed14Stalley * Extern functions 731*c8e9ed14Stalley */ 732*c8e9ed14Stalley 733*c8e9ed14Stalley /* 734*c8e9ed14Stalley * Iterates through each importable pool on the system. For each 735*c8e9ed14Stalley * importable pool, runs the given function with the given void as the 736*c8e9ed14Stalley * last arg. 737*c8e9ed14Stalley */ 738*c8e9ed14Stalley int 739*c8e9ed14Stalley zjni_ipool_iter(int argc, char **argv, zjni_ipool_iter_f func, void *data) 740*c8e9ed14Stalley { 741*c8e9ed14Stalley nvlist_t *pools = zpool_find_import(argc, argv); 742*c8e9ed14Stalley 743*c8e9ed14Stalley if (pools != NULL) { 744*c8e9ed14Stalley 745*c8e9ed14Stalley nvpair_t *elem = NULL; 746*c8e9ed14Stalley while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) { 747*c8e9ed14Stalley nvlist_t *config; 748*c8e9ed14Stalley char *name; 749*c8e9ed14Stalley uint64_t guid; 750*c8e9ed14Stalley uint64_t pool_state; 751*c8e9ed14Stalley char *health; 752*c8e9ed14Stalley 753*c8e9ed14Stalley if (nvpair_value_nvlist(elem, &config) != 0 || 754*c8e9ed14Stalley nvlist_lookup_string(config, 755*c8e9ed14Stalley ZPOOL_CONFIG_POOL_NAME, &name) != 0 || 756*c8e9ed14Stalley nvlist_lookup_uint64(config, 757*c8e9ed14Stalley ZPOOL_CONFIG_POOL_GUID, &guid) != 0 || 758*c8e9ed14Stalley nvlist_lookup_uint64(config, 759*c8e9ed14Stalley ZPOOL_CONFIG_POOL_STATE, &pool_state) != 0 || 760*c8e9ed14Stalley nvlist_lookup_string(config, 761*c8e9ed14Stalley ZPOOL_CONFIG_POOL_HEALTH, &health) != 0) { 762*c8e9ed14Stalley 763*c8e9ed14Stalley return (-1); 764*c8e9ed14Stalley } 765*c8e9ed14Stalley 766*c8e9ed14Stalley /* Run the given function */ 767*c8e9ed14Stalley if (func(name, guid, pool_state, health, data)) { 768*c8e9ed14Stalley return (-1); 769*c8e9ed14Stalley } 770*c8e9ed14Stalley } 771*c8e9ed14Stalley } 772*c8e9ed14Stalley 773*c8e9ed14Stalley return (0); 774*c8e9ed14Stalley } 775*c8e9ed14Stalley 776*c8e9ed14Stalley char * 777*c8e9ed14Stalley zjni_get_state_str(uint64_t pool_state) 778*c8e9ed14Stalley { 779*c8e9ed14Stalley char *str = NULL; 780*c8e9ed14Stalley switch (pool_state) { 781*c8e9ed14Stalley case POOL_STATE_ACTIVE: 782*c8e9ed14Stalley str = "POOL_STATE_ACTIVE"; 783*c8e9ed14Stalley break; 784*c8e9ed14Stalley 785*c8e9ed14Stalley case POOL_STATE_EXPORTED: 786*c8e9ed14Stalley str = "POOL_STATE_EXPORTED"; 787*c8e9ed14Stalley break; 788*c8e9ed14Stalley 789*c8e9ed14Stalley case POOL_STATE_DESTROYED: 790*c8e9ed14Stalley str = "POOL_STATE_DESTROYED"; 791*c8e9ed14Stalley break; 792*c8e9ed14Stalley 793*c8e9ed14Stalley case POOL_STATE_UNINITIALIZED: 794*c8e9ed14Stalley str = "POOL_STATE_UNINITIALIZED"; 795*c8e9ed14Stalley break; 796*c8e9ed14Stalley 797*c8e9ed14Stalley case POOL_STATE_UNAVAIL: 798*c8e9ed14Stalley str = "POOL_STATE_UNAVAIL"; 799*c8e9ed14Stalley break; 800*c8e9ed14Stalley } 801*c8e9ed14Stalley 802*c8e9ed14Stalley return (str); 803*c8e9ed14Stalley } 804