xref: /freebsd/sys/contrib/openzfs/module/nvpair/fnvpair.c (revision 22649d4dba730d46244fd2dff4fd174903c8379f)
1 // SPDX-License-Identifier: CDDL-1.0
2 /*
3  * This file and its contents are supplied under the terms of the
4  * Common Development and Distribution License ("CDDL"), version 1.0.
5  * You may only use this file in accordance with the terms of version
6  * 1.0 of the CDDL.
7  *
8  * A full copy of the text of the CDDL should have accompanied this
9  * source.  A copy of the CDDL is also available via the Internet at
10  * https://opensource.org/license/CDDL-1.0.
11  */
12 
13 /*
14  * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
15  */
16 
17 #include <sys/nvpair.h>
18 #include <sys/kmem.h>
19 #include <sys/debug.h>
20 #include <sys/param.h>
21 #ifndef _KERNEL
22 #include <stdlib.h>
23 #endif
24 
25 /*
26  * "Force" nvlist wrapper.
27  *
28  * These functions wrap the nvlist_* functions with assertions that assume
29  * the operation is successful.  This allows the caller's code to be much
30  * more readable, especially for the fnvlist_lookup_* and fnvpair_value_*
31  * functions, which can return the requested value (rather than filling in
32  * a pointer).
33  *
34  * These functions use NV_UNIQUE_NAME, encoding NV_ENCODE_NATIVE, and allocate
35  * with KM_SLEEP.
36  *
37  * More wrappers should be added as needed -- for example
38  * nvlist_lookup_*_array and nvpair_value_*_array.
39  */
40 
41 nvlist_t *
fnvlist_alloc(void)42 fnvlist_alloc(void)
43 {
44 	nvlist_t *nvl;
45 	VERIFY0(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP));
46 	return (nvl);
47 }
48 
49 void
fnvlist_free(nvlist_t * nvl)50 fnvlist_free(nvlist_t *nvl)
51 {
52 	nvlist_free(nvl);
53 }
54 
55 size_t
fnvlist_size(nvlist_t * nvl)56 fnvlist_size(nvlist_t *nvl)
57 {
58 	size_t size;
59 	VERIFY0(nvlist_size(nvl, &size, NV_ENCODE_NATIVE));
60 	return (size);
61 }
62 
63 /*
64  * Returns allocated buffer of size *sizep.  Caller must free the buffer with
65  * fnvlist_pack_free().
66  */
67 char *
fnvlist_pack(nvlist_t * nvl,size_t * sizep)68 fnvlist_pack(nvlist_t *nvl, size_t *sizep)
69 {
70 	char *packed = 0;
71 	VERIFY3U(nvlist_pack(nvl, &packed, sizep, NV_ENCODE_NATIVE,
72 	    KM_SLEEP), ==, 0);
73 	return (packed);
74 }
75 
76 void
fnvlist_pack_free(char * pack,size_t size)77 fnvlist_pack_free(char *pack, size_t size)
78 {
79 #ifdef _KERNEL
80 	kmem_free(pack, size);
81 #else
82 	(void) size;
83 	free(pack);
84 #endif
85 }
86 
87 nvlist_t *
fnvlist_unpack(char * buf,size_t buflen)88 fnvlist_unpack(char *buf, size_t buflen)
89 {
90 	nvlist_t *rv;
91 	VERIFY0(nvlist_unpack(buf, buflen, &rv, KM_SLEEP));
92 	return (rv);
93 }
94 
95 nvlist_t *
fnvlist_dup(const nvlist_t * nvl)96 fnvlist_dup(const nvlist_t *nvl)
97 {
98 	nvlist_t *rv;
99 	VERIFY0(nvlist_dup(nvl, &rv, KM_SLEEP));
100 	return (rv);
101 }
102 
103 void
fnvlist_merge(nvlist_t * dst,nvlist_t * src)104 fnvlist_merge(nvlist_t *dst, nvlist_t *src)
105 {
106 	VERIFY0(nvlist_merge(dst, src, KM_SLEEP));
107 }
108 
109 size_t
fnvlist_num_pairs(nvlist_t * nvl)110 fnvlist_num_pairs(nvlist_t *nvl)
111 {
112 	size_t count = 0;
113 	nvpair_t *pair;
114 
115 	for (pair = nvlist_next_nvpair(nvl, 0); pair != NULL;
116 	    pair = nvlist_next_nvpair(nvl, pair))
117 		count++;
118 	return (count);
119 }
120 
121 void
fnvlist_add_boolean(nvlist_t * nvl,const char * name)122 fnvlist_add_boolean(nvlist_t *nvl, const char *name)
123 {
124 	VERIFY0(nvlist_add_boolean(nvl, name));
125 }
126 
127 void
fnvlist_add_boolean_value(nvlist_t * nvl,const char * name,boolean_t val)128 fnvlist_add_boolean_value(nvlist_t *nvl, const char *name, boolean_t val)
129 {
130 	VERIFY0(nvlist_add_boolean_value(nvl, name, val));
131 }
132 
133 void
fnvlist_add_byte(nvlist_t * nvl,const char * name,uchar_t val)134 fnvlist_add_byte(nvlist_t *nvl, const char *name, uchar_t val)
135 {
136 	VERIFY0(nvlist_add_byte(nvl, name, val));
137 }
138 
139 void
fnvlist_add_int8(nvlist_t * nvl,const char * name,int8_t val)140 fnvlist_add_int8(nvlist_t *nvl, const char *name, int8_t val)
141 {
142 	VERIFY0(nvlist_add_int8(nvl, name, val));
143 }
144 
145 void
fnvlist_add_uint8(nvlist_t * nvl,const char * name,uint8_t val)146 fnvlist_add_uint8(nvlist_t *nvl, const char *name, uint8_t val)
147 {
148 	VERIFY0(nvlist_add_uint8(nvl, name, val));
149 }
150 
151 void
fnvlist_add_int16(nvlist_t * nvl,const char * name,int16_t val)152 fnvlist_add_int16(nvlist_t *nvl, const char *name, int16_t val)
153 {
154 	VERIFY0(nvlist_add_int16(nvl, name, val));
155 }
156 
157 void
fnvlist_add_uint16(nvlist_t * nvl,const char * name,uint16_t val)158 fnvlist_add_uint16(nvlist_t *nvl, const char *name, uint16_t val)
159 {
160 	VERIFY0(nvlist_add_uint16(nvl, name, val));
161 }
162 
163 void
fnvlist_add_int32(nvlist_t * nvl,const char * name,int32_t val)164 fnvlist_add_int32(nvlist_t *nvl, const char *name, int32_t val)
165 {
166 	VERIFY0(nvlist_add_int32(nvl, name, val));
167 }
168 
169 void
fnvlist_add_uint32(nvlist_t * nvl,const char * name,uint32_t val)170 fnvlist_add_uint32(nvlist_t *nvl, const char *name, uint32_t val)
171 {
172 	VERIFY0(nvlist_add_uint32(nvl, name, val));
173 }
174 
175 void
fnvlist_add_int64(nvlist_t * nvl,const char * name,int64_t val)176 fnvlist_add_int64(nvlist_t *nvl, const char *name, int64_t val)
177 {
178 	VERIFY0(nvlist_add_int64(nvl, name, val));
179 }
180 
181 void
fnvlist_add_uint64(nvlist_t * nvl,const char * name,uint64_t val)182 fnvlist_add_uint64(nvlist_t *nvl, const char *name, uint64_t val)
183 {
184 	VERIFY0(nvlist_add_uint64(nvl, name, val));
185 }
186 
187 void
fnvlist_add_string(nvlist_t * nvl,const char * name,const char * val)188 fnvlist_add_string(nvlist_t *nvl, const char *name, const char *val)
189 {
190 	VERIFY0(nvlist_add_string(nvl, name, val));
191 }
192 
193 void
fnvlist_add_nvlist(nvlist_t * nvl,const char * name,nvlist_t * val)194 fnvlist_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val)
195 {
196 	VERIFY0(nvlist_add_nvlist(nvl, name, val));
197 }
198 
199 void
fnvlist_add_nvpair(nvlist_t * nvl,nvpair_t * pair)200 fnvlist_add_nvpair(nvlist_t *nvl, nvpair_t *pair)
201 {
202 	VERIFY0(nvlist_add_nvpair(nvl, pair));
203 }
204 
205 void
fnvlist_add_boolean_array(nvlist_t * nvl,const char * name,const boolean_t * val,uint_t n)206 fnvlist_add_boolean_array(nvlist_t *nvl, const char *name,
207     const boolean_t *val, uint_t n)
208 {
209 	VERIFY0(nvlist_add_boolean_array(nvl, name, val, n));
210 }
211 
212 void
fnvlist_add_byte_array(nvlist_t * nvl,const char * name,const uchar_t * val,uint_t n)213 fnvlist_add_byte_array(nvlist_t *nvl, const char *name, const uchar_t *val,
214     uint_t n)
215 {
216 	VERIFY0(nvlist_add_byte_array(nvl, name, val, n));
217 }
218 
219 void
fnvlist_add_int8_array(nvlist_t * nvl,const char * name,const int8_t * val,uint_t n)220 fnvlist_add_int8_array(nvlist_t *nvl, const char *name, const int8_t *val,
221     uint_t n)
222 {
223 	VERIFY0(nvlist_add_int8_array(nvl, name, val, n));
224 }
225 
226 void
fnvlist_add_uint8_array(nvlist_t * nvl,const char * name,const uint8_t * val,uint_t n)227 fnvlist_add_uint8_array(nvlist_t *nvl, const char *name, const uint8_t *val,
228     uint_t n)
229 {
230 	VERIFY0(nvlist_add_uint8_array(nvl, name, val, n));
231 }
232 
233 void
fnvlist_add_int16_array(nvlist_t * nvl,const char * name,const int16_t * val,uint_t n)234 fnvlist_add_int16_array(nvlist_t *nvl, const char *name, const int16_t *val,
235     uint_t n)
236 {
237 	VERIFY0(nvlist_add_int16_array(nvl, name, val, n));
238 }
239 
240 void
fnvlist_add_uint16_array(nvlist_t * nvl,const char * name,const uint16_t * val,uint_t n)241 fnvlist_add_uint16_array(nvlist_t *nvl, const char *name,
242     const uint16_t *val, uint_t n)
243 {
244 	VERIFY0(nvlist_add_uint16_array(nvl, name, val, n));
245 }
246 
247 void
fnvlist_add_int32_array(nvlist_t * nvl,const char * name,const int32_t * val,uint_t n)248 fnvlist_add_int32_array(nvlist_t *nvl, const char *name, const int32_t *val,
249     uint_t n)
250 {
251 	VERIFY0(nvlist_add_int32_array(nvl, name, val, n));
252 }
253 
254 void
fnvlist_add_uint32_array(nvlist_t * nvl,const char * name,const uint32_t * val,uint_t n)255 fnvlist_add_uint32_array(nvlist_t *nvl, const char *name,
256     const uint32_t *val, uint_t n)
257 {
258 	VERIFY0(nvlist_add_uint32_array(nvl, name, val, n));
259 }
260 
261 void
fnvlist_add_int64_array(nvlist_t * nvl,const char * name,const int64_t * val,uint_t n)262 fnvlist_add_int64_array(nvlist_t *nvl, const char *name, const int64_t *val,
263     uint_t n)
264 {
265 	VERIFY0(nvlist_add_int64_array(nvl, name, val, n));
266 }
267 
268 void
fnvlist_add_uint64_array(nvlist_t * nvl,const char * name,const uint64_t * val,uint_t n)269 fnvlist_add_uint64_array(nvlist_t *nvl, const char *name,
270     const uint64_t *val, uint_t n)
271 {
272 	VERIFY0(nvlist_add_uint64_array(nvl, name, val, n));
273 }
274 
275 void
fnvlist_add_string_array(nvlist_t * nvl,const char * name,const char * const * val,uint_t n)276 fnvlist_add_string_array(nvlist_t *nvl, const char *name,
277     const char * const *val, uint_t n)
278 {
279 	VERIFY0(nvlist_add_string_array(nvl, name, val, n));
280 }
281 
282 void
fnvlist_add_nvlist_array(nvlist_t * nvl,const char * name,const nvlist_t * const * val,uint_t n)283 fnvlist_add_nvlist_array(nvlist_t *nvl, const char *name,
284     const nvlist_t * const *val, uint_t n)
285 {
286 	VERIFY0(nvlist_add_nvlist_array(nvl, name, val, n));
287 }
288 
289 void
fnvlist_remove(nvlist_t * nvl,const char * name)290 fnvlist_remove(nvlist_t *nvl, const char *name)
291 {
292 	VERIFY0(nvlist_remove_all(nvl, name));
293 }
294 
295 void
fnvlist_remove_nvpair(nvlist_t * nvl,nvpair_t * pair)296 fnvlist_remove_nvpair(nvlist_t *nvl, nvpair_t *pair)
297 {
298 	VERIFY0(nvlist_remove_nvpair(nvl, pair));
299 }
300 
301 nvpair_t *
fnvlist_lookup_nvpair(nvlist_t * nvl,const char * name)302 fnvlist_lookup_nvpair(nvlist_t *nvl, const char *name)
303 {
304 	nvpair_t *rv;
305 	VERIFY0(nvlist_lookup_nvpair(nvl, name, &rv));
306 	return (rv);
307 }
308 
309 /* returns B_TRUE if the entry exists */
310 boolean_t
fnvlist_lookup_boolean(const nvlist_t * nvl,const char * name)311 fnvlist_lookup_boolean(const nvlist_t *nvl, const char *name)
312 {
313 	return (nvlist_lookup_boolean(nvl, name) == 0);
314 }
315 
316 boolean_t
fnvlist_lookup_boolean_value(const nvlist_t * nvl,const char * name)317 fnvlist_lookup_boolean_value(const nvlist_t *nvl, const char *name)
318 {
319 	boolean_t rv;
320 	VERIFY0(nvlist_lookup_boolean_value(nvl, name, &rv));
321 	return (rv);
322 }
323 
324 uchar_t
fnvlist_lookup_byte(const nvlist_t * nvl,const char * name)325 fnvlist_lookup_byte(const nvlist_t *nvl, const char *name)
326 {
327 	uchar_t rv;
328 	VERIFY0(nvlist_lookup_byte(nvl, name, &rv));
329 	return (rv);
330 }
331 
332 int8_t
fnvlist_lookup_int8(const nvlist_t * nvl,const char * name)333 fnvlist_lookup_int8(const nvlist_t *nvl, const char *name)
334 {
335 	int8_t rv;
336 	VERIFY0(nvlist_lookup_int8(nvl, name, &rv));
337 	return (rv);
338 }
339 
340 int16_t
fnvlist_lookup_int16(const nvlist_t * nvl,const char * name)341 fnvlist_lookup_int16(const nvlist_t *nvl, const char *name)
342 {
343 	int16_t rv;
344 	VERIFY0(nvlist_lookup_int16(nvl, name, &rv));
345 	return (rv);
346 }
347 
348 int32_t
fnvlist_lookup_int32(const nvlist_t * nvl,const char * name)349 fnvlist_lookup_int32(const nvlist_t *nvl, const char *name)
350 {
351 	int32_t rv;
352 	VERIFY0(nvlist_lookup_int32(nvl, name, &rv));
353 	return (rv);
354 }
355 
356 int64_t
fnvlist_lookup_int64(const nvlist_t * nvl,const char * name)357 fnvlist_lookup_int64(const nvlist_t *nvl, const char *name)
358 {
359 	int64_t rv;
360 	VERIFY0(nvlist_lookup_int64(nvl, name, &rv));
361 	return (rv);
362 }
363 
364 uint8_t
fnvlist_lookup_uint8(const nvlist_t * nvl,const char * name)365 fnvlist_lookup_uint8(const nvlist_t *nvl, const char *name)
366 {
367 	uint8_t rv;
368 	VERIFY0(nvlist_lookup_uint8(nvl, name, &rv));
369 	return (rv);
370 }
371 
372 uint16_t
fnvlist_lookup_uint16(const nvlist_t * nvl,const char * name)373 fnvlist_lookup_uint16(const nvlist_t *nvl, const char *name)
374 {
375 	uint16_t rv;
376 	VERIFY0(nvlist_lookup_uint16(nvl, name, &rv));
377 	return (rv);
378 }
379 
380 uint32_t
fnvlist_lookup_uint32(const nvlist_t * nvl,const char * name)381 fnvlist_lookup_uint32(const nvlist_t *nvl, const char *name)
382 {
383 	uint32_t rv;
384 	VERIFY0(nvlist_lookup_uint32(nvl, name, &rv));
385 	return (rv);
386 }
387 
388 uint64_t
fnvlist_lookup_uint64(const nvlist_t * nvl,const char * name)389 fnvlist_lookup_uint64(const nvlist_t *nvl, const char *name)
390 {
391 	uint64_t rv;
392 	VERIFY0(nvlist_lookup_uint64(nvl, name, &rv));
393 	return (rv);
394 }
395 
396 const char *
fnvlist_lookup_string(const nvlist_t * nvl,const char * name)397 fnvlist_lookup_string(const nvlist_t *nvl, const char *name)
398 {
399 	const char *rv;
400 	VERIFY0(nvlist_lookup_string(nvl, name, &rv));
401 	return (rv);
402 }
403 
404 nvlist_t *
fnvlist_lookup_nvlist(nvlist_t * nvl,const char * name)405 fnvlist_lookup_nvlist(nvlist_t *nvl, const char *name)
406 {
407 	nvlist_t *rv;
408 	VERIFY0(nvlist_lookup_nvlist(nvl, name, &rv));
409 	return (rv);
410 }
411 boolean_t *
fnvlist_lookup_boolean_array(nvlist_t * nvl,const char * name,uint_t * n)412 fnvlist_lookup_boolean_array(nvlist_t *nvl, const char *name, uint_t *n)
413 {
414 	boolean_t *rv;
415 	VERIFY0(nvlist_lookup_boolean_array(nvl, name, &rv, n));
416 	return (rv);
417 }
418 
419 uchar_t *
fnvlist_lookup_byte_array(nvlist_t * nvl,const char * name,uint_t * n)420 fnvlist_lookup_byte_array(nvlist_t *nvl, const char *name, uint_t *n)
421 {
422 	uchar_t *rv;
423 	VERIFY0(nvlist_lookup_byte_array(nvl, name, &rv, n));
424 	return (rv);
425 }
426 
427 int8_t *
fnvlist_lookup_int8_array(nvlist_t * nvl,const char * name,uint_t * n)428 fnvlist_lookup_int8_array(nvlist_t *nvl, const char *name, uint_t *n)
429 {
430 	int8_t *rv;
431 	VERIFY0(nvlist_lookup_int8_array(nvl, name, &rv, n));
432 	return (rv);
433 }
434 
435 uint8_t *
fnvlist_lookup_uint8_array(nvlist_t * nvl,const char * name,uint_t * n)436 fnvlist_lookup_uint8_array(nvlist_t *nvl, const char *name, uint_t *n)
437 {
438 	uint8_t *rv;
439 	VERIFY0(nvlist_lookup_uint8_array(nvl, name, &rv, n));
440 	return (rv);
441 }
442 
443 int16_t *
fnvlist_lookup_int16_array(nvlist_t * nvl,const char * name,uint_t * n)444 fnvlist_lookup_int16_array(nvlist_t *nvl, const char *name, uint_t *n)
445 {
446 	int16_t *rv;
447 	VERIFY0(nvlist_lookup_int16_array(nvl, name, &rv, n));
448 	return (rv);
449 }
450 
451 uint16_t *
fnvlist_lookup_uint16_array(nvlist_t * nvl,const char * name,uint_t * n)452 fnvlist_lookup_uint16_array(nvlist_t *nvl, const char *name, uint_t *n)
453 {
454 	uint16_t *rv;
455 	VERIFY0(nvlist_lookup_uint16_array(nvl, name, &rv, n));
456 	return (rv);
457 }
458 
459 int32_t *
fnvlist_lookup_int32_array(nvlist_t * nvl,const char * name,uint_t * n)460 fnvlist_lookup_int32_array(nvlist_t *nvl, const char *name, uint_t *n)
461 {
462 	int32_t *rv;
463 	VERIFY0(nvlist_lookup_int32_array(nvl, name, &rv, n));
464 	return (rv);
465 }
466 
467 uint32_t *
fnvlist_lookup_uint32_array(nvlist_t * nvl,const char * name,uint_t * n)468 fnvlist_lookup_uint32_array(nvlist_t *nvl, const char *name, uint_t *n)
469 {
470 	uint32_t *rv;
471 	VERIFY0(nvlist_lookup_uint32_array(nvl, name, &rv, n));
472 	return (rv);
473 }
474 
475 int64_t *
fnvlist_lookup_int64_array(nvlist_t * nvl,const char * name,uint_t * n)476 fnvlist_lookup_int64_array(nvlist_t *nvl, const char *name, uint_t *n)
477 {
478 	int64_t *rv;
479 	VERIFY0(nvlist_lookup_int64_array(nvl, name, &rv, n));
480 	return (rv);
481 }
482 
483 uint64_t *
fnvlist_lookup_uint64_array(nvlist_t * nvl,const char * name,uint_t * n)484 fnvlist_lookup_uint64_array(nvlist_t *nvl, const char *name, uint_t *n)
485 {
486 	uint64_t *rv;
487 	VERIFY0(nvlist_lookup_uint64_array(nvl, name, &rv, n));
488 	return (rv);
489 }
490 
491 boolean_t
fnvpair_value_boolean_value(const nvpair_t * nvp)492 fnvpair_value_boolean_value(const nvpair_t *nvp)
493 {
494 	boolean_t rv;
495 	VERIFY0(nvpair_value_boolean_value(nvp, &rv));
496 	return (rv);
497 }
498 
499 uchar_t
fnvpair_value_byte(const nvpair_t * nvp)500 fnvpair_value_byte(const nvpair_t *nvp)
501 {
502 	uchar_t rv;
503 	VERIFY0(nvpair_value_byte(nvp, &rv));
504 	return (rv);
505 }
506 
507 int8_t
fnvpair_value_int8(const nvpair_t * nvp)508 fnvpair_value_int8(const nvpair_t *nvp)
509 {
510 	int8_t rv;
511 	VERIFY0(nvpair_value_int8(nvp, &rv));
512 	return (rv);
513 }
514 
515 int16_t
fnvpair_value_int16(const nvpair_t * nvp)516 fnvpair_value_int16(const nvpair_t *nvp)
517 {
518 	int16_t rv;
519 	VERIFY0(nvpair_value_int16(nvp, &rv));
520 	return (rv);
521 }
522 
523 int32_t
fnvpair_value_int32(const nvpair_t * nvp)524 fnvpair_value_int32(const nvpair_t *nvp)
525 {
526 	int32_t rv;
527 	VERIFY0(nvpair_value_int32(nvp, &rv));
528 	return (rv);
529 }
530 
531 int64_t
fnvpair_value_int64(const nvpair_t * nvp)532 fnvpair_value_int64(const nvpair_t *nvp)
533 {
534 	int64_t rv;
535 	VERIFY0(nvpair_value_int64(nvp, &rv));
536 	return (rv);
537 }
538 
539 uint8_t
fnvpair_value_uint8(const nvpair_t * nvp)540 fnvpair_value_uint8(const nvpair_t *nvp)
541 {
542 	uint8_t rv;
543 	VERIFY0(nvpair_value_uint8(nvp, &rv));
544 	return (rv);
545 }
546 
547 uint16_t
fnvpair_value_uint16(const nvpair_t * nvp)548 fnvpair_value_uint16(const nvpair_t *nvp)
549 {
550 	uint16_t rv;
551 	VERIFY0(nvpair_value_uint16(nvp, &rv));
552 	return (rv);
553 }
554 
555 uint32_t
fnvpair_value_uint32(const nvpair_t * nvp)556 fnvpair_value_uint32(const nvpair_t *nvp)
557 {
558 	uint32_t rv;
559 	VERIFY0(nvpair_value_uint32(nvp, &rv));
560 	return (rv);
561 }
562 
563 uint64_t
fnvpair_value_uint64(const nvpair_t * nvp)564 fnvpair_value_uint64(const nvpair_t *nvp)
565 {
566 	uint64_t rv;
567 	VERIFY0(nvpair_value_uint64(nvp, &rv));
568 	return (rv);
569 }
570 
571 const char *
fnvpair_value_string(const nvpair_t * nvp)572 fnvpair_value_string(const nvpair_t *nvp)
573 {
574 	const char *rv;
575 	VERIFY0(nvpair_value_string(nvp, &rv));
576 	return (rv);
577 }
578 
579 nvlist_t *
fnvpair_value_nvlist(nvpair_t * nvp)580 fnvpair_value_nvlist(nvpair_t *nvp)
581 {
582 	nvlist_t *rv;
583 	VERIFY0(nvpair_value_nvlist(nvp, &rv));
584 	return (rv);
585 }
586 
587 #if defined(_KERNEL)
588 
589 EXPORT_SYMBOL(fnvlist_alloc);
590 EXPORT_SYMBOL(fnvlist_free);
591 EXPORT_SYMBOL(fnvlist_size);
592 EXPORT_SYMBOL(fnvlist_pack);
593 EXPORT_SYMBOL(fnvlist_pack_free);
594 EXPORT_SYMBOL(fnvlist_unpack);
595 EXPORT_SYMBOL(fnvlist_dup);
596 EXPORT_SYMBOL(fnvlist_merge);
597 
598 EXPORT_SYMBOL(fnvlist_add_nvpair);
599 EXPORT_SYMBOL(fnvlist_add_boolean);
600 EXPORT_SYMBOL(fnvlist_add_boolean_value);
601 EXPORT_SYMBOL(fnvlist_add_byte);
602 EXPORT_SYMBOL(fnvlist_add_int8);
603 EXPORT_SYMBOL(fnvlist_add_uint8);
604 EXPORT_SYMBOL(fnvlist_add_int16);
605 EXPORT_SYMBOL(fnvlist_add_uint16);
606 EXPORT_SYMBOL(fnvlist_add_int32);
607 EXPORT_SYMBOL(fnvlist_add_uint32);
608 EXPORT_SYMBOL(fnvlist_add_int64);
609 EXPORT_SYMBOL(fnvlist_add_uint64);
610 EXPORT_SYMBOL(fnvlist_add_string);
611 EXPORT_SYMBOL(fnvlist_add_nvlist);
612 EXPORT_SYMBOL(fnvlist_add_boolean_array);
613 EXPORT_SYMBOL(fnvlist_add_byte_array);
614 EXPORT_SYMBOL(fnvlist_add_int8_array);
615 EXPORT_SYMBOL(fnvlist_add_uint8_array);
616 EXPORT_SYMBOL(fnvlist_add_int16_array);
617 EXPORT_SYMBOL(fnvlist_add_uint16_array);
618 EXPORT_SYMBOL(fnvlist_add_int32_array);
619 EXPORT_SYMBOL(fnvlist_add_uint32_array);
620 EXPORT_SYMBOL(fnvlist_add_int64_array);
621 EXPORT_SYMBOL(fnvlist_add_uint64_array);
622 EXPORT_SYMBOL(fnvlist_add_string_array);
623 EXPORT_SYMBOL(fnvlist_add_nvlist_array);
624 
625 EXPORT_SYMBOL(fnvlist_remove);
626 EXPORT_SYMBOL(fnvlist_remove_nvpair);
627 
628 EXPORT_SYMBOL(fnvlist_lookup_nvpair);
629 EXPORT_SYMBOL(fnvlist_lookup_boolean);
630 EXPORT_SYMBOL(fnvlist_lookup_boolean_value);
631 EXPORT_SYMBOL(fnvlist_lookup_byte);
632 EXPORT_SYMBOL(fnvlist_lookup_int8);
633 EXPORT_SYMBOL(fnvlist_lookup_uint8);
634 EXPORT_SYMBOL(fnvlist_lookup_int16);
635 EXPORT_SYMBOL(fnvlist_lookup_uint16);
636 EXPORT_SYMBOL(fnvlist_lookup_int32);
637 EXPORT_SYMBOL(fnvlist_lookup_uint32);
638 EXPORT_SYMBOL(fnvlist_lookup_int64);
639 EXPORT_SYMBOL(fnvlist_lookup_uint64);
640 EXPORT_SYMBOL(fnvlist_lookup_string);
641 EXPORT_SYMBOL(fnvlist_lookup_nvlist);
642 
643 EXPORT_SYMBOL(fnvpair_value_boolean_value);
644 EXPORT_SYMBOL(fnvpair_value_byte);
645 EXPORT_SYMBOL(fnvpair_value_int8);
646 EXPORT_SYMBOL(fnvpair_value_uint8);
647 EXPORT_SYMBOL(fnvpair_value_int16);
648 EXPORT_SYMBOL(fnvpair_value_uint16);
649 EXPORT_SYMBOL(fnvpair_value_int32);
650 EXPORT_SYMBOL(fnvpair_value_uint32);
651 EXPORT_SYMBOL(fnvpair_value_int64);
652 EXPORT_SYMBOL(fnvpair_value_uint64);
653 EXPORT_SYMBOL(fnvpair_value_string);
654 EXPORT_SYMBOL(fnvpair_value_nvlist);
655 EXPORT_SYMBOL(fnvlist_num_pairs);
656 
657 #endif
658