]> granicus.if.org Git - spl/commitdiff
Add kmem_vasprintf function
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 24 Jun 2010 16:41:59 +0000 (09:41 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 24 Jun 2010 16:41:59 +0000 (09:41 -0700)
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().

include/sys/kmem.h
module/spl/spl-kmem.c

index a5ee4e0df2d7874dc7c3f7573d30d3286825c253..9688b116df12242eacc2aad3fa09ec452742131b 100644 (file)
@@ -248,6 +248,7 @@ enum {
 #define KMC_DEFAULT_SEEKS              1
 
 extern int kmem_debugging(void);
+extern char *kmem_vasprintf(const char *fmt, va_list ap);
 extern char *kmem_asprintf(const char *fmt, ...);
 #define strfree(str)           kfree(str)
 #define strdup(str)            kstrdup(str, GFP_KERNEL)
index 4620eb9bf9822f86f15eea18bf0c0b443083d48f..a348021d88ac3c4d5df4e5fa7894914daac6488c 100644 (file)
@@ -238,17 +238,33 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
 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;
 }