xref: /illumos-gate/usr/src/lib/libzfs_jni/common/libzfs_jni_pool.c (revision c8e9ed14d97e244b9753db14caf8481f181f5750)
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