aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2010-06-24 09:41:59 -0700
committerBrian Behlendorf <[email protected]>2010-06-24 09:41:59 -0700
commite6de04b73cfaa1b17eee531d472cbbd37c247502 (patch)
tree88f515ee9b834209c9cc914868959cec64828742 /module
parent438683c0a9c9a045106f27aca85dc1855d926497 (diff)
Add kmem_vasprintf function
We might as well have both asprintf() variants. This allows us to safely pass a va_list through several levels of the stack using va_copy() instead of va_start().
Diffstat (limited to 'module')
-rw-r--r--module/spl/spl-kmem.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
index 4620eb9bf..a348021d8 100644
--- a/module/spl/spl-kmem.c
+++ b/module/spl/spl-kmem.c
@@ -239,16 +239,32 @@ EXPORT_SYMBOL(kvasprintf);
#endif /* HAVE_KVASPRINTF */
char *
+kmem_vasprintf(const char *fmt, va_list ap)
+{
+ va_list aq;
+ char *ptr;
+
+ va_copy(aq, ap);
+ do {
+ ptr = kvasprintf(GFP_KERNEL, fmt, aq);
+ } while (ptr == NULL);
+ va_end(aq);
+
+ return ptr;
+}
+EXPORT_SYMBOL(kmem_vasprintf);
+
+char *
kmem_asprintf(const char *fmt, ...)
{
- va_list args;
+ va_list ap;
char *ptr;
- va_start(args, fmt);
+ va_start(ap, fmt);
do {
- ptr = kvasprintf(GFP_KERNEL, fmt, args);
+ ptr = kvasprintf(GFP_KERNEL, fmt, ap);
} while (ptr == NULL);
- va_end(args);
+ va_end(ap);
return ptr;
}