diff options
author | Tim Chase <[email protected]> | 2014-06-18 15:22:50 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-07-01 15:14:43 -0700 |
commit | f6a869614e5bdf9a3819a845f7a90d8c9ede0fc3 (patch) | |
tree | 654e11a1b882e9f8346f3398215e0285fb3c74b5 /module | |
parent | 31cb5383bff0fddc5058973e32a6f2c446d45e59 (diff) |
Safer debugging and assertion macros.
Spl's debugging and assertion macros macro used the typical do/while(0)
form for if/else friendliness, however, this limits their use in contexts
where a do loop is not valid; such as within another multi-statement
style macro.
The following macros have been converted to not use do/while(0):
PANIC, ASSERT, ASSERTF, VERIFY, VERIFY3_IMPL
PANIC has been converted to a wrapper around the new spl_PANIC() function.
The other macros have been converted to use the "&&" operator for the
branch-predicition conditional and also to use spl_PANIC().
The __ASSERT() macro was not touched. It is only used by the debugging
infrastructure and that code, including this macro, will be retired when
the tracepoint patches are merged.
Signed-off-by: Tim Chase <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #367
Diffstat (limited to 'module')
-rw-r--r-- | module/spl/spl-err.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/module/spl/spl-err.c b/module/spl/spl-err.c index b6d15f019..2706f9bd1 100644 --- a/module/spl/spl-err.c +++ b/module/spl/spl-err.c @@ -39,6 +39,27 @@ static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" }; static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" }; #endif +int +spl_PANIC(char *filename, const char *functionname, + int lineno, const char *fmt, ...) { + char msg[MAXMSGLEN]; + va_list ap; + + va_start(ap, fmt); + if (vsnprintf(msg, sizeof (msg), fmt, ap) == sizeof (msg)) + msg[sizeof (msg) - 1] = '\0'; + va_end(ap); +#ifdef NDEBUG + printk(KERN_EMERG "%s", msg); +#else + spl_debug_msg(NULL, 0, 0, + filename, functionname, lineno, "%s", msg); +#endif + spl_debug_bug(filename, functionname, lineno, 0); + return 1; +} +EXPORT_SYMBOL(spl_PANIC); + void vpanic(const char *fmt, va_list ap) { |