162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "xfs.h" 762306a36Sopenharmony_ci#include "xfs_fs.h" 862306a36Sopenharmony_ci#include "xfs_error.h" 962306a36Sopenharmony_ci#include "xfs_shared.h" 1062306a36Sopenharmony_ci#include "xfs_format.h" 1162306a36Sopenharmony_ci#include "xfs_trans_resv.h" 1262306a36Sopenharmony_ci#include "xfs_mount.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * XFS logging functions 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_cistatic void 1862306a36Sopenharmony_ci__xfs_printk( 1962306a36Sopenharmony_ci const char *level, 2062306a36Sopenharmony_ci const struct xfs_mount *mp, 2162306a36Sopenharmony_ci struct va_format *vaf) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci if (mp && mp->m_super) { 2462306a36Sopenharmony_ci printk("%sXFS (%s): %pV\n", level, mp->m_super->s_id, vaf); 2562306a36Sopenharmony_ci return; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci printk("%sXFS: %pV\n", level, vaf); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_civoid 3162306a36Sopenharmony_cixfs_printk_level( 3262306a36Sopenharmony_ci const char *kern_level, 3362306a36Sopenharmony_ci const struct xfs_mount *mp, 3462306a36Sopenharmony_ci const char *fmt, ...) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci struct va_format vaf; 3762306a36Sopenharmony_ci va_list args; 3862306a36Sopenharmony_ci int level; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci va_start(args, fmt); 4162306a36Sopenharmony_ci vaf.fmt = fmt; 4262306a36Sopenharmony_ci vaf.va = &args; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci __xfs_printk(kern_level, mp, &vaf); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci va_end(args); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci if (!kstrtoint(kern_level, 0, &level) && 4962306a36Sopenharmony_ci level <= LOGLEVEL_ERR && 5062306a36Sopenharmony_ci xfs_error_level >= XFS_ERRLEVEL_HIGH) 5162306a36Sopenharmony_ci xfs_stack_trace(); 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_civoid 5562306a36Sopenharmony_ci_xfs_alert_tag( 5662306a36Sopenharmony_ci const struct xfs_mount *mp, 5762306a36Sopenharmony_ci uint32_t panic_tag, 5862306a36Sopenharmony_ci const char *fmt, ...) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci struct va_format vaf; 6162306a36Sopenharmony_ci va_list args; 6262306a36Sopenharmony_ci int do_panic = 0; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { 6562306a36Sopenharmony_ci xfs_alert(mp, "Transforming an alert into a BUG."); 6662306a36Sopenharmony_ci do_panic = 1; 6762306a36Sopenharmony_ci } 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci va_start(args, fmt); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci vaf.fmt = fmt; 7262306a36Sopenharmony_ci vaf.va = &args; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci __xfs_printk(KERN_ALERT, mp, &vaf); 7562306a36Sopenharmony_ci va_end(args); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci BUG_ON(do_panic); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_civoid 8162306a36Sopenharmony_ciasswarn( 8262306a36Sopenharmony_ci struct xfs_mount *mp, 8362306a36Sopenharmony_ci char *expr, 8462306a36Sopenharmony_ci char *file, 8562306a36Sopenharmony_ci int line) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci xfs_warn(mp, "Assertion failed: %s, file: %s, line: %d", 8862306a36Sopenharmony_ci expr, file, line); 8962306a36Sopenharmony_ci WARN_ON(1); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_civoid 9362306a36Sopenharmony_ciassfail( 9462306a36Sopenharmony_ci struct xfs_mount *mp, 9562306a36Sopenharmony_ci char *expr, 9662306a36Sopenharmony_ci char *file, 9762306a36Sopenharmony_ci int line) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci xfs_emerg(mp, "Assertion failed: %s, file: %s, line: %d", 10062306a36Sopenharmony_ci expr, file, line); 10162306a36Sopenharmony_ci if (xfs_globals.bug_on_assert) 10262306a36Sopenharmony_ci BUG(); 10362306a36Sopenharmony_ci else 10462306a36Sopenharmony_ci WARN_ON(1); 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_civoid 10862306a36Sopenharmony_cixfs_hex_dump(const void *p, int length) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_OFFSET, 16, 1, p, length, 1); 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_civoid 11462306a36Sopenharmony_cixfs_buf_alert_ratelimited( 11562306a36Sopenharmony_ci struct xfs_buf *bp, 11662306a36Sopenharmony_ci const char *rlmsg, 11762306a36Sopenharmony_ci const char *fmt, 11862306a36Sopenharmony_ci ...) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci struct xfs_mount *mp = bp->b_mount; 12162306a36Sopenharmony_ci struct va_format vaf; 12262306a36Sopenharmony_ci va_list args; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci /* use the more aggressive per-target rate limit for buffers */ 12562306a36Sopenharmony_ci if (!___ratelimit(&bp->b_target->bt_ioerror_rl, rlmsg)) 12662306a36Sopenharmony_ci return; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci va_start(args, fmt); 12962306a36Sopenharmony_ci vaf.fmt = fmt; 13062306a36Sopenharmony_ci vaf.va = &args; 13162306a36Sopenharmony_ci __xfs_printk(KERN_ALERT, mp, &vaf); 13262306a36Sopenharmony_ci va_end(args); 13362306a36Sopenharmony_ci} 134