xref: /linux/fs/xfs/xfs_message.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2011 Red Hat, Inc.  All Rights Reserved.
4  */
5 
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_error.h"
9 #include "xfs_shared.h"
10 #include "xfs_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 
14 /*
15  * XFS logging functions
16  */
17 static void
18 __xfs_printk(
19 	const char		*level,
20 	const struct xfs_mount	*mp,
21 	struct va_format	*vaf)
22 {
23 	if (mp && mp->m_super) {
24 		printk("%sXFS (%s): %pV\n", level, mp->m_super->s_id, vaf);
25 		return;
26 	}
27 	printk("%sXFS: %pV\n", level, vaf);
28 }
29 
30 void
31 xfs_printk_level(
32 	const char *kern_level,
33 	const struct xfs_mount *mp,
34 	const char *fmt, ...)
35 {
36 	struct va_format	vaf;
37 	va_list			args;
38 	int			level;
39 
40 	va_start(args, fmt);
41 	vaf.fmt = fmt;
42 	vaf.va = &args;
43 
44 	__xfs_printk(kern_level, mp, &vaf);
45 
46 	va_end(args);
47 
48 	if (!kstrtoint(kern_level, 0, &level) &&
49 	    level <= LOGLEVEL_ERR &&
50 	    xfs_error_level >= XFS_ERRLEVEL_HIGH)
51 		xfs_stack_trace();
52 }
53 
54 void
55 _xfs_alert_tag(
56 	const struct xfs_mount	*mp,
57 	uint32_t		panic_tag,
58 	const char		*fmt, ...)
59 {
60 	struct va_format	vaf;
61 	va_list			args;
62 	int			do_panic = 0;
63 
64 	if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
65 		xfs_alert(mp, "Transforming an alert into a BUG.");
66 		do_panic = 1;
67 	}
68 
69 	va_start(args, fmt);
70 
71 	vaf.fmt = fmt;
72 	vaf.va = &args;
73 
74 	__xfs_printk(KERN_ALERT, mp, &vaf);
75 	va_end(args);
76 
77 	BUG_ON(do_panic);
78 }
79 
80 void
81 asswarn(
82 	struct xfs_mount	*mp,
83 	char			*expr,
84 	char			*file,
85 	int			line)
86 {
87 	xfs_warn(mp, "Assertion failed: %s, file: %s, line: %d",
88 		expr, file, line);
89 	WARN_ON(1);
90 }
91 
92 void
93 assfail(
94 	struct xfs_mount	*mp,
95 	char			*expr,
96 	char			*file,
97 	int			line)
98 {
99 	xfs_emerg(mp, "Assertion failed: %s, file: %s, line: %d",
100 		expr, file, line);
101 	if (xfs_globals.bug_on_assert)
102 		BUG();
103 	else
104 		WARN_ON(1);
105 }
106 
107 void
108 xfs_hex_dump(const void *p, int length)
109 {
110 	print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_OFFSET, 16, 1, p, length, 1);
111 }
112 
113 void
114 xfs_buf_alert_ratelimited(
115 	struct xfs_buf		*bp,
116 	const char		*rlmsg,
117 	const char		*fmt,
118 	...)
119 {
120 	struct xfs_mount	*mp = bp->b_mount;
121 	struct va_format	vaf;
122 	va_list			args;
123 
124 	/* use the more aggressive per-target rate limit for buffers */
125 	if (!___ratelimit(&bp->b_target->bt_ioerror_rl, rlmsg))
126 		return;
127 
128 	va_start(args, fmt);
129 	vaf.fmt = fmt;
130 	vaf.va = &args;
131 	__xfs_printk(KERN_ALERT, mp, &vaf);
132 	va_end(args);
133 }
134