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