1/*
2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18#include <xfs.h>
19#include "debug.h"
20#include "spin.h"
21
22static char		message[1024];	/* keep it off the stack */
23static DEFINE_SPINLOCK(xfs_err_lock);
24
25/* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */
26#define XFS_MAX_ERR_LEVEL	7
27#define XFS_ERR_MASK		((1 << 3) - 1)
28static const char * const	err_level[XFS_MAX_ERR_LEVEL+1] =
29					{KERN_EMERG, KERN_ALERT, KERN_CRIT,
30					 KERN_ERR, KERN_WARNING, KERN_NOTICE,
31					 KERN_INFO, KERN_DEBUG};
32
33void
34cmn_err(register int level, char *fmt, ...)
35{
36	char	*fp = fmt;
37	int	len;
38	ulong	flags;
39	va_list	ap;
40
41	level &= XFS_ERR_MASK;
42	if (level > XFS_MAX_ERR_LEVEL)
43		level = XFS_MAX_ERR_LEVEL;
44	spin_lock_irqsave(&xfs_err_lock,flags);
45	va_start(ap, fmt);
46	if (*fmt == '!') fp++;
47	len = vsnprintf(message, sizeof(message), fp, ap);
48	if (len >= sizeof(message))
49		len = sizeof(message) - 1;
50	if (message[len-1] == '\n')
51		message[len-1] = 0;
52	printk("%s%s\n", err_level[level], message);
53	va_end(ap);
54	spin_unlock_irqrestore(&xfs_err_lock,flags);
55	BUG_ON(level == CE_PANIC);
56}
57
58void
59icmn_err(register int level, char *fmt, va_list ap)
60{
61	ulong	flags;
62	int	len;
63
64	level &= XFS_ERR_MASK;
65	if(level > XFS_MAX_ERR_LEVEL)
66		level = XFS_MAX_ERR_LEVEL;
67	spin_lock_irqsave(&xfs_err_lock,flags);
68	len = vsnprintf(message, sizeof(message), fmt, ap);
69	if (len >= sizeof(message))
70		len = sizeof(message) - 1;
71	if (message[len-1] == '\n')
72		message[len-1] = 0;
73	printk("%s%s\n", err_level[level], message);
74	spin_unlock_irqrestore(&xfs_err_lock,flags);
75	BUG_ON(level == CE_PANIC);
76}
77
78void
79assfail(char *expr, char *file, int line)
80{
81	printk("Assertion failed: %s, file: %s, line: %d\n", expr, file, line);
82	BUG();
83}
84