diff --git a/include/sys/cmn_err.h b/include/sys/cmn_err.h index 44ccefc9f1..c76e4f465c 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 + +#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 b65a5797c2..08d0e19711 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -6,6 +6,7 @@ extern "C" { #endif #include +#include #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 5a54443609..056967eaae 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 667858aa93..1d152e61b3 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 0000000000..6641ff034d --- /dev/null +++ b/modules/spl/spl-err.c @@ -0,0 +1,45 @@ +#include +#include +#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);