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