From ac0340970c8f548a97f3c3c1e9c6fc7b60efd824 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 19 Dec 2013 14:30:11 -0800 Subject: [PATCH] Register correct handlers for nvlist_{dup,pack,unpack} This change is related to commit 81eaf15 which ensured the correct allocation handlers were installed for nvlist_alloc(). The nvlist functions nvlist_dup(), nvlist_pack(), and nvlist_unpack() suffer from the same issue and have been updated accordingly. Signed-off-by: Ned Bass Signed-off-by: Brian Behlendorf Issue #1937 --- module/nvpair/nvpair.c | 57 ++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/module/nvpair/nvpair.c b/module/nvpair/nvpair.c index ff85d0251..550356c58 100644 --- a/module/nvpair/nvpair.c +++ b/module/nvpair/nvpair.c @@ -262,32 +262,30 @@ nvlist_nvflag(nvlist_t *nvl) return (nvl->nvl_nvflag); } -/* - * nvlist_alloc - Allocate nvlist. - */ -/*ARGSUSED1*/ -int -nvlist_alloc(nvlist_t **nvlp, uint_t nvflag, int kmflag) +static nv_alloc_t * +nvlist_nv_alloc(int kmflag) { - nv_alloc_t *nva = nv_alloc_nosleep; - #if defined(_KERNEL) && !defined(_BOOT) switch (kmflag) { case KM_SLEEP: - nva = nv_alloc_sleep; - break; + return (nv_alloc_sleep); case KM_PUSHPAGE: - nva = nv_alloc_pushpage; - break; - case KM_NOSLEEP: - nva = nv_alloc_nosleep; - break; + return (nv_alloc_pushpage); default: - return (EINVAL); + return (nv_alloc_nosleep); } -#endif +#else + return (nv_alloc_nosleep); +#endif /* _KERNEL && !_BOOT */ +} - return (nvlist_xalloc(nvlp, nvflag, nva)); +/* + * nvlist_alloc - Allocate nvlist. + */ +int +nvlist_alloc(nvlist_t **nvlp, uint_t nvflag, int kmflag) +{ + return (nvlist_xalloc(nvlp, nvflag, nvlist_nv_alloc(kmflag))); } int @@ -614,16 +612,10 @@ nvlist_contains_nvp(nvlist_t *nvl, nvpair_t *nvp) /* * Make a copy of nvlist */ -/*ARGSUSED1*/ int nvlist_dup(nvlist_t *nvl, nvlist_t **nvlp, int kmflag) { -#if defined(_KERNEL) && !defined(_BOOT) - return (nvlist_xdup(nvl, nvlp, - (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep))); -#else - return (nvlist_xdup(nvl, nvlp, nv_alloc_nosleep)); -#endif + return (nvlist_xdup(nvl, nvlp, nvlist_nv_alloc(kmflag))); } int @@ -2352,17 +2344,12 @@ nvlist_size(nvlist_t *nvl, size_t *size, int encoding) /* * Pack nvlist into contiguous memory */ -/*ARGSUSED1*/ int nvlist_pack(nvlist_t *nvl, char **bufp, size_t *buflen, int encoding, int kmflag) { -#if defined(_KERNEL) && !defined(_BOOT) return (nvlist_xpack(nvl, bufp, buflen, encoding, - (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep))); -#else - return (nvlist_xpack(nvl, bufp, buflen, encoding, nv_alloc_nosleep)); -#endif + nvlist_nv_alloc(kmflag))); } int @@ -2415,16 +2402,10 @@ nvlist_xpack(nvlist_t *nvl, char **bufp, size_t *buflen, int encoding, /* * Unpack buf into an nvlist_t */ -/*ARGSUSED1*/ int nvlist_unpack(char *buf, size_t buflen, nvlist_t **nvlp, int kmflag) { -#if defined(_KERNEL) && !defined(_BOOT) - return (nvlist_xunpack(buf, buflen, nvlp, - (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep))); -#else - return (nvlist_xunpack(buf, buflen, nvlp, nv_alloc_nosleep)); -#endif + return (nvlist_xunpack(buf, buflen, nvlp, nvlist_nv_alloc(kmflag))); } int