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