summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sys/cmn_err.h12
-rw-r--r--include/sys/sysmacros.h3
-rw-r--r--include/sys/varargs.h2
-rw-r--r--modules/spl/Makefile.in1
-rw-r--r--modules/spl/spl-err.c45
5 files changed, 62 insertions, 1 deletions
diff --git a/include/sys/cmn_err.h b/include/sys/cmn_err.h
index 44ccefc9f..c76e4f465 100644
--- a/include/sys/cmn_err.h
+++ b/include/sys/cmn_err.h
@@ -1,4 +1,16 @@
#ifndef _SPL_CMN_ERR_H
#define _SPL_CMN_ERR_H
+#include <sys/varargs.h>
+
+#define CE_CONT 0 /* continuation */
+#define CE_NOTE 1 /* notice */
+#define CE_WARN 2 /* warning */
+#define CE_PANIC 3 /* panic */
+#define CE_IGNORE 4 /* print nothing */
+
+extern void cmn_err(int, const char *, ...);
+extern void vcmn_err(int, const char *, __va_list);
+extern void vpanic(const char *, __va_list);
+
#endif /* SPL_CMN_ERR_H */
diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h
index b65a5797c..08d0e1971 100644
--- a/include/sys/sysmacros.h
+++ b/include/sys/sysmacros.h
@@ -6,6 +6,7 @@ extern "C" {
#endif
#include <linux/module.h>
+#include <sys/varargs.h>
#ifndef _KERNEL
#define _KERNEL __KERNEL__
@@ -28,6 +29,7 @@ extern "C" {
#define NBBY 8
#define ENOTSUP ENOTSUPP
+#define MAXMSGLEN 256
#define MAXNAMELEN 256
#define MAXPATHLEN PATH_MAX
#define MAXOFFSET_T 0x7fffffffffffffffl
@@ -36,7 +38,6 @@ extern "C" {
#define DEV_BSIZE 512
#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */
-#define __va_list va_list
#define max_ncpus 64
#define _NOTE(x)
diff --git a/include/sys/varargs.h b/include/sys/varargs.h
index 5a5444360..056967eaa 100644
--- a/include/sys/varargs.h
+++ b/include/sys/varargs.h
@@ -1,4 +1,6 @@
#ifndef _SPL_VARARGS_H
#define _SPL_VARARGS_H
+#define __va_list va_list
+
#endif /* SPL_VARARGS_H */
diff --git a/modules/spl/Makefile.in b/modules/spl/Makefile.in
index 667858aa9..1d152e61b 100644
--- a/modules/spl/Makefile.in
+++ b/modules/spl/Makefile.in
@@ -14,6 +14,7 @@ spl-objs += spl-thread.o
spl-objs += spl-taskq.o
spl-objs += spl-rwlock.o
spl-objs += spl-vnode.o
+spl-objs += spl-err.o
spl-objs += spl-generic.o
splmodule := spl.ko
diff --git a/modules/spl/spl-err.c b/modules/spl/spl-err.c
new file mode 100644
index 000000000..6641ff034
--- /dev/null
+++ b/modules/spl/spl-err.c
@@ -0,0 +1,45 @@
+#include <sys/sysmacros.h>
+#include <sys/cmn_err.h>
+#include "config.h"
+
+static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" };
+static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" };
+
+void
+vpanic(const char *fmt, va_list ap)
+{
+ char msg[MAXMSGLEN];
+
+ vsnprintf(msg, MAXMSGLEN - 1, fmt, ap);
+ panic(msg);
+} /* vpanic() */
+EXPORT_SYMBOL(vpanic);
+
+void
+cmn_err(int ce, const char *fmt, ...)
+{
+ char msg[MAXMSGLEN];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(msg, MAXMSGLEN - 1, fmt, ap);
+ va_end(ap);
+
+ printk("%s", msg);
+} /* cmn_err() */
+EXPORT_SYMBOL(cmn_err);
+
+void
+vcmn_err(int ce, const char *fmt, va_list ap)
+{
+ char msg[MAXMSGLEN];
+
+ if (ce == CE_PANIC)
+ vpanic(fmt, ap);
+
+ if (ce != CE_NOTE) { /* suppress noise in stress testing */
+ vsnprintf(msg, MAXMSGLEN - 1, fmt, ap);
+ printk("%s%s%s", ce_prefix[ce], msg, ce_suffix[ce]);
+ }
+} /* vcmn_err() */
+EXPORT_SYMBOL(vcmn_err);