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