1fa9e4066Sahrens /*
2fa9e4066Sahrens * CDDL HEADER START
3fa9e4066Sahrens *
4fa9e4066Sahrens * The contents of this file are subject to the terms of the
5bfe5f5a4Stalley * Common Development and Distribution License (the "License").
6bfe5f5a4Stalley * You may not use this file except in compliance with the License.
7fa9e4066Sahrens *
8fa9e4066Sahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fa9e4066Sahrens * or http://www.opensolaris.org/os/licensing.
10fa9e4066Sahrens * See the License for the specific language governing permissions
11fa9e4066Sahrens * and limitations under the License.
12fa9e4066Sahrens *
13fa9e4066Sahrens * When distributing Covered Code, include this CDDL HEADER in each
14fa9e4066Sahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fa9e4066Sahrens * If applicable, add the following below this CDDL HEADER, with the
16fa9e4066Sahrens * fields enclosed by brackets "[]" replaced with your own identifying
17fa9e4066Sahrens * information: Portions Copyright [yyyy] [name of copyright owner]
18fa9e4066Sahrens *
19fa9e4066Sahrens * CDDL HEADER END
20fa9e4066Sahrens */
21bfe5f5a4Stalley
22fa9e4066Sahrens /*
233f9d6ad7SLin Ling * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24*d8ab6e12SDon Brady * Copyright 2020 Joyent, Inc.
25fa9e4066Sahrens */
26fa9e4066Sahrens
2799653d4eSeschrock #include "libzfs_jni_util.h"
28fa9e4066Sahrens #include "libzfs_jni_pool.h"
29*d8ab6e12SDon Brady #include <libzutil.h>
30fa9e4066Sahrens #include <strings.h>
31fa9e4066Sahrens
32fa9e4066Sahrens /*
33fa9e4066Sahrens * Types
34fa9e4066Sahrens */
35fa9e4066Sahrens
36c8e9ed14Stalley typedef struct ImportablePoolBean {
37c8e9ed14Stalley zjni_Object_t super;
38fbfd10ffStalley PoolStatsBean_t interface_PoolStats;
39c8e9ed14Stalley
40c8e9ed14Stalley jmethodID method_setName;
41c8e9ed14Stalley jmethodID method_setId;
42c8e9ed14Stalley } ImportablePoolBean_t;
43c8e9ed14Stalley
44fa9e4066Sahrens typedef struct VirtualDeviceBean {
45fa9e4066Sahrens zjni_Object_t super;
46fbfd10ffStalley DeviceStatsBean_t interface_DeviceStats;
47fa9e4066Sahrens
48fa9e4066Sahrens jmethodID method_setPoolName;
49bfe5f5a4Stalley jmethodID method_setParentIndex;
50fa9e4066Sahrens jmethodID method_setIndex;
51fa9e4066Sahrens } VirtualDeviceBean_t;
52fa9e4066Sahrens
53a1a659aeStalley typedef struct LeafVirtualDeviceBean {
54fa9e4066Sahrens VirtualDeviceBean_t super;
55fa9e4066Sahrens
56a1a659aeStalley jmethodID method_setName;
57a1a659aeStalley } LeafVirtualDeviceBean_t;
58a1a659aeStalley
59a1a659aeStalley typedef struct DiskVirtualDeviceBean {
60a1a659aeStalley LeafVirtualDeviceBean_t super;
61fa9e4066Sahrens } DiskVirtualDeviceBean_t;
62fa9e4066Sahrens
63a1a659aeStalley typedef struct SliceVirtualDeviceBean {
64a1a659aeStalley LeafVirtualDeviceBean_t super;
65a1a659aeStalley } SliceVirtualDeviceBean_t;
66fa9e4066Sahrens
67a1a659aeStalley typedef struct FileVirtualDeviceBean {
68a1a659aeStalley LeafVirtualDeviceBean_t super;
69fa9e4066Sahrens } FileVirtualDeviceBean_t;
70fa9e4066Sahrens
71fa9e4066Sahrens typedef struct RAIDVirtualDeviceBean {
72fa9e4066Sahrens VirtualDeviceBean_t super;
731e995cfcSrl
741e995cfcSrl jmethodID method_setParity;
75fa9e4066Sahrens } RAIDVirtualDeviceBean_t;
76fa9e4066Sahrens
77fa9e4066Sahrens typedef struct MirrorVirtualDeviceBean {
78fa9e4066Sahrens VirtualDeviceBean_t super;
79fa9e4066Sahrens } MirrorVirtualDeviceBean_t;
80fa9e4066Sahrens
81fbfd10ffStalley /*
82fbfd10ffStalley * Data
83fbfd10ffStalley */
84fbfd10ffStalley
85fbfd10ffStalley /* vdev_state_t to DeviceStats$DeviceState map */
86fbfd10ffStalley static zjni_field_mapping_t vdev_state_map[] = {
87fbfd10ffStalley { VDEV_STATE_CANT_OPEN, "VDEV_STATE_CANT_OPEN" },
88fbfd10ffStalley { VDEV_STATE_CLOSED, "VDEV_STATE_CLOSED" },
89fbfd10ffStalley { VDEV_STATE_DEGRADED, "VDEV_STATE_DEGRADED" },
90fbfd10ffStalley { VDEV_STATE_HEALTHY, "VDEV_STATE_HEALTHY" },
91fbfd10ffStalley { VDEV_STATE_OFFLINE, "VDEV_STATE_OFFLINE" },
92fbfd10ffStalley { VDEV_STATE_UNKNOWN, "VDEV_STATE_UNKNOWN" },
93fbfd10ffStalley { -1, NULL },
94fbfd10ffStalley };
95fbfd10ffStalley
96fbfd10ffStalley /* vdev_aux_t to DeviceStats$DeviceStatus map */
97fbfd10ffStalley static zjni_field_mapping_t vdev_aux_map[] = {
98fbfd10ffStalley { VDEV_AUX_NONE, "VDEV_AUX_NONE" },
99fbfd10ffStalley { VDEV_AUX_OPEN_FAILED, "VDEV_AUX_OPEN_FAILED" },
100fbfd10ffStalley { VDEV_AUX_CORRUPT_DATA, "VDEV_AUX_CORRUPT_DATA" },
101fbfd10ffStalley { VDEV_AUX_NO_REPLICAS, "VDEV_AUX_NO_REPLICAS" },
102fbfd10ffStalley { VDEV_AUX_BAD_GUID_SUM, "VDEV_AUX_BAD_GUID_SUM" },
103fbfd10ffStalley { VDEV_AUX_TOO_SMALL, "VDEV_AUX_TOO_SMALL" },
104fbfd10ffStalley { VDEV_AUX_BAD_LABEL, "VDEV_AUX_BAD_LABEL" },
105fbfd10ffStalley { -1, NULL },
106fbfd10ffStalley };
107fbfd10ffStalley
108fbfd10ffStalley /* zpool_state_t to PoolStats$PoolState map */
109fbfd10ffStalley static zjni_field_mapping_t pool_state_map[] = {
110fbfd10ffStalley { POOL_STATE_ACTIVE, "POOL_STATE_ACTIVE" },
111fbfd10ffStalley { POOL_STATE_EXPORTED, "POOL_STATE_EXPORTED" },
112fbfd10ffStalley { POOL_STATE_DESTROYED, "POOL_STATE_DESTROYED" },
113a55b6846Scristian { POOL_STATE_SPARE, "POOL_STATE_SPARE" },
114fbfd10ffStalley { POOL_STATE_UNINITIALIZED, "POOL_STATE_UNINITIALIZED" },
115fbfd10ffStalley { POOL_STATE_UNAVAIL, "POOL_STATE_UNAVAIL" },
116a55b6846Scristian { POOL_STATE_POTENTIALLY_ACTIVE, "POOL_STATE_POTENTIALLY_ACTIVE" },
117fbfd10ffStalley { -1, NULL },
118fbfd10ffStalley };
119fbfd10ffStalley
120fbfd10ffStalley /* zpool_status_t to PoolStats$PoolStatus map */
121fbfd10ffStalley static zjni_field_mapping_t zpool_status_map[] = {
122a55b6846Scristian { ZPOOL_STATUS_CORRUPT_CACHE, "ZPOOL_STATUS_CORRUPT_CACHE" },
123a55b6846Scristian { ZPOOL_STATUS_MISSING_DEV_R, "ZPOOL_STATUS_MISSING_DEV_R" },
124a55b6846Scristian { ZPOOL_STATUS_MISSING_DEV_NR, "ZPOOL_STATUS_MISSING_DEV_NR" },
125a55b6846Scristian { ZPOOL_STATUS_CORRUPT_LABEL_R, "ZPOOL_STATUS_CORRUPT_LABEL_R" },
126a55b6846Scristian { ZPOOL_STATUS_CORRUPT_LABEL_NR, "ZPOOL_STATUS_CORRUPT_LABEL_NR" },
127fbfd10ffStalley { ZPOOL_STATUS_BAD_GUID_SUM, "ZPOOL_STATUS_BAD_GUID_SUM" },
128fbfd10ffStalley { ZPOOL_STATUS_CORRUPT_POOL, "ZPOOL_STATUS_CORRUPT_POOL" },
129fbfd10ffStalley { ZPOOL_STATUS_CORRUPT_DATA, "ZPOOL_STATUS_CORRUPT_DATA" },
130fbfd10ffStalley { ZPOOL_STATUS_FAILING_DEV, "ZPOOL_STATUS_FAILING_DEV" },
131a55b6846Scristian { ZPOOL_STATUS_VERSION_NEWER, "ZPOOL_STATUS_VERSION_NEWER" },
132a55b6846Scristian { ZPOOL_STATUS_HOSTID_MISMATCH, "ZPOOL_STATUS_HOSTID_MISMATCH" },
133a55b6846Scristian { ZPOOL_STATUS_FAULTED_DEV_R, "ZPOOL_STATUS_FAULTED_DEV_R" },
134a55b6846Scristian { ZPOOL_STATUS_FAULTED_DEV_NR, "ZPOOL_STATUS_FAULTED_DEV_NR" },
135b87f3af3Sperrin { ZPOOL_STATUS_BAD_LOG, "ZPOOL_STATUS_BAD_LOG" },
136a55b6846Scristian { ZPOOL_STATUS_VERSION_OLDER, "ZPOOL_STATUS_VERSION_OLDER" },
137fbfd10ffStalley { ZPOOL_STATUS_RESILVERING, "ZPOOL_STATUS_RESILVERING" },
138fbfd10ffStalley { ZPOOL_STATUS_OFFLINE_DEV, "ZPOOL_STATUS_OFFLINE_DEV" },
139c25309d4SGeorge Wilson { ZPOOL_STATUS_REMOVED_DEV, "ZPOOL_STATUS_REMOVED_DEV" },
140fbfd10ffStalley { ZPOOL_STATUS_OK, "ZPOOL_STATUS_OK" },
141a55b6846Scristian { -1, NULL }
142fbfd10ffStalley };
143fbfd10ffStalley
144fa9e4066Sahrens /*
145fa9e4066Sahrens * Function prototypes
146fa9e4066Sahrens */
147fa9e4066Sahrens
148c8e9ed14Stalley static void new_ImportablePoolBean(JNIEnv *, ImportablePoolBean_t *);
149fa9e4066Sahrens static void new_VirtualDevice(JNIEnv *, VirtualDeviceBean_t *);
150a1a659aeStalley static void new_LeafVirtualDevice(JNIEnv *, LeafVirtualDeviceBean_t *);
151fa9e4066Sahrens static void new_DiskVirtualDeviceBean(JNIEnv *, DiskVirtualDeviceBean_t *);
152a1a659aeStalley static void new_SliceVirtualDeviceBean(JNIEnv *, SliceVirtualDeviceBean_t *);
153fa9e4066Sahrens static void new_FileVirtualDeviceBean(JNIEnv *, FileVirtualDeviceBean_t *);
154fa9e4066Sahrens static void new_RAIDVirtualDeviceBean(JNIEnv *, RAIDVirtualDeviceBean_t *);
155fa9e4066Sahrens static void new_MirrorVirtualDeviceBean(JNIEnv *, MirrorVirtualDeviceBean_t *);
156c8e9ed14Stalley static int populate_ImportablePoolBean(
157fbfd10ffStalley JNIEnv *, ImportablePoolBean_t *, nvlist_t *);
158bfe5f5a4Stalley static int populate_VirtualDeviceBean(JNIEnv *, zpool_handle_t *,
159bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, VirtualDeviceBean_t *);
160bfe5f5a4Stalley static int populate_LeafVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
161bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, LeafVirtualDeviceBean_t *);
162bfe5f5a4Stalley static int populate_DiskVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
163bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, DiskVirtualDeviceBean_t *);
164bfe5f5a4Stalley static int populate_SliceVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
165bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, SliceVirtualDeviceBean_t *);
166bfe5f5a4Stalley static int populate_FileVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
167bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, FileVirtualDeviceBean_t *);
168bfe5f5a4Stalley static int populate_RAIDVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
169bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, RAIDVirtualDeviceBean_t *);
170bfe5f5a4Stalley static int populate_MirrorVirtualDeviceBean(JNIEnv *, zpool_handle_t *,
171bfe5f5a4Stalley nvlist_t *, uint64_t *p_vdev_id, MirrorVirtualDeviceBean_t *);
172fbfd10ffStalley static jobject create_ImportablePoolBean(JNIEnv *, nvlist_t *);
173fa9e4066Sahrens static jobject create_DiskVirtualDeviceBean(
174bfe5f5a4Stalley JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
175a1a659aeStalley static jobject create_SliceVirtualDeviceBean(
176bfe5f5a4Stalley JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
177fa9e4066Sahrens static jobject create_FileVirtualDeviceBean(
178bfe5f5a4Stalley JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
179fa9e4066Sahrens static jobject create_RAIDVirtualDeviceBean(
180bfe5f5a4Stalley JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
181fa9e4066Sahrens static jobject create_MirrorVirtualDeviceBean(
182bfe5f5a4Stalley JNIEnv *, zpool_handle_t *, nvlist_t *, uint64_t *p_vdev_id);
183fbfd10ffStalley static char *find_field(const zjni_field_mapping_t *, int);
184fbfd10ffStalley static jobject zjni_vdev_state_to_obj(JNIEnv *, vdev_state_t);
185fbfd10ffStalley static jobject zjni_vdev_aux_to_obj(JNIEnv *, vdev_aux_t);
186fa9e4066Sahrens
187fa9e4066Sahrens /*
188fa9e4066Sahrens * Static functions
189fa9e4066Sahrens */
190fa9e4066Sahrens
191c8e9ed14Stalley /* Create a ImportablePoolBean */
192c8e9ed14Stalley static void
new_ImportablePoolBean(JNIEnv * env,ImportablePoolBean_t * bean)193c8e9ed14Stalley new_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean)
194c8e9ed14Stalley {
195c8e9ed14Stalley zjni_Object_t *object = (zjni_Object_t *)bean;
196c8e9ed14Stalley
197c8e9ed14Stalley if (object->object == NULL) {
198c8e9ed14Stalley object->class =
199c8e9ed14Stalley (*env)->FindClass(env,
2001e995cfcSrl ZFSJNI_PACKAGE_DATA "ImportablePoolBean");
201c8e9ed14Stalley
202c8e9ed14Stalley object->constructor =
203c8e9ed14Stalley (*env)->GetMethodID(env, object->class, "<init>", "()V");
204c8e9ed14Stalley
205c8e9ed14Stalley object->object =
206c8e9ed14Stalley (*env)->NewObject(env, object->class, object->constructor);
207c8e9ed14Stalley }
208c8e9ed14Stalley
209fbfd10ffStalley new_PoolStats(env, &(bean->interface_PoolStats), object);
210fbfd10ffStalley
211c8e9ed14Stalley bean->method_setName = (*env)->GetMethodID(
212c8e9ed14Stalley env, object->class, "setName", "(Ljava/lang/String;)V");
213c8e9ed14Stalley
214c8e9ed14Stalley bean->method_setId = (*env)->GetMethodID(
215c8e9ed14Stalley env, object->class, "setId", "(J)V");
216c8e9ed14Stalley }
217c8e9ed14Stalley
218fa9e4066Sahrens /* Create a VirtualDeviceBean */
219fa9e4066Sahrens static void
new_VirtualDevice(JNIEnv * env,VirtualDeviceBean_t * bean)220fa9e4066Sahrens new_VirtualDevice(JNIEnv *env, VirtualDeviceBean_t *bean)
221fa9e4066Sahrens {
222fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
223fa9e4066Sahrens
224fa9e4066Sahrens if (object->object == NULL) {
225fa9e4066Sahrens object->class =
226fa9e4066Sahrens (*env)->FindClass(env,
2271e995cfcSrl ZFSJNI_PACKAGE_DATA "VirtualDeviceBean");
228fa9e4066Sahrens
229fa9e4066Sahrens object->constructor =
230fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
231fa9e4066Sahrens
232fa9e4066Sahrens object->object =
233fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor);
234fa9e4066Sahrens }
235fa9e4066Sahrens
236fbfd10ffStalley new_DeviceStats(env, &(bean->interface_DeviceStats), object);
237fbfd10ffStalley
238fa9e4066Sahrens bean->method_setPoolName = (*env)->GetMethodID(
239fa9e4066Sahrens env, object->class, "setPoolName", "(Ljava/lang/String;)V");
240fa9e4066Sahrens
241bfe5f5a4Stalley bean->method_setParentIndex = (*env)->GetMethodID(
242bfe5f5a4Stalley env, object->class, "setParentIndex", "(Ljava/lang/Long;)V");
243bfe5f5a4Stalley
244fa9e4066Sahrens bean->method_setIndex = (*env)->GetMethodID(
245fa9e4066Sahrens env, object->class, "setIndex", "(J)V");
246fa9e4066Sahrens }
247fa9e4066Sahrens
248a1a659aeStalley /* Create a LeafVirtualDeviceBean */
249a1a659aeStalley static void
new_LeafVirtualDevice(JNIEnv * env,LeafVirtualDeviceBean_t * bean)250a1a659aeStalley new_LeafVirtualDevice(JNIEnv *env, LeafVirtualDeviceBean_t *bean)
251a1a659aeStalley {
252a1a659aeStalley zjni_Object_t *object = (zjni_Object_t *)bean;
253a1a659aeStalley
254a1a659aeStalley if (object->object == NULL) {
255a1a659aeStalley object->class =
256a1a659aeStalley (*env)->FindClass(env,
2571e995cfcSrl ZFSJNI_PACKAGE_DATA "LeafVirtualDeviceBean");
258a1a659aeStalley
259a1a659aeStalley object->constructor =
260a1a659aeStalley (*env)->GetMethodID(env, object->class, "<init>", "()V");
261a1a659aeStalley
262a1a659aeStalley object->object =
263a1a659aeStalley (*env)->NewObject(env, object->class, object->constructor);
264a1a659aeStalley }
265a1a659aeStalley
266a1a659aeStalley new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
267a1a659aeStalley
268a1a659aeStalley bean->method_setName = (*env)->GetMethodID(
269a1a659aeStalley env, object->class, "setName", "(Ljava/lang/String;)V");
270a1a659aeStalley }
271a1a659aeStalley
272fa9e4066Sahrens /* Create a DiskVirtualDeviceBean */
273fa9e4066Sahrens static void
new_DiskVirtualDeviceBean(JNIEnv * env,DiskVirtualDeviceBean_t * bean)274fa9e4066Sahrens new_DiskVirtualDeviceBean(JNIEnv *env, DiskVirtualDeviceBean_t *bean)
275fa9e4066Sahrens {
276fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
277fa9e4066Sahrens
278fa9e4066Sahrens if (object->object == NULL) {
279fa9e4066Sahrens object->class = (*env)->FindClass(
280fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "DiskVirtualDeviceBean");
281fa9e4066Sahrens
282fa9e4066Sahrens object->constructor =
283fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
284fa9e4066Sahrens
285fa9e4066Sahrens object->object =
286fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor);
287fa9e4066Sahrens }
288fa9e4066Sahrens
289a1a659aeStalley new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
290a1a659aeStalley }
291fa9e4066Sahrens
292a1a659aeStalley /* Create a SliceVirtualDeviceBean */
293a1a659aeStalley static void
new_SliceVirtualDeviceBean(JNIEnv * env,SliceVirtualDeviceBean_t * bean)294a1a659aeStalley new_SliceVirtualDeviceBean(JNIEnv *env, SliceVirtualDeviceBean_t *bean)
295a1a659aeStalley {
296a1a659aeStalley zjni_Object_t *object = (zjni_Object_t *)bean;
297fa9e4066Sahrens
298a1a659aeStalley if (object->object == NULL) {
299a1a659aeStalley object->class = (*env)->FindClass(
300a1a659aeStalley env, ZFSJNI_PACKAGE_DATA "SliceVirtualDeviceBean");
301a1a659aeStalley
302a1a659aeStalley object->constructor =
303a1a659aeStalley (*env)->GetMethodID(env, object->class, "<init>", "()V");
304a1a659aeStalley
305a1a659aeStalley object->object =
306a1a659aeStalley (*env)->NewObject(env, object->class, object->constructor);
307a1a659aeStalley }
308a1a659aeStalley
309a1a659aeStalley new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
310fa9e4066Sahrens }
311fa9e4066Sahrens
312fa9e4066Sahrens /* Create a FileVirtualDeviceBean */
313fa9e4066Sahrens static void
new_FileVirtualDeviceBean(JNIEnv * env,FileVirtualDeviceBean_t * bean)314fa9e4066Sahrens new_FileVirtualDeviceBean(JNIEnv *env, FileVirtualDeviceBean_t *bean)
315fa9e4066Sahrens {
316fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
317fa9e4066Sahrens
318fa9e4066Sahrens if (object->object == NULL) {
319fa9e4066Sahrens object->class = (*env)->FindClass(
320fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "FileVirtualDeviceBean");
321fa9e4066Sahrens
322fa9e4066Sahrens object->constructor =
323fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
324fa9e4066Sahrens
325fa9e4066Sahrens object->object =
326fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor);
327fa9e4066Sahrens }
328fa9e4066Sahrens
329a1a659aeStalley new_LeafVirtualDevice(env, (LeafVirtualDeviceBean_t *)bean);
330fa9e4066Sahrens }
331fa9e4066Sahrens
332fa9e4066Sahrens /* Create a RAIDVirtualDeviceBean */
333fa9e4066Sahrens static void
new_RAIDVirtualDeviceBean(JNIEnv * env,RAIDVirtualDeviceBean_t * bean)334fa9e4066Sahrens new_RAIDVirtualDeviceBean(JNIEnv *env, RAIDVirtualDeviceBean_t *bean)
335fa9e4066Sahrens {
336fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
337fa9e4066Sahrens
338fa9e4066Sahrens if (object->object == NULL) {
339fa9e4066Sahrens
340fa9e4066Sahrens object->class = (*env)->FindClass(
341fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "RAIDVirtualDeviceBean");
342fa9e4066Sahrens
343fa9e4066Sahrens object->constructor =
344fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
345fa9e4066Sahrens
346fa9e4066Sahrens object->object =
347fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor);
348fa9e4066Sahrens }
349fa9e4066Sahrens
350fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
3511e995cfcSrl
3521e995cfcSrl bean->method_setParity = (*env)->GetMethodID(
3531e995cfcSrl env, object->class, "setParity", "(J)V");
354fa9e4066Sahrens }
355fa9e4066Sahrens
356fa9e4066Sahrens /* Create a MirrorVirtualDeviceBean */
357fa9e4066Sahrens static void
new_MirrorVirtualDeviceBean(JNIEnv * env,MirrorVirtualDeviceBean_t * bean)358fa9e4066Sahrens new_MirrorVirtualDeviceBean(JNIEnv *env, MirrorVirtualDeviceBean_t *bean)
359fa9e4066Sahrens {
360fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
361fa9e4066Sahrens
362fa9e4066Sahrens if (object->object == NULL) {
363fa9e4066Sahrens object->class = (*env)->FindClass(
364fa9e4066Sahrens env, ZFSJNI_PACKAGE_DATA "MirrorVirtualDeviceBean");
365fa9e4066Sahrens
366fa9e4066Sahrens object->constructor =
367fa9e4066Sahrens (*env)->GetMethodID(env, object->class, "<init>", "()V");
368fa9e4066Sahrens
369fa9e4066Sahrens object->object =
370fa9e4066Sahrens (*env)->NewObject(env, object->class, object->constructor);
371fa9e4066Sahrens }
372fa9e4066Sahrens
373fa9e4066Sahrens new_VirtualDevice(env, (VirtualDeviceBean_t *)bean);
374fa9e4066Sahrens }
375fa9e4066Sahrens
376c8e9ed14Stalley static int
populate_ImportablePoolBean(JNIEnv * env,ImportablePoolBean_t * bean,nvlist_t * config)377c8e9ed14Stalley populate_ImportablePoolBean(JNIEnv *env, ImportablePoolBean_t *bean,
378fbfd10ffStalley nvlist_t *config)
379c8e9ed14Stalley {
380fbfd10ffStalley char *c;
381fbfd10ffStalley char *name;
382fbfd10ffStalley uint64_t guid;
383fbfd10ffStalley uint64_t state;
384a55b6846Scristian uint64_t version;
385fbfd10ffStalley nvlist_t *devices;
386fbfd10ffStalley
387c8e9ed14Stalley zjni_Object_t *object = (zjni_Object_t *)bean;
388fbfd10ffStalley PoolStatsBean_t *pool_stats = &(bean->interface_PoolStats);
389fbfd10ffStalley DeviceStatsBean_t *dev_stats = (DeviceStatsBean_t *)pool_stats;
390fbfd10ffStalley
391fbfd10ffStalley if (nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &name) ||
392fbfd10ffStalley nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) ||
393fbfd10ffStalley nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, &state) ||
394a55b6846Scristian nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) ||
395fbfd10ffStalley nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &devices) ||
396fbfd10ffStalley populate_DeviceStatsBean(env, devices, dev_stats, object)) {
397fbfd10ffStalley return (-1);
398fbfd10ffStalley }
399c8e9ed14Stalley
400fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
401fbfd10ffStalley bean->method_setName, (*env)->NewStringUTF(env, name));
402c8e9ed14Stalley
403fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
404fbfd10ffStalley bean->method_setId, (jlong)guid);
405c8e9ed14Stalley
406fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
407fbfd10ffStalley pool_stats->method_setPoolState,
408fbfd10ffStalley zjni_pool_state_to_obj(env, (pool_state_t)state));
409c8e9ed14Stalley
410fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
411fbfd10ffStalley pool_stats->method_setPoolStatus,
412eb633035STom Caputi zjni_pool_status_to_obj(env, zpool_import_status(config, &c,
413eb633035STom Caputi NULL)));
414c8e9ed14Stalley
415a55b6846Scristian (*env)->CallVoidMethod(env, object->object,
416a55b6846Scristian pool_stats->method_setPoolVersion, (jlong)version);
417a55b6846Scristian
418c8e9ed14Stalley return (0);
419c8e9ed14Stalley }
420c8e9ed14Stalley
421fa9e4066Sahrens static int
populate_VirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,VirtualDeviceBean_t * bean)422fa9e4066Sahrens populate_VirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
423bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, VirtualDeviceBean_t *bean)
424fa9e4066Sahrens {
425fa9e4066Sahrens int result;
426fa9e4066Sahrens uint64_t vdev_id;
427fbfd10ffStalley jstring poolUTF;
428fbfd10ffStalley
429fa9e4066Sahrens zjni_Object_t *object = (zjni_Object_t *)bean;
430fbfd10ffStalley DeviceStatsBean_t *stats = &(bean->interface_DeviceStats);
431fbfd10ffStalley
432fbfd10ffStalley result = populate_DeviceStatsBean(env, vdev, stats, object);
433fbfd10ffStalley if (result != 0) {
434fbfd10ffStalley return (1);
435fbfd10ffStalley }
436fa9e4066Sahrens
437fa9e4066Sahrens /* Set pool name */
438fbfd10ffStalley poolUTF = (*env)->NewStringUTF(env, zpool_get_name(zhp));
439fa9e4066Sahrens (*env)->CallVoidMethod(
440fa9e4066Sahrens env, object->object, bean->method_setPoolName, poolUTF);
441fa9e4066Sahrens
442bfe5f5a4Stalley /* Set parent vdev index */
443bfe5f5a4Stalley (*env)->CallVoidMethod(
444bfe5f5a4Stalley env, object->object, bean->method_setParentIndex,
445bfe5f5a4Stalley p_vdev_id == NULL ? NULL :
446bfe5f5a4Stalley zjni_long_to_Long(env, *p_vdev_id));
447bfe5f5a4Stalley
448fa9e4066Sahrens /* Get index */
449fa9e4066Sahrens result = nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &vdev_id);
450fa9e4066Sahrens if (result != 0) {
451fa9e4066Sahrens zjni_throw_exception(env,
452fa9e4066Sahrens "could not retrieve virtual device ID (pool %s)",
453fa9e4066Sahrens zpool_get_name(zhp));
454fbfd10ffStalley return (1);
455fa9e4066Sahrens }
456fa9e4066Sahrens
457fbfd10ffStalley (*env)->CallVoidMethod(
458fbfd10ffStalley env, object->object, bean->method_setIndex, (jlong)vdev_id);
459fbfd10ffStalley
460fbfd10ffStalley return (0);
461fa9e4066Sahrens }
462fa9e4066Sahrens
463a1a659aeStalley static int
populate_LeafVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,LeafVirtualDeviceBean_t * bean)464a1a659aeStalley populate_LeafVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
465bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, LeafVirtualDeviceBean_t *bean)
466a1a659aeStalley {
467a1a659aeStalley return (populate_VirtualDeviceBean(
468bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, (VirtualDeviceBean_t *)bean));
469a1a659aeStalley }
470a1a659aeStalley
471fa9e4066Sahrens static int
populate_DiskVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,DiskVirtualDeviceBean_t * bean)472fa9e4066Sahrens populate_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
473bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, DiskVirtualDeviceBean_t *bean)
474fa9e4066Sahrens {
475fa9e4066Sahrens char *path;
476a1a659aeStalley int result = populate_LeafVirtualDeviceBean(
477bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
478fa9e4066Sahrens
479fa9e4066Sahrens if (result) {
480fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
481fa9e4066Sahrens return (-1);
482fa9e4066Sahrens }
483fa9e4066Sahrens
484fa9e4066Sahrens /* Set path */
485fa9e4066Sahrens result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
486fa9e4066Sahrens if (result != 0) {
487fa9e4066Sahrens zjni_throw_exception(env,
488d7d4af51Smmusante "could not retrieve path from disk virtual device "
489d7d4af51Smmusante "(pool %s)", zpool_get_name(zhp));
490fa9e4066Sahrens } else {
491fa9e4066Sahrens
492a1a659aeStalley regex_t re;
493a1a659aeStalley regmatch_t matches[2];
494a1a659aeStalley jstring pathUTF = NULL;
495a1a659aeStalley
496a1a659aeStalley /* Strip off slice portion of name, if applicable */
497a1a659aeStalley if (regcomp(&re, "^(/dev/dsk/.*)s[0-9]+$", REG_EXTENDED) == 0) {
498a1a659aeStalley if (regexec(&re, path, 2, matches, 0) == 0) {
499a1a659aeStalley regmatch_t *match = matches + 1;
500a1a659aeStalley if (match->rm_so != -1 && match->rm_eo != -1) {
501a1a659aeStalley char *tmp = strdup(path);
502a1a659aeStalley if (tmp != NULL) {
503a1a659aeStalley char *end = tmp + match->rm_eo;
504a1a659aeStalley *end = '\0';
505a1a659aeStalley pathUTF = (*env)->NewStringUTF(
506a1a659aeStalley env, tmp);
507a1a659aeStalley free(tmp);
508a1a659aeStalley }
509a1a659aeStalley }
510a1a659aeStalley }
511a1a659aeStalley regfree(&re);
512a1a659aeStalley }
5133fdda499SJohn Harres if (regcomp(&re, "^(/dev/dsk/.*)s[0-9]+/old$", REG_EXTENDED) ==
5143fdda499SJohn Harres 0) {
5153fdda499SJohn Harres if (regexec(&re, path, 2, matches, 0) == 0) {
5163fdda499SJohn Harres regmatch_t *match = matches + 1;
5173fdda499SJohn Harres if (match->rm_so != -1 && match->rm_eo != -1) {
5183fdda499SJohn Harres char *tmp = strdup(path);
5193fdda499SJohn Harres if (tmp != NULL) {
5203fdda499SJohn Harres (void) strcpy(tmp +
5213fdda499SJohn Harres match->rm_eo, "/old");
5223fdda499SJohn Harres pathUTF = (*env)->NewStringUTF(
5233fdda499SJohn Harres env, tmp);
5243fdda499SJohn Harres free(tmp);
5253fdda499SJohn Harres }
5263fdda499SJohn Harres }
5273fdda499SJohn Harres }
5283fdda499SJohn Harres regfree(&re);
5293fdda499SJohn Harres }
530a1a659aeStalley
531a1a659aeStalley if (pathUTF == NULL) {
5321e995cfcSrl pathUTF = (*env)->NewStringUTF(env, path);
533a1a659aeStalley }
534a1a659aeStalley
535a1a659aeStalley (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
536a1a659aeStalley ((LeafVirtualDeviceBean_t *)bean)->method_setName, pathUTF);
537a1a659aeStalley }
538a1a659aeStalley
539a1a659aeStalley return (result != 0);
540a1a659aeStalley }
541a1a659aeStalley
542a1a659aeStalley static int
populate_SliceVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,SliceVirtualDeviceBean_t * bean)543a1a659aeStalley populate_SliceVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
544bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, SliceVirtualDeviceBean_t *bean)
545a1a659aeStalley {
546a1a659aeStalley char *path;
547a1a659aeStalley int result = populate_LeafVirtualDeviceBean(
548bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
549a1a659aeStalley
550a1a659aeStalley if (result) {
551a1a659aeStalley /* Must not call any more Java methods to preserve exception */
552a1a659aeStalley return (-1);
553a1a659aeStalley }
554a1a659aeStalley
555a1a659aeStalley /* Set path */
556a1a659aeStalley result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
557a1a659aeStalley if (result != 0) {
558a1a659aeStalley zjni_throw_exception(env,
559d7d4af51Smmusante "could not retrieve path from slice virtual device (pool "
560a1a659aeStalley "%s)", zpool_get_name(zhp));
561a1a659aeStalley } else {
562a1a659aeStalley
563fa9e4066Sahrens jstring pathUTF = (*env)->NewStringUTF(env, path);
564fa9e4066Sahrens (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
565bfe5f5a4Stalley ((LeafVirtualDeviceBean_t *)bean)->method_setName,
566bfe5f5a4Stalley pathUTF);
567fa9e4066Sahrens }
568fa9e4066Sahrens
569fa9e4066Sahrens return (result != 0);
570fa9e4066Sahrens }
571fa9e4066Sahrens
572fa9e4066Sahrens static int
populate_FileVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,FileVirtualDeviceBean_t * bean)573fa9e4066Sahrens populate_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
574bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, FileVirtualDeviceBean_t *bean)
575fa9e4066Sahrens {
576fa9e4066Sahrens char *path;
577a1a659aeStalley int result = populate_LeafVirtualDeviceBean(
578bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, (LeafVirtualDeviceBean_t *)bean);
579fa9e4066Sahrens
580fa9e4066Sahrens if (result) {
581fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
582fa9e4066Sahrens return (-1);
583fa9e4066Sahrens }
584fa9e4066Sahrens
585fa9e4066Sahrens /* Set path */
586fa9e4066Sahrens result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_PATH, &path);
587fa9e4066Sahrens if (result != 0) {
588fa9e4066Sahrens zjni_throw_exception(env,
589d7d4af51Smmusante "could not retrieve path from disk virtual device "
590d7d4af51Smmusante "(pool %s)", zpool_get_name(zhp));
591fa9e4066Sahrens } else {
592fa9e4066Sahrens
593fa9e4066Sahrens jstring pathUTF = (*env)->NewStringUTF(env, path);
594fa9e4066Sahrens (*env)->CallVoidMethod(env, ((zjni_Object_t *)bean)->object,
595a1a659aeStalley ((LeafVirtualDeviceBean_t *)bean)->method_setName, pathUTF);
596fa9e4066Sahrens }
597fa9e4066Sahrens
598fa9e4066Sahrens return (result != 0);
599fa9e4066Sahrens }
600fa9e4066Sahrens
601fa9e4066Sahrens static int
populate_RAIDVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,RAIDVirtualDeviceBean_t * bean)602fa9e4066Sahrens populate_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
603bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, RAIDVirtualDeviceBean_t *bean)
604fa9e4066Sahrens {
605bfe5f5a4Stalley return (populate_VirtualDeviceBean(env, zhp, vdev, p_vdev_id,
606fa9e4066Sahrens (VirtualDeviceBean_t *)bean));
607fa9e4066Sahrens }
608fa9e4066Sahrens
609fa9e4066Sahrens static int
populate_MirrorVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id,MirrorVirtualDeviceBean_t * bean)610fa9e4066Sahrens populate_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
611bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id, MirrorVirtualDeviceBean_t *bean)
612fa9e4066Sahrens {
613bfe5f5a4Stalley return (populate_VirtualDeviceBean(env, zhp, vdev, p_vdev_id,
614fa9e4066Sahrens (VirtualDeviceBean_t *)bean));
615fa9e4066Sahrens }
616fa9e4066Sahrens
617c8e9ed14Stalley static jobject
create_ImportablePoolBean(JNIEnv * env,nvlist_t * config)618fbfd10ffStalley create_ImportablePoolBean(JNIEnv *env, nvlist_t *config)
619c8e9ed14Stalley {
620c8e9ed14Stalley int result;
621c8e9ed14Stalley ImportablePoolBean_t bean_obj = {0};
622c8e9ed14Stalley ImportablePoolBean_t *bean = &bean_obj;
623c8e9ed14Stalley
624c8e9ed14Stalley /* Construct ImportablePoolBean */
625c8e9ed14Stalley new_ImportablePoolBean(env, bean);
626c8e9ed14Stalley
627fbfd10ffStalley result = populate_ImportablePoolBean(env, bean, config);
628c8e9ed14Stalley if (result) {
629c8e9ed14Stalley /* Must not call any more Java methods to preserve exception */
630c8e9ed14Stalley return (NULL);
631c8e9ed14Stalley }
632c8e9ed14Stalley
633c8e9ed14Stalley return (((zjni_Object_t *)bean)->object);
634c8e9ed14Stalley }
635c8e9ed14Stalley
636fa9e4066Sahrens static jobject
create_DiskVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)637bfe5f5a4Stalley create_DiskVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
638bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
639fa9e4066Sahrens {
640fa9e4066Sahrens int result;
641fa9e4066Sahrens DiskVirtualDeviceBean_t bean_obj = {0};
642fa9e4066Sahrens DiskVirtualDeviceBean_t *bean = &bean_obj;
643fa9e4066Sahrens
644fa9e4066Sahrens /* Construct DiskVirtualDeviceBean */
645fa9e4066Sahrens new_DiskVirtualDeviceBean(env, bean);
646fa9e4066Sahrens
647bfe5f5a4Stalley result = populate_DiskVirtualDeviceBean(
648bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, bean);
649fa9e4066Sahrens if (result) {
650fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
651fa9e4066Sahrens return (NULL);
652fa9e4066Sahrens }
653fa9e4066Sahrens
654fa9e4066Sahrens return (((zjni_Object_t *)bean)->object);
655fa9e4066Sahrens }
656fa9e4066Sahrens
657a1a659aeStalley static jobject
create_SliceVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)658bfe5f5a4Stalley create_SliceVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
659bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
660a1a659aeStalley {
661a1a659aeStalley int result;
662a1a659aeStalley SliceVirtualDeviceBean_t bean_obj = {0};
663a1a659aeStalley SliceVirtualDeviceBean_t *bean = &bean_obj;
664a1a659aeStalley
665a1a659aeStalley /* Construct SliceVirtualDeviceBean */
666a1a659aeStalley new_SliceVirtualDeviceBean(env, bean);
667a1a659aeStalley
668bfe5f5a4Stalley result = populate_SliceVirtualDeviceBean(
669bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, bean);
670a1a659aeStalley if (result) {
671a1a659aeStalley /* Must not call any more Java methods to preserve exception */
672a1a659aeStalley return (NULL);
673a1a659aeStalley }
674a1a659aeStalley
675a1a659aeStalley return (((zjni_Object_t *)bean)->object);
676a1a659aeStalley }
677a1a659aeStalley
678fa9e4066Sahrens static jobject
create_FileVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)679bfe5f5a4Stalley create_FileVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
680bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
681fa9e4066Sahrens {
682fa9e4066Sahrens int result;
683fa9e4066Sahrens FileVirtualDeviceBean_t bean_obj = {0};
684fa9e4066Sahrens FileVirtualDeviceBean_t *bean = &bean_obj;
685fa9e4066Sahrens
686fa9e4066Sahrens /* Construct FileVirtualDeviceBean */
687fa9e4066Sahrens new_FileVirtualDeviceBean(env, bean);
688fa9e4066Sahrens
689bfe5f5a4Stalley result = populate_FileVirtualDeviceBean(
690bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, bean);
691fa9e4066Sahrens if (result) {
692fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
693fa9e4066Sahrens return (NULL);
694fa9e4066Sahrens }
695fa9e4066Sahrens
696fa9e4066Sahrens return (((zjni_Object_t *)bean)->object);
697fa9e4066Sahrens }
698fa9e4066Sahrens
699fa9e4066Sahrens static jobject
create_RAIDVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)700bfe5f5a4Stalley create_RAIDVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
701bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
702fa9e4066Sahrens {
703fa9e4066Sahrens int result;
7041e995cfcSrl uint64_t parity;
705fa9e4066Sahrens RAIDVirtualDeviceBean_t bean_obj = {0};
706fa9e4066Sahrens RAIDVirtualDeviceBean_t *bean = &bean_obj;
707fa9e4066Sahrens
708fa9e4066Sahrens ((zjni_Object_t *)bean)->object = NULL;
709fa9e4066Sahrens
710fa9e4066Sahrens /* Construct RAIDVirtualDeviceBean */
711fa9e4066Sahrens new_RAIDVirtualDeviceBean(env, bean);
712fa9e4066Sahrens
7131e995cfcSrl /* Set parity bit */
7141e995cfcSrl result = nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_NPARITY,
7151e995cfcSrl &parity);
7161e995cfcSrl if (result) {
7171e995cfcSrl /* Default to RAID-Z1 in case of error */
7181e995cfcSrl parity = 1;
7191e995cfcSrl }
7201e995cfcSrl
7211e995cfcSrl (*env)->CallVoidMethod(
7221e995cfcSrl env, ((zjni_Object_t *)bean)->object, bean->method_setParity,
7231e995cfcSrl (jlong)parity);
7241e995cfcSrl
7251e995cfcSrl
726bfe5f5a4Stalley result = populate_RAIDVirtualDeviceBean(
727bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, bean);
728fa9e4066Sahrens if (result) {
729fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
730fa9e4066Sahrens return (NULL);
731fa9e4066Sahrens }
732fa9e4066Sahrens
733fa9e4066Sahrens return (((zjni_Object_t *)bean)->object);
734fa9e4066Sahrens }
735fa9e4066Sahrens
736fa9e4066Sahrens static jobject
create_MirrorVirtualDeviceBean(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)737bfe5f5a4Stalley create_MirrorVirtualDeviceBean(JNIEnv *env, zpool_handle_t *zhp,
738bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
739fa9e4066Sahrens {
740fa9e4066Sahrens int result;
741fa9e4066Sahrens MirrorVirtualDeviceBean_t bean_obj = {0};
742fa9e4066Sahrens MirrorVirtualDeviceBean_t *bean = &bean_obj;
743fa9e4066Sahrens
744fa9e4066Sahrens /* Construct MirrorVirtualDeviceBean */
745fa9e4066Sahrens new_MirrorVirtualDeviceBean(env, bean);
746fa9e4066Sahrens
747bfe5f5a4Stalley result = populate_MirrorVirtualDeviceBean(
748bfe5f5a4Stalley env, zhp, vdev, p_vdev_id, bean);
749fa9e4066Sahrens if (result) {
750fa9e4066Sahrens /* Must not call any more Java methods to preserve exception */
751fa9e4066Sahrens return (NULL);
752fa9e4066Sahrens }
753fa9e4066Sahrens
754fa9e4066Sahrens return (((zjni_Object_t *)bean)->object);
755fa9e4066Sahrens }
756fa9e4066Sahrens
757fbfd10ffStalley static char *
find_field(const zjni_field_mapping_t * mapping,int value)758*d8ab6e12SDon Brady find_field(const zjni_field_mapping_t *mapping, int value)
759*d8ab6e12SDon Brady {
760fbfd10ffStalley int i;
761fbfd10ffStalley for (i = 0; mapping[i].name != NULL; i++) {
762fbfd10ffStalley if (value == mapping[i].value) {
763fbfd10ffStalley return (mapping[i].name);
764fbfd10ffStalley }
765fbfd10ffStalley }
766fbfd10ffStalley return (NULL);
767fbfd10ffStalley }
768fbfd10ffStalley
769fbfd10ffStalley /*
770fbfd10ffStalley * Converts a vdev_state_t to a Java DeviceStats$DeviceState object.
771fbfd10ffStalley */
772fbfd10ffStalley static jobject
zjni_vdev_state_to_obj(JNIEnv * env,vdev_state_t state)773fbfd10ffStalley zjni_vdev_state_to_obj(JNIEnv *env, vdev_state_t state)
774fbfd10ffStalley {
775fbfd10ffStalley return (zjni_int_to_enum(env, state,
776fbfd10ffStalley ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState",
777fbfd10ffStalley "VDEV_STATE_UNKNOWN", vdev_state_map));
778fbfd10ffStalley }
779fbfd10ffStalley
780fbfd10ffStalley /*
781fbfd10ffStalley * Converts a vdev_aux_t to a Java DeviceStats$DeviceStatus object.
782fbfd10ffStalley */
783fbfd10ffStalley static jobject
zjni_vdev_aux_to_obj(JNIEnv * env,vdev_aux_t aux)784fbfd10ffStalley zjni_vdev_aux_to_obj(JNIEnv *env, vdev_aux_t aux)
785fbfd10ffStalley {
786fbfd10ffStalley return (zjni_int_to_enum(env, aux,
787fbfd10ffStalley ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus",
788fbfd10ffStalley "VDEV_AUX_NONE", vdev_aux_map));
789fbfd10ffStalley }
790fbfd10ffStalley
791fa9e4066Sahrens /*
792fa9e4066Sahrens * Package-private functions
793fa9e4066Sahrens */
794fa9e4066Sahrens
795fbfd10ffStalley /* Create a DeviceStatsBean */
796fbfd10ffStalley void
new_DeviceStats(JNIEnv * env,DeviceStatsBean_t * bean,zjni_Object_t * object)797fbfd10ffStalley new_DeviceStats(JNIEnv *env, DeviceStatsBean_t *bean, zjni_Object_t *object)
798fbfd10ffStalley {
799fbfd10ffStalley bean->method_setSize = (*env)->GetMethodID(
800fbfd10ffStalley env, object->class, "setSize", "(J)V");
801fbfd10ffStalley
802a1a659aeStalley bean->method_setReplacementSize = (*env)->GetMethodID(
803a1a659aeStalley env, object->class, "setReplacementSize", "(J)V");
804a1a659aeStalley
805fbfd10ffStalley bean->method_setUsed = (*env)->GetMethodID(
806fbfd10ffStalley env, object->class, "setUsed", "(J)V");
807fbfd10ffStalley
808fbfd10ffStalley bean->method_setReadBytes = (*env)->GetMethodID(
809fbfd10ffStalley env, object->class, "setReadBytes", "(J)V");
810fbfd10ffStalley
811fbfd10ffStalley bean->method_setWriteBytes = (*env)->GetMethodID(
812fbfd10ffStalley env, object->class, "setWriteBytes", "(J)V");
813fbfd10ffStalley
814fbfd10ffStalley bean->method_setReadOperations = (*env)->GetMethodID(
815fbfd10ffStalley env, object->class, "setReadOperations", "(J)V");
816fbfd10ffStalley
817fbfd10ffStalley bean->method_setWriteOperations = (*env)->GetMethodID(
818fbfd10ffStalley env, object->class, "setWriteOperations", "(J)V");
819fbfd10ffStalley
820fbfd10ffStalley bean->method_setReadErrors = (*env)->GetMethodID(
821fbfd10ffStalley env, object->class, "setReadErrors", "(J)V");
822fbfd10ffStalley
823fbfd10ffStalley bean->method_setWriteErrors = (*env)->GetMethodID(
824fbfd10ffStalley env, object->class, "setWriteErrors", "(J)V");
825fbfd10ffStalley
826fbfd10ffStalley bean->method_setChecksumErrors = (*env)->GetMethodID(
827fbfd10ffStalley env, object->class, "setChecksumErrors", "(J)V");
828fbfd10ffStalley
829fbfd10ffStalley bean->method_setDeviceState = (*env)->GetMethodID(
830fbfd10ffStalley env, object->class, "setDeviceState",
831fbfd10ffStalley "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceState;)V");
832fbfd10ffStalley
833fbfd10ffStalley bean->method_setDeviceStatus = (*env)->GetMethodID(
834fbfd10ffStalley env, object->class, "setDeviceStatus",
835fbfd10ffStalley "(L" ZFSJNI_PACKAGE_DATA "DeviceStats$DeviceStatus;)V");
836fbfd10ffStalley }
837fbfd10ffStalley
838fbfd10ffStalley /* Create a PoolStatsBean */
839fbfd10ffStalley void
new_PoolStats(JNIEnv * env,PoolStatsBean_t * bean,zjni_Object_t * object)840fbfd10ffStalley new_PoolStats(JNIEnv *env, PoolStatsBean_t *bean, zjni_Object_t *object)
841fbfd10ffStalley {
842fbfd10ffStalley new_DeviceStats(env, (DeviceStatsBean_t *)bean, object);
843fbfd10ffStalley
844fbfd10ffStalley bean->method_setPoolState = (*env)->GetMethodID(
845fbfd10ffStalley env, object->class, "setPoolState",
846fbfd10ffStalley "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolState;)V");
847fbfd10ffStalley
848fbfd10ffStalley bean->method_setPoolStatus = (*env)->GetMethodID(
849fbfd10ffStalley env, object->class, "setPoolStatus",
850fbfd10ffStalley "(L" ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus;)V");
851a55b6846Scristian
852a55b6846Scristian bean->method_setPoolVersion = (*env)->GetMethodID(
853a55b6846Scristian env, object->class, "setPoolVersion", "(J)V");
854fbfd10ffStalley }
855fbfd10ffStalley
856fa9e4066Sahrens /*
857fa9e4066Sahrens * Gets the root vdev (an nvlist_t *) for the given pool.
858fa9e4066Sahrens */
859fa9e4066Sahrens nvlist_t *
zjni_get_root_vdev(zpool_handle_t * zhp)860fa9e4066Sahrens zjni_get_root_vdev(zpool_handle_t *zhp)
861fa9e4066Sahrens {
862fa9e4066Sahrens nvlist_t *root = NULL;
863fa9e4066Sahrens
864fa9e4066Sahrens if (zhp != NULL) {
865088e9d47Seschrock nvlist_t *attrs = zpool_get_config(zhp, NULL);
866fa9e4066Sahrens
867fa9e4066Sahrens if (attrs != NULL) {
868fa9e4066Sahrens int result = nvlist_lookup_nvlist(
869fa9e4066Sahrens attrs, ZPOOL_CONFIG_VDEV_TREE, &root);
870fa9e4066Sahrens if (result != 0) {
871fa9e4066Sahrens root = NULL;
872fa9e4066Sahrens }
873fa9e4066Sahrens }
874fa9e4066Sahrens }
875fa9e4066Sahrens
876fa9e4066Sahrens return (root);
877fa9e4066Sahrens }
878fa9e4066Sahrens
879fa9e4066Sahrens /*
880fa9e4066Sahrens * Gets the vdev (an nvlist_t *) with the given vdev_id, below the
881fa9e4066Sahrens * given vdev. If the given vdev is NULL, all vdevs within the given
882fa9e4066Sahrens * pool are searched.
883bfe5f5a4Stalley *
884bfe5f5a4Stalley * If p_vdev_id is not NULL, it will be set to the ID of the parent
885bfe5f5a4Stalley * vdev, if any, or to vdev_id_to_find if the searched-for vdev is a
886bfe5f5a4Stalley * toplevel vdev.
887fa9e4066Sahrens */
888fa9e4066Sahrens nvlist_t *
zjni_get_vdev(zpool_handle_t * zhp,nvlist_t * vdev_parent,uint64_t vdev_id_to_find,uint64_t * p_vdev_id)889fa9e4066Sahrens zjni_get_vdev(zpool_handle_t *zhp, nvlist_t *vdev_parent,
890bfe5f5a4Stalley uint64_t vdev_id_to_find, uint64_t *p_vdev_id)
891fa9e4066Sahrens {
892fa9e4066Sahrens int result;
893bfe5f5a4Stalley uint64_t id = vdev_id_to_find;
894fa9e4066Sahrens
895fa9e4066Sahrens /* Was a vdev specified? */
896fa9e4066Sahrens if (vdev_parent == NULL) {
897fa9e4066Sahrens /* No -- retrieve the top-level pool vdev */
898fa9e4066Sahrens vdev_parent = zjni_get_root_vdev(zhp);
899fa9e4066Sahrens } else {
900fa9e4066Sahrens /* Get index of this vdev and compare with vdev_id_to_find */
901fa9e4066Sahrens result = nvlist_lookup_uint64(
902fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_GUID, &id);
903fa9e4066Sahrens if (result == 0 && id == vdev_id_to_find) {
904fa9e4066Sahrens return (vdev_parent);
905fa9e4066Sahrens }
906fa9e4066Sahrens }
907fa9e4066Sahrens
908fa9e4066Sahrens if (vdev_parent != NULL) {
909fa9e4066Sahrens
910fa9e4066Sahrens nvlist_t **children;
911fa9e4066Sahrens uint_t nelem = 0;
912fa9e4066Sahrens
913fa9e4066Sahrens /* Get the vdevs under this vdev */
914fa9e4066Sahrens result = nvlist_lookup_nvlist_array(
915fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
916fa9e4066Sahrens
917fa9e4066Sahrens if (result == 0) {
918fa9e4066Sahrens
919fa9e4066Sahrens int i;
920fa9e4066Sahrens nvlist_t *child;
921fa9e4066Sahrens
922fa9e4066Sahrens /* For each vdev child... */
923fa9e4066Sahrens for (i = 0; i < nelem; i++) {
924bfe5f5a4Stalley if (p_vdev_id != NULL) {
925bfe5f5a4Stalley /* Save parent vdev id */
926bfe5f5a4Stalley *p_vdev_id = id;
927bfe5f5a4Stalley }
928bfe5f5a4Stalley
929fa9e4066Sahrens child = zjni_get_vdev(zhp, children[i],
930bfe5f5a4Stalley vdev_id_to_find, p_vdev_id);
931fa9e4066Sahrens if (child != NULL) {
932fa9e4066Sahrens return (child);
933fa9e4066Sahrens }
934fa9e4066Sahrens }
935fa9e4066Sahrens }
936fa9e4066Sahrens }
937fa9e4066Sahrens
938fa9e4066Sahrens return (NULL);
939fa9e4066Sahrens }
940fa9e4066Sahrens
941fa9e4066Sahrens jobject
zjni_get_VirtualDevice_from_vdev(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev,uint64_t * p_vdev_id)942fa9e4066Sahrens zjni_get_VirtualDevice_from_vdev(JNIEnv *env, zpool_handle_t *zhp,
943bfe5f5a4Stalley nvlist_t *vdev, uint64_t *p_vdev_id)
944fa9e4066Sahrens {
945fa9e4066Sahrens jobject obj = NULL;
946fa9e4066Sahrens char *type = NULL;
947fa9e4066Sahrens int result = nvlist_lookup_string(vdev, ZPOOL_CONFIG_TYPE, &type);
948fa9e4066Sahrens
949fa9e4066Sahrens if (result == 0) {
950fa9e4066Sahrens if (strcmp(type, VDEV_TYPE_DISK) == 0) {
951a1a659aeStalley uint64_t wholedisk;
952a1a659aeStalley if (nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK,
953a1a659aeStalley &wholedisk) == 0 && wholedisk) {
954a1a659aeStalley obj = create_DiskVirtualDeviceBean(
955bfe5f5a4Stalley env, zhp, vdev, p_vdev_id);
956a1a659aeStalley } else {
957a1a659aeStalley obj = create_SliceVirtualDeviceBean(
958bfe5f5a4Stalley env, zhp, vdev, p_vdev_id);
959a1a659aeStalley }
960fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_FILE) == 0) {
961bfe5f5a4Stalley obj = create_FileVirtualDeviceBean(
962bfe5f5a4Stalley env, zhp, vdev, p_vdev_id);
963fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) {
964bfe5f5a4Stalley obj = create_RAIDVirtualDeviceBean(
965bfe5f5a4Stalley env, zhp, vdev, p_vdev_id);
966fa9e4066Sahrens } else if (strcmp(type, VDEV_TYPE_MIRROR) == 0) {
967bfe5f5a4Stalley obj = create_MirrorVirtualDeviceBean(
968bfe5f5a4Stalley env, zhp, vdev, p_vdev_id);
969c8e9ed14Stalley } else if (strcmp(type, VDEV_TYPE_REPLACING) == 0) {
970c8e9ed14Stalley
971c8e9ed14Stalley /* Get the vdevs under this vdev */
972c8e9ed14Stalley nvlist_t **children;
973c8e9ed14Stalley uint_t nelem = 0;
974c8e9ed14Stalley int result = nvlist_lookup_nvlist_array(
975c8e9ed14Stalley vdev, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
976c8e9ed14Stalley
977c8e9ed14Stalley if (result == 0 && nelem > 0) {
978c8e9ed14Stalley
979c8e9ed14Stalley /* Get last vdev child (replacement device) */
980c8e9ed14Stalley nvlist_t *child = children[nelem - 1];
981c8e9ed14Stalley
982c8e9ed14Stalley obj = zjni_get_VirtualDevice_from_vdev(env,
983bfe5f5a4Stalley zhp, child, p_vdev_id);
984c8e9ed14Stalley }
985fa9e4066Sahrens }
986fa9e4066Sahrens }
987fa9e4066Sahrens
988fa9e4066Sahrens return (obj);
989fa9e4066Sahrens }
990fa9e4066Sahrens
991fa9e4066Sahrens jobject
zjni_get_VirtualDevices_from_vdev(JNIEnv * env,zpool_handle_t * zhp,nvlist_t * vdev_parent,uint64_t * p_vdev_id)992fa9e4066Sahrens zjni_get_VirtualDevices_from_vdev(JNIEnv *env, zpool_handle_t *zhp,
993bfe5f5a4Stalley nvlist_t *vdev_parent, uint64_t *p_vdev_id)
994fa9e4066Sahrens {
995fa9e4066Sahrens /* Create an array list for the vdevs */
996fa9e4066Sahrens zjni_ArrayList_t list_class = {0};
997fa9e4066Sahrens zjni_ArrayList_t *list_class_p = &list_class;
998fa9e4066Sahrens zjni_new_ArrayList(env, list_class_p);
999fa9e4066Sahrens
1000fa9e4066Sahrens /* Was a vdev specified? */
1001fa9e4066Sahrens if (vdev_parent == NULL) {
1002fa9e4066Sahrens /* No -- retrieve the top-level pool vdev */
1003fa9e4066Sahrens vdev_parent = zjni_get_root_vdev(zhp);
1004fa9e4066Sahrens }
1005fa9e4066Sahrens
1006fa9e4066Sahrens if (vdev_parent != NULL) {
1007fa9e4066Sahrens
1008fa9e4066Sahrens /* Get the vdevs under this vdev */
1009fa9e4066Sahrens nvlist_t **children;
1010fa9e4066Sahrens uint_t nelem = 0;
1011fa9e4066Sahrens int result = nvlist_lookup_nvlist_array(
1012fa9e4066Sahrens vdev_parent, ZPOOL_CONFIG_CHILDREN, &children, &nelem);
1013fa9e4066Sahrens
1014fa9e4066Sahrens if (result == 0) {
1015fa9e4066Sahrens
1016fa9e4066Sahrens /* For each vdev child... */
1017fa9e4066Sahrens int i;
1018fa9e4066Sahrens for (i = 0; i < nelem; i++) {
1019fa9e4066Sahrens nvlist_t *child = children[i];
1020fa9e4066Sahrens
1021fa9e4066Sahrens /* Create a Java object from this vdev */
1022fa9e4066Sahrens jobject obj =
1023fa9e4066Sahrens zjni_get_VirtualDevice_from_vdev(env,
10241e995cfcSrl zhp, child, p_vdev_id);
1025fa9e4066Sahrens
1026c8e9ed14Stalley if ((*env)->ExceptionOccurred(env) != NULL) {
1027fa9e4066Sahrens /*
1028fa9e4066Sahrens * Must not call any more Java methods
1029fa9e4066Sahrens * to preserve exception
1030fa9e4066Sahrens */
1031fa9e4066Sahrens return (NULL);
1032fa9e4066Sahrens }
1033fa9e4066Sahrens
1034c8e9ed14Stalley if (obj != NULL) {
1035c8e9ed14Stalley /* Add child to child vdev list */
10361e995cfcSrl (*env)->CallBooleanMethod(env,
10371e995cfcSrl ((zjni_Object_t *)
10381e995cfcSrl list_class_p)->object,
10391e995cfcSrl ((zjni_Collection_t *)
10401e995cfcSrl list_class_p)->method_add, obj);
1041c8e9ed14Stalley }
1042fa9e4066Sahrens }
1043fa9e4066Sahrens }
1044fa9e4066Sahrens }
1045fa9e4066Sahrens
1046fa9e4066Sahrens return (zjni_Collection_to_array(
1047fa9e4066Sahrens env, (zjni_Collection_t *)list_class_p,
1048fa9e4066Sahrens ZFSJNI_PACKAGE_DATA "VirtualDevice"));
1049fa9e4066Sahrens }
1050c8e9ed14Stalley
1051c8e9ed14Stalley int
zjni_create_add_ImportablePool(nvlist_t * config,void * data)1052*d8ab6e12SDon Brady zjni_create_add_ImportablePool(nvlist_t *config, void *data)
1053*d8ab6e12SDon Brady {
1054c8e9ed14Stalley
1055c8e9ed14Stalley JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
1056c8e9ed14Stalley zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
1057c8e9ed14Stalley
1058c8e9ed14Stalley /* Construct ImportablePool object */
1059fbfd10ffStalley jobject bean = create_ImportablePoolBean(env, config);
1060c8e9ed14Stalley if (bean == NULL) {
1061c8e9ed14Stalley return (-1);
1062c8e9ed14Stalley }
1063c8e9ed14Stalley
1064c8e9ed14Stalley /* Add bean to list */
1065c8e9ed14Stalley (*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
1066c8e9ed14Stalley ((zjni_Collection_t *)list)->method_add, bean);
1067c8e9ed14Stalley
1068c8e9ed14Stalley return (0);
1069c8e9ed14Stalley }
1070c8e9ed14Stalley
1071fbfd10ffStalley int
populate_DeviceStatsBean(JNIEnv * env,nvlist_t * vdev,DeviceStatsBean_t * bean,zjni_Object_t * object)1072fbfd10ffStalley populate_DeviceStatsBean(JNIEnv *env, nvlist_t *vdev,
1073fbfd10ffStalley DeviceStatsBean_t *bean, zjni_Object_t *object)
1074fbfd10ffStalley {
1075fbfd10ffStalley uint_t c;
1076fbfd10ffStalley vdev_stat_t *vs;
1077fbfd10ffStalley
1078fbfd10ffStalley int result = nvlist_lookup_uint64_array(
10793f9d6ad7SLin Ling vdev, ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &c);
1080fbfd10ffStalley if (result != 0) {
1081fbfd10ffStalley zjni_throw_exception(env,
1082fbfd10ffStalley "could not retrieve virtual device statistics");
1083fbfd10ffStalley return (1);
1084fbfd10ffStalley }
1085fbfd10ffStalley
1086fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1087fbfd10ffStalley bean->method_setUsed, (jlong)vs->vs_alloc);
1088fbfd10ffStalley
1089fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1090fbfd10ffStalley bean->method_setSize, (jlong)vs->vs_space);
1091fbfd10ffStalley
1092a1a659aeStalley (*env)->CallVoidMethod(env, object->object,
1093a1a659aeStalley bean->method_setReplacementSize, (jlong)vs->vs_rsize);
1094a1a659aeStalley
1095fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1096fbfd10ffStalley bean->method_setReadBytes, (jlong)vs->vs_bytes[ZIO_TYPE_READ]);
1097fbfd10ffStalley
1098fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1099fbfd10ffStalley bean->method_setWriteBytes, (jlong)vs->vs_bytes[ZIO_TYPE_WRITE]);
1100fbfd10ffStalley
1101fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1102fbfd10ffStalley bean->method_setReadOperations, (jlong)vs->vs_ops[ZIO_TYPE_READ]);
1103fbfd10ffStalley
1104fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1105fbfd10ffStalley bean->method_setWriteOperations, (jlong)vs->vs_ops[ZIO_TYPE_WRITE]);
1106fbfd10ffStalley
1107fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1108fbfd10ffStalley bean->method_setReadErrors, (jlong)vs->vs_read_errors);
1109fbfd10ffStalley
1110fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1111fbfd10ffStalley bean->method_setWriteErrors, (jlong)vs->vs_write_errors);
1112fbfd10ffStalley
1113fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1114fbfd10ffStalley bean->method_setChecksumErrors, (jlong)vs->vs_checksum_errors);
1115fbfd10ffStalley
1116fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1117fbfd10ffStalley bean->method_setDeviceState,
1118fbfd10ffStalley zjni_vdev_state_to_obj(env, vs->vs_state));
1119fbfd10ffStalley
1120fbfd10ffStalley (*env)->CallVoidMethod(env, object->object,
1121fbfd10ffStalley bean->method_setDeviceStatus,
1122fbfd10ffStalley zjni_vdev_aux_to_obj(env, vs->vs_aux));
1123fbfd10ffStalley
1124fbfd10ffStalley return (0);
1125fbfd10ffStalley }
1126fbfd10ffStalley
1127fbfd10ffStalley /*
1128fbfd10ffStalley * Converts a pool_state_t to a Java PoolStats$PoolState object.
1129fbfd10ffStalley */
1130fbfd10ffStalley jobject
zjni_pool_state_to_obj(JNIEnv * env,pool_state_t state)1131fbfd10ffStalley zjni_pool_state_to_obj(JNIEnv *env, pool_state_t state)
1132fbfd10ffStalley {
1133fbfd10ffStalley return (zjni_int_to_enum(env, state,
1134fbfd10ffStalley ZFSJNI_PACKAGE_DATA "PoolStats$PoolState",
1135fbfd10ffStalley "POOL_STATE_ACTIVE", pool_state_map));
1136fbfd10ffStalley }
1137fbfd10ffStalley
1138fbfd10ffStalley /*
1139fbfd10ffStalley * Converts a zpool_status_t to a Java PoolStats$PoolStatus object.
1140fbfd10ffStalley */
1141fbfd10ffStalley jobject
zjni_pool_status_to_obj(JNIEnv * env,zpool_status_t status)1142fbfd10ffStalley zjni_pool_status_to_obj(JNIEnv *env, zpool_status_t status)
1143fbfd10ffStalley {
1144fbfd10ffStalley return (zjni_int_to_enum(env, status,
1145fbfd10ffStalley ZFSJNI_PACKAGE_DATA "PoolStats$PoolStatus",
1146fbfd10ffStalley "ZPOOL_STATUS_OK", zpool_status_map));
1147fbfd10ffStalley }
1148fbfd10ffStalley
1149c8e9ed14Stalley /*
1150c8e9ed14Stalley * Extern functions
1151c8e9ed14Stalley */
1152c8e9ed14Stalley
1153c8e9ed14Stalley /*
1154c8e9ed14Stalley * Iterates through each importable pool on the system. For each
1155c8e9ed14Stalley * importable pool, runs the given function with the given void as the
1156c8e9ed14Stalley * last arg.
1157c8e9ed14Stalley */
1158c8e9ed14Stalley int
zjni_ipool_iter(int argc,char ** argv,zjni_ipool_iter_f func,void * data)1159c8e9ed14Stalley zjni_ipool_iter(int argc, char **argv, zjni_ipool_iter_f func, void *data)
1160c8e9ed14Stalley {
1161*d8ab6e12SDon Brady nvlist_t *pools;
1162*d8ab6e12SDon Brady importargs_t iarg = { 0 };
1163*d8ab6e12SDon Brady
1164*d8ab6e12SDon Brady iarg.paths = argc;
1165*d8ab6e12SDon Brady iarg.path = argv;
1166*d8ab6e12SDon Brady iarg.can_be_active = B_TRUE;
1167*d8ab6e12SDon Brady
1168*d8ab6e12SDon Brady pools = zpool_search_import(g_zfs, &iarg, &libzfs_config_ops);
1169c8e9ed14Stalley
1170c8e9ed14Stalley if (pools != NULL) {
1171c8e9ed14Stalley nvpair_t *elem = NULL;
1172fbfd10ffStalley
1173c8e9ed14Stalley while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
1174c8e9ed14Stalley nvlist_t *config;
1175c8e9ed14Stalley
1176c8e9ed14Stalley if (nvpair_value_nvlist(elem, &config) != 0 ||
1177fbfd10ffStalley func(config, data)) {
1178c8e9ed14Stalley return (-1);
1179c8e9ed14Stalley }
1180c8e9ed14Stalley }
1181c8e9ed14Stalley }
1182c8e9ed14Stalley
1183c8e9ed14Stalley return (0);
1184c8e9ed14Stalley }
1185c8e9ed14Stalley
1186c8e9ed14Stalley char *
zjni_vdev_state_to_str(vdev_state_t state)1187*d8ab6e12SDon Brady zjni_vdev_state_to_str(vdev_state_t state)
1188*d8ab6e12SDon Brady {
1189fbfd10ffStalley return (find_field(vdev_state_map, state));
1190fbfd10ffStalley }
1191fbfd10ffStalley
1192fbfd10ffStalley char *
zjni_vdev_aux_to_str(vdev_aux_t aux)1193*d8ab6e12SDon Brady zjni_vdev_aux_to_str(vdev_aux_t aux)
1194*d8ab6e12SDon Brady {
1195fbfd10ffStalley return (find_field(vdev_aux_map, aux));
1196fbfd10ffStalley }
1197c8e9ed14Stalley
1198fbfd10ffStalley char *
zjni_pool_state_to_str(pool_state_t state)1199*d8ab6e12SDon Brady zjni_pool_state_to_str(pool_state_t state)
1200*d8ab6e12SDon Brady {
1201fbfd10ffStalley return (find_field(pool_state_map, state));
1202fbfd10ffStalley }
1203fbfd10ffStalley
1204fbfd10ffStalley char *
zjni_pool_status_to_str(zpool_status_t status)1205*d8ab6e12SDon Brady zjni_pool_status_to_str(zpool_status_t status)
1206*d8ab6e12SDon Brady {
1207fbfd10ffStalley return (find_field(zpool_status_map, status));
1208c8e9ed14Stalley }
1209