xref: /linux/fs/xfs/xfs_message.c (revision 0b61f8a4079d904b1b1d47946cca898313de8c26)
1*0b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
2c59d87c4SChristoph Hellwig /*
3c59d87c4SChristoph Hellwig  * Copyright (c) 2011 Red Hat, Inc.  All Rights Reserved.
4c59d87c4SChristoph Hellwig  */
5c59d87c4SChristoph Hellwig 
6c59d87c4SChristoph Hellwig #include "xfs.h"
7c59d87c4SChristoph Hellwig #include "xfs_fs.h"
8847f9f68SEric Sandeen #include "xfs_error.h"
94fb6e8adSChristoph Hellwig #include "xfs_format.h"
10239880efSDave Chinner #include "xfs_log_format.h"
11239880efSDave Chinner #include "xfs_trans_resv.h"
12c59d87c4SChristoph Hellwig #include "xfs_mount.h"
13c59d87c4SChristoph Hellwig 
14c59d87c4SChristoph Hellwig /*
15c59d87c4SChristoph Hellwig  * XFS logging functions
16c59d87c4SChristoph Hellwig  */
17c59d87c4SChristoph Hellwig static void
18c59d87c4SChristoph Hellwig __xfs_printk(
19c59d87c4SChristoph Hellwig 	const char		*level,
20c59d87c4SChristoph Hellwig 	const struct xfs_mount	*mp,
21c59d87c4SChristoph Hellwig 	struct va_format	*vaf)
22c59d87c4SChristoph Hellwig {
23c59d87c4SChristoph Hellwig 	if (mp && mp->m_fsname) {
24c59d87c4SChristoph Hellwig 		printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf);
25c59d87c4SChristoph Hellwig 		return;
26c59d87c4SChristoph Hellwig 	}
27c59d87c4SChristoph Hellwig 	printk("%sXFS: %pV\n", level, vaf);
28c59d87c4SChristoph Hellwig }
29c59d87c4SChristoph Hellwig 
30c59d87c4SChristoph Hellwig #define define_xfs_printk_level(func, kern_level)		\
31c59d87c4SChristoph Hellwig void func(const struct xfs_mount *mp, const char *fmt, ...)	\
32c59d87c4SChristoph Hellwig {								\
33c59d87c4SChristoph Hellwig 	struct va_format	vaf;				\
34c59d87c4SChristoph Hellwig 	va_list			args;				\
35847f9f68SEric Sandeen 	int			level;				\
36c59d87c4SChristoph Hellwig 								\
37c59d87c4SChristoph Hellwig 	va_start(args, fmt);					\
38c59d87c4SChristoph Hellwig 								\
39c59d87c4SChristoph Hellwig 	vaf.fmt = fmt;						\
40c59d87c4SChristoph Hellwig 	vaf.va = &args;						\
41c59d87c4SChristoph Hellwig 								\
42c59d87c4SChristoph Hellwig 	__xfs_printk(kern_level, mp, &vaf);			\
43c59d87c4SChristoph Hellwig 	va_end(args);						\
44847f9f68SEric Sandeen 								\
45847f9f68SEric Sandeen 	if (!kstrtoint(kern_level, 0, &level) &&		\
46847f9f68SEric Sandeen 	    level <= LOGLEVEL_ERR &&				\
47847f9f68SEric Sandeen 	    xfs_error_level >= XFS_ERRLEVEL_HIGH)		\
48847f9f68SEric Sandeen 		xfs_stack_trace();				\
49c59d87c4SChristoph Hellwig }								\
50c59d87c4SChristoph Hellwig 
51c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_emerg, KERN_EMERG);
52c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_alert, KERN_ALERT);
53c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_crit, KERN_CRIT);
54c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_err, KERN_ERR);
55c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_warn, KERN_WARNING);
56c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_notice, KERN_NOTICE);
57c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_info, KERN_INFO);
58c59d87c4SChristoph Hellwig #ifdef DEBUG
59c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_debug, KERN_DEBUG);
60c59d87c4SChristoph Hellwig #endif
61c59d87c4SChristoph Hellwig 
62c59d87c4SChristoph Hellwig void
63c59d87c4SChristoph Hellwig xfs_alert_tag(
64c59d87c4SChristoph Hellwig 	const struct xfs_mount	*mp,
65c59d87c4SChristoph Hellwig 	int			panic_tag,
66c59d87c4SChristoph Hellwig 	const char		*fmt, ...)
67c59d87c4SChristoph Hellwig {
68c59d87c4SChristoph Hellwig 	struct va_format	vaf;
69c59d87c4SChristoph Hellwig 	va_list			args;
70c59d87c4SChristoph Hellwig 	int			do_panic = 0;
71c59d87c4SChristoph Hellwig 
72c59d87c4SChristoph Hellwig 	if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
73c59d87c4SChristoph Hellwig 		xfs_alert(mp, "Transforming an alert into a BUG.");
74c59d87c4SChristoph Hellwig 		do_panic = 1;
75c59d87c4SChristoph Hellwig 	}
76c59d87c4SChristoph Hellwig 
77c59d87c4SChristoph Hellwig 	va_start(args, fmt);
78c59d87c4SChristoph Hellwig 
79c59d87c4SChristoph Hellwig 	vaf.fmt = fmt;
80c59d87c4SChristoph Hellwig 	vaf.va = &args;
81c59d87c4SChristoph Hellwig 
82c59d87c4SChristoph Hellwig 	__xfs_printk(KERN_ALERT, mp, &vaf);
83c59d87c4SChristoph Hellwig 	va_end(args);
84c59d87c4SChristoph Hellwig 
85c59d87c4SChristoph Hellwig 	BUG_ON(do_panic);
86c59d87c4SChristoph Hellwig }
87c59d87c4SChristoph Hellwig 
88c59d87c4SChristoph Hellwig void
89742ae1e3SDave Chinner asswarn(char *expr, char *file, int line)
90742ae1e3SDave Chinner {
91742ae1e3SDave Chinner 	xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d",
92742ae1e3SDave Chinner 		expr, file, line);
93742ae1e3SDave Chinner 	WARN_ON(1);
94742ae1e3SDave Chinner }
95742ae1e3SDave Chinner 
96742ae1e3SDave Chinner void
97c59d87c4SChristoph Hellwig assfail(char *expr, char *file, int line)
98c59d87c4SChristoph Hellwig {
99c59d87c4SChristoph Hellwig 	xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d",
100c59d87c4SChristoph Hellwig 		expr, file, line);
101ccdab3d6SBrian Foster 	if (xfs_globals.bug_on_assert)
102c59d87c4SChristoph Hellwig 		BUG();
103ccdab3d6SBrian Foster 	else
104ccdab3d6SBrian Foster 		WARN_ON(1);
105c59d87c4SChristoph Hellwig }
106c59d87c4SChristoph Hellwig 
107c59d87c4SChristoph Hellwig void
108c59d87c4SChristoph Hellwig xfs_hex_dump(void *p, int length)
109c59d87c4SChristoph Hellwig {
110c59d87c4SChristoph Hellwig 	print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1);
111c59d87c4SChristoph Hellwig }
112