10b61f8a4SDave 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"
95467b34bSDarrick J. Wong #include "xfs_shared.h"
104fb6e8adSChristoph Hellwig #include "xfs_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
__xfs_printk(const char * level,const struct xfs_mount * mp,struct va_format * vaf)18c59d87c4SChristoph Hellwig __xfs_printk(
19c59d87c4SChristoph Hellwig const char *level,
20c59d87c4SChristoph Hellwig const struct xfs_mount *mp,
21c59d87c4SChristoph Hellwig struct va_format *vaf)
22c59d87c4SChristoph Hellwig {
23e1d3d218SIan Kent if (mp && mp->m_super) {
24e1d3d218SIan Kent printk("%sXFS (%s): %pV\n", level, mp->m_super->s_id, vaf);
25c59d87c4SChristoph Hellwig return;
26c59d87c4SChristoph Hellwig }
27c59d87c4SChristoph Hellwig printk("%sXFS: %pV\n", level, vaf);
28c59d87c4SChristoph Hellwig }
29c59d87c4SChristoph Hellwig
30e60aa787SJonathan Lassoff void
xfs_printk_level(const char * kern_level,const struct xfs_mount * mp,const char * fmt,...)31e60aa787SJonathan Lassoff xfs_printk_level(
32e60aa787SJonathan Lassoff const char *kern_level,
33e60aa787SJonathan Lassoff const struct xfs_mount *mp,
34e60aa787SJonathan Lassoff const char *fmt, ...)
35e60aa787SJonathan Lassoff {
36e60aa787SJonathan Lassoff struct va_format vaf;
37e60aa787SJonathan Lassoff va_list args;
38e60aa787SJonathan Lassoff int level;
39c59d87c4SChristoph Hellwig
40e60aa787SJonathan Lassoff va_start(args, fmt);
41e60aa787SJonathan Lassoff vaf.fmt = fmt;
42e60aa787SJonathan Lassoff vaf.va = &args;
43e60aa787SJonathan Lassoff
44e60aa787SJonathan Lassoff __xfs_printk(kern_level, mp, &vaf);
45e60aa787SJonathan Lassoff
46e60aa787SJonathan Lassoff va_end(args);
47e60aa787SJonathan Lassoff
48e60aa787SJonathan Lassoff if (!kstrtoint(kern_level, 0, &level) &&
49e60aa787SJonathan Lassoff level <= LOGLEVEL_ERR &&
50e60aa787SJonathan Lassoff xfs_error_level >= XFS_ERRLEVEL_HIGH)
51e60aa787SJonathan Lassoff xfs_stack_trace();
52e60aa787SJonathan Lassoff }
53c59d87c4SChristoph Hellwig
54c59d87c4SChristoph Hellwig void
_xfs_alert_tag(const struct xfs_mount * mp,uint32_t panic_tag,const char * fmt,...)55e2703569SJonathan Lassoff _xfs_alert_tag(
56c59d87c4SChristoph Hellwig const struct xfs_mount *mp,
57*90215d74SDave Chinner uint32_t panic_tag,
58c59d87c4SChristoph Hellwig const char *fmt, ...)
59c59d87c4SChristoph Hellwig {
60c59d87c4SChristoph Hellwig struct va_format vaf;
61c59d87c4SChristoph Hellwig va_list args;
62c59d87c4SChristoph Hellwig int do_panic = 0;
63c59d87c4SChristoph Hellwig
64c59d87c4SChristoph Hellwig if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
65c59d87c4SChristoph Hellwig xfs_alert(mp, "Transforming an alert into a BUG.");
66c59d87c4SChristoph Hellwig do_panic = 1;
67c59d87c4SChristoph Hellwig }
68c59d87c4SChristoph Hellwig
69c59d87c4SChristoph Hellwig va_start(args, fmt);
70c59d87c4SChristoph Hellwig
71c59d87c4SChristoph Hellwig vaf.fmt = fmt;
72c59d87c4SChristoph Hellwig vaf.va = &args;
73c59d87c4SChristoph Hellwig
74c59d87c4SChristoph Hellwig __xfs_printk(KERN_ALERT, mp, &vaf);
75c59d87c4SChristoph Hellwig va_end(args);
76c59d87c4SChristoph Hellwig
77c59d87c4SChristoph Hellwig BUG_ON(do_panic);
78c59d87c4SChristoph Hellwig }
79c59d87c4SChristoph Hellwig
80c59d87c4SChristoph Hellwig void
asswarn(struct xfs_mount * mp,char * expr,char * file,int line)819842b56cSDarrick J. Wong asswarn(
829842b56cSDarrick J. Wong struct xfs_mount *mp,
839842b56cSDarrick J. Wong char *expr,
849842b56cSDarrick J. Wong char *file,
859842b56cSDarrick J. Wong int line)
86742ae1e3SDave Chinner {
879842b56cSDarrick J. Wong xfs_warn(mp, "Assertion failed: %s, file: %s, line: %d",
88742ae1e3SDave Chinner expr, file, line);
89742ae1e3SDave Chinner WARN_ON(1);
90742ae1e3SDave Chinner }
91742ae1e3SDave Chinner
92742ae1e3SDave Chinner void
assfail(struct xfs_mount * mp,char * expr,char * file,int line)939842b56cSDarrick J. Wong assfail(
949842b56cSDarrick J. Wong struct xfs_mount *mp,
959842b56cSDarrick J. Wong char *expr,
969842b56cSDarrick J. Wong char *file,
979842b56cSDarrick J. Wong int line)
98c59d87c4SChristoph Hellwig {
999842b56cSDarrick J. Wong xfs_emerg(mp, "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
xfs_hex_dump(const void * p,int length)108d243b89aSDarrick J. Wong xfs_hex_dump(const void *p, int length)
109c59d87c4SChristoph Hellwig {
110bdec055bSDarrick J. Wong print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_OFFSET, 16, 1, p, length, 1);
111c59d87c4SChristoph Hellwig }
112f9bccfccSBrian Foster
113f9bccfccSBrian Foster void
xfs_buf_alert_ratelimited(struct xfs_buf * bp,const char * rlmsg,const char * fmt,...)114f9bccfccSBrian Foster xfs_buf_alert_ratelimited(
115f9bccfccSBrian Foster struct xfs_buf *bp,
116f9bccfccSBrian Foster const char *rlmsg,
117f9bccfccSBrian Foster const char *fmt,
118f9bccfccSBrian Foster ...)
119f9bccfccSBrian Foster {
120f9bccfccSBrian Foster struct xfs_mount *mp = bp->b_mount;
121f9bccfccSBrian Foster struct va_format vaf;
122f9bccfccSBrian Foster va_list args;
123f9bccfccSBrian Foster
124f9bccfccSBrian Foster /* use the more aggressive per-target rate limit for buffers */
125f9bccfccSBrian Foster if (!___ratelimit(&bp->b_target->bt_ioerror_rl, rlmsg))
126f9bccfccSBrian Foster return;
127f9bccfccSBrian Foster
128f9bccfccSBrian Foster va_start(args, fmt);
129f9bccfccSBrian Foster vaf.fmt = fmt;
130f9bccfccSBrian Foster vaf.va = &args;
131f9bccfccSBrian Foster __xfs_printk(KERN_ALERT, mp, &vaf);
132f9bccfccSBrian Foster va_end(args);
133f9bccfccSBrian Foster }
134