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