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