|
@@ -31,6 +31,22 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
|
|
|
}
|
|
|
EXPORT_SYMBOL(kvasprintf);
|
|
|
|
|
|
+/*
|
|
|
+ * If fmt contains no % (or is exactly %s), use kstrdup_const. If fmt
|
|
|
+ * (or the sole vararg) points to rodata, we will then save a memory
|
|
|
+ * allocation and string copy. In any case, the return value should be
|
|
|
+ * freed using kfree_const().
|
|
|
+ */
|
|
|
+const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list ap)
|
|
|
+{
|
|
|
+ if (!strchr(fmt, '%'))
|
|
|
+ return kstrdup_const(fmt, gfp);
|
|
|
+ if (!strcmp(fmt, "%s"))
|
|
|
+ return kstrdup_const(va_arg(ap, const char*), gfp);
|
|
|
+ return kvasprintf(gfp, fmt, ap);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(kvasprintf_const);
|
|
|
+
|
|
|
char *kasprintf(gfp_t gfp, const char *fmt, ...)
|
|
|
{
|
|
|
va_list ap;
|