#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 */
#endif
#include <linux/module.h>
+#include <sys/varargs.h>
#ifndef _KERNEL
#define _KERNEL __KERNEL__
#define NBBY 8
#define ENOTSUP ENOTSUPP
+#define MAXMSGLEN 256
#define MAXNAMELEN 256
#define MAXPATHLEN PATH_MAX
#define MAXOFFSET_T 0x7fffffffffffffffl
#define DEV_BSIZE 512
#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */
-#define __va_list va_list
#define max_ncpus 64
#define _NOTE(x)
--- /dev/null
+#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);