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