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