xref: /openbmc/linux/fs/btrfs/messages.c (revision 083bd7e54e8e2c1d169f21236873272cdf6f409a)
1*083bd7e5SJosef Bacik // SPDX-License-Identifier: GPL-2.0
2*083bd7e5SJosef Bacik 
3*083bd7e5SJosef Bacik #include "fs.h"
4*083bd7e5SJosef Bacik #include "messages.h"
5*083bd7e5SJosef Bacik #include "discard.h"
6*083bd7e5SJosef Bacik #include "transaction.h"
7*083bd7e5SJosef Bacik #include "space-info.h"
8*083bd7e5SJosef Bacik 
9*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
10*083bd7e5SJosef Bacik 
11*083bd7e5SJosef Bacik #define STATE_STRING_PREFACE	": state "
12*083bd7e5SJosef Bacik #define STATE_STRING_BUF_LEN	(sizeof(STATE_STRING_PREFACE) + BTRFS_FS_STATE_COUNT)
13*083bd7e5SJosef Bacik 
14*083bd7e5SJosef Bacik /*
15*083bd7e5SJosef Bacik  * Characters to print to indicate error conditions or uncommon filesystem state.
16*083bd7e5SJosef Bacik  * RO is not an error.
17*083bd7e5SJosef Bacik  */
18*083bd7e5SJosef Bacik static const char fs_state_chars[] = {
19*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_ERROR]			= 'E',
20*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_REMOUNTING]		= 'M',
21*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_RO]			= 0,
22*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_TRANS_ABORTED]		= 'A',
23*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_DEV_REPLACING]		= 'R',
24*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_DUMMY_FS_INFO]		= 0,
25*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_NO_CSUMS]		= 'C',
26*083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_LOG_CLEANUP_ERROR]	= 'L',
27*083bd7e5SJosef Bacik };
28*083bd7e5SJosef Bacik 
29*083bd7e5SJosef Bacik static void btrfs_state_to_string(const struct btrfs_fs_info *info, char *buf)
30*083bd7e5SJosef Bacik {
31*083bd7e5SJosef Bacik 	unsigned int bit;
32*083bd7e5SJosef Bacik 	bool states_printed = false;
33*083bd7e5SJosef Bacik 	unsigned long fs_state = READ_ONCE(info->fs_state);
34*083bd7e5SJosef Bacik 	char *curr = buf;
35*083bd7e5SJosef Bacik 
36*083bd7e5SJosef Bacik 	memcpy(curr, STATE_STRING_PREFACE, sizeof(STATE_STRING_PREFACE));
37*083bd7e5SJosef Bacik 	curr += sizeof(STATE_STRING_PREFACE) - 1;
38*083bd7e5SJosef Bacik 
39*083bd7e5SJosef Bacik 	for_each_set_bit(bit, &fs_state, sizeof(fs_state)) {
40*083bd7e5SJosef Bacik 		WARN_ON_ONCE(bit >= BTRFS_FS_STATE_COUNT);
41*083bd7e5SJosef Bacik 		if ((bit < BTRFS_FS_STATE_COUNT) && fs_state_chars[bit]) {
42*083bd7e5SJosef Bacik 			*curr++ = fs_state_chars[bit];
43*083bd7e5SJosef Bacik 			states_printed = true;
44*083bd7e5SJosef Bacik 		}
45*083bd7e5SJosef Bacik 	}
46*083bd7e5SJosef Bacik 
47*083bd7e5SJosef Bacik 	/* If no states were printed, reset the buffer */
48*083bd7e5SJosef Bacik 	if (!states_printed)
49*083bd7e5SJosef Bacik 		curr = buf;
50*083bd7e5SJosef Bacik 
51*083bd7e5SJosef Bacik 	*curr++ = 0;
52*083bd7e5SJosef Bacik }
53*083bd7e5SJosef Bacik #endif
54*083bd7e5SJosef Bacik 
55*083bd7e5SJosef Bacik /*
56*083bd7e5SJosef Bacik  * Generally the error codes correspond to their respective errors, but there
57*083bd7e5SJosef Bacik  * are a few special cases.
58*083bd7e5SJosef Bacik  *
59*083bd7e5SJosef Bacik  * EUCLEAN: Any sort of corruption that we encounter.  The tree-checker for
60*083bd7e5SJosef Bacik  *          instance will return EUCLEAN if any of the blocks are corrupted in
61*083bd7e5SJosef Bacik  *          a way that is problematic.  We want to reserve EUCLEAN for these
62*083bd7e5SJosef Bacik  *          sort of corruptions.
63*083bd7e5SJosef Bacik  *
64*083bd7e5SJosef Bacik  * EROFS: If we check BTRFS_FS_STATE_ERROR and fail out with a return error, we
65*083bd7e5SJosef Bacik  *        need to use EROFS for this case.  We will have no idea of the
66*083bd7e5SJosef Bacik  *        original failure, that will have been reported at the time we tripped
67*083bd7e5SJosef Bacik  *        over the error.  Each subsequent error that doesn't have any context
68*083bd7e5SJosef Bacik  *        of the original error should use EROFS when handling BTRFS_FS_STATE_ERROR.
69*083bd7e5SJosef Bacik  */
70*083bd7e5SJosef Bacik const char * __attribute_const__ btrfs_decode_error(int errno)
71*083bd7e5SJosef Bacik {
72*083bd7e5SJosef Bacik 	char *errstr = "unknown";
73*083bd7e5SJosef Bacik 
74*083bd7e5SJosef Bacik 	switch (errno) {
75*083bd7e5SJosef Bacik 	case -ENOENT:		/* -2 */
76*083bd7e5SJosef Bacik 		errstr = "No such entry";
77*083bd7e5SJosef Bacik 		break;
78*083bd7e5SJosef Bacik 	case -EIO:		/* -5 */
79*083bd7e5SJosef Bacik 		errstr = "IO failure";
80*083bd7e5SJosef Bacik 		break;
81*083bd7e5SJosef Bacik 	case -ENOMEM:		/* -12*/
82*083bd7e5SJosef Bacik 		errstr = "Out of memory";
83*083bd7e5SJosef Bacik 		break;
84*083bd7e5SJosef Bacik 	case -EEXIST:		/* -17 */
85*083bd7e5SJosef Bacik 		errstr = "Object already exists";
86*083bd7e5SJosef Bacik 		break;
87*083bd7e5SJosef Bacik 	case -ENOSPC:		/* -28 */
88*083bd7e5SJosef Bacik 		errstr = "No space left";
89*083bd7e5SJosef Bacik 		break;
90*083bd7e5SJosef Bacik 	case -EROFS:		/* -30 */
91*083bd7e5SJosef Bacik 		errstr = "Readonly filesystem";
92*083bd7e5SJosef Bacik 		break;
93*083bd7e5SJosef Bacik 	case -EOPNOTSUPP:	/* -95 */
94*083bd7e5SJosef Bacik 		errstr = "Operation not supported";
95*083bd7e5SJosef Bacik 		break;
96*083bd7e5SJosef Bacik 	case -EUCLEAN:		/* -117 */
97*083bd7e5SJosef Bacik 		errstr = "Filesystem corrupted";
98*083bd7e5SJosef Bacik 		break;
99*083bd7e5SJosef Bacik 	case -EDQUOT:		/* -122 */
100*083bd7e5SJosef Bacik 		errstr = "Quota exceeded";
101*083bd7e5SJosef Bacik 		break;
102*083bd7e5SJosef Bacik 	}
103*083bd7e5SJosef Bacik 
104*083bd7e5SJosef Bacik 	return errstr;
105*083bd7e5SJosef Bacik }
106*083bd7e5SJosef Bacik 
107*083bd7e5SJosef Bacik /*
108*083bd7e5SJosef Bacik  * __btrfs_handle_fs_error decodes expected errors from the caller and
109*083bd7e5SJosef Bacik  * invokes the appropriate error response.
110*083bd7e5SJosef Bacik  */
111*083bd7e5SJosef Bacik __cold
112*083bd7e5SJosef Bacik void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
113*083bd7e5SJosef Bacik 		       unsigned int line, int errno, const char *fmt, ...)
114*083bd7e5SJosef Bacik {
115*083bd7e5SJosef Bacik 	struct super_block *sb = fs_info->sb;
116*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
117*083bd7e5SJosef Bacik 	char statestr[STATE_STRING_BUF_LEN];
118*083bd7e5SJosef Bacik 	const char *errstr;
119*083bd7e5SJosef Bacik #endif
120*083bd7e5SJosef Bacik 
121*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK_INDEX
122*083bd7e5SJosef Bacik 	printk_index_subsys_emit(
123*083bd7e5SJosef Bacik 		"BTRFS: error (device %s%s) in %s:%d: errno=%d %s", KERN_CRIT, fmt);
124*083bd7e5SJosef Bacik #endif
125*083bd7e5SJosef Bacik 
126*083bd7e5SJosef Bacik 	/*
127*083bd7e5SJosef Bacik 	 * Special case: if the error is EROFS, and we're already under
128*083bd7e5SJosef Bacik 	 * SB_RDONLY, then it is safe here.
129*083bd7e5SJosef Bacik 	 */
130*083bd7e5SJosef Bacik 	if (errno == -EROFS && sb_rdonly(sb))
131*083bd7e5SJosef Bacik 		return;
132*083bd7e5SJosef Bacik 
133*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
134*083bd7e5SJosef Bacik 	errstr = btrfs_decode_error(errno);
135*083bd7e5SJosef Bacik 	btrfs_state_to_string(fs_info, statestr);
136*083bd7e5SJosef Bacik 	if (fmt) {
137*083bd7e5SJosef Bacik 		struct va_format vaf;
138*083bd7e5SJosef Bacik 		va_list args;
139*083bd7e5SJosef Bacik 
140*083bd7e5SJosef Bacik 		va_start(args, fmt);
141*083bd7e5SJosef Bacik 		vaf.fmt = fmt;
142*083bd7e5SJosef Bacik 		vaf.va = &args;
143*083bd7e5SJosef Bacik 
144*083bd7e5SJosef Bacik 		pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s (%pV)\n",
145*083bd7e5SJosef Bacik 			sb->s_id, statestr, function, line, errno, errstr, &vaf);
146*083bd7e5SJosef Bacik 		va_end(args);
147*083bd7e5SJosef Bacik 	} else {
148*083bd7e5SJosef Bacik 		pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s\n",
149*083bd7e5SJosef Bacik 			sb->s_id, statestr, function, line, errno, errstr);
150*083bd7e5SJosef Bacik 	}
151*083bd7e5SJosef Bacik #endif
152*083bd7e5SJosef Bacik 
153*083bd7e5SJosef Bacik 	/*
154*083bd7e5SJosef Bacik 	 * Today we only save the error info to memory.  Long term we'll also
155*083bd7e5SJosef Bacik 	 * send it down to the disk.
156*083bd7e5SJosef Bacik 	 */
157*083bd7e5SJosef Bacik 	set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state);
158*083bd7e5SJosef Bacik 
159*083bd7e5SJosef Bacik 	/* Don't go through full error handling during mount. */
160*083bd7e5SJosef Bacik 	if (!(sb->s_flags & SB_BORN))
161*083bd7e5SJosef Bacik 		return;
162*083bd7e5SJosef Bacik 
163*083bd7e5SJosef Bacik 	if (sb_rdonly(sb))
164*083bd7e5SJosef Bacik 		return;
165*083bd7e5SJosef Bacik 
166*083bd7e5SJosef Bacik 	btrfs_discard_stop(fs_info);
167*083bd7e5SJosef Bacik 
168*083bd7e5SJosef Bacik 	/* Handle error by forcing the filesystem readonly. */
169*083bd7e5SJosef Bacik 	btrfs_set_sb_rdonly(sb);
170*083bd7e5SJosef Bacik 	btrfs_info(fs_info, "forced readonly");
171*083bd7e5SJosef Bacik 	/*
172*083bd7e5SJosef Bacik 	 * Note that a running device replace operation is not canceled here
173*083bd7e5SJosef Bacik 	 * although there is no way to update the progress. It would add the
174*083bd7e5SJosef Bacik 	 * risk of a deadlock, therefore the canceling is omitted. The only
175*083bd7e5SJosef Bacik 	 * penalty is that some I/O remains active until the procedure
176*083bd7e5SJosef Bacik 	 * completes. The next time when the filesystem is mounted writable
177*083bd7e5SJosef Bacik 	 * again, the device replace operation continues.
178*083bd7e5SJosef Bacik 	 */
179*083bd7e5SJosef Bacik }
180*083bd7e5SJosef Bacik 
181*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
182*083bd7e5SJosef Bacik static const char * const logtypes[] = {
183*083bd7e5SJosef Bacik 	"emergency",
184*083bd7e5SJosef Bacik 	"alert",
185*083bd7e5SJosef Bacik 	"critical",
186*083bd7e5SJosef Bacik 	"error",
187*083bd7e5SJosef Bacik 	"warning",
188*083bd7e5SJosef Bacik 	"notice",
189*083bd7e5SJosef Bacik 	"info",
190*083bd7e5SJosef Bacik 	"debug",
191*083bd7e5SJosef Bacik };
192*083bd7e5SJosef Bacik 
193*083bd7e5SJosef Bacik /*
194*083bd7e5SJosef Bacik  * Use one ratelimit state per log level so that a flood of less important
195*083bd7e5SJosef Bacik  * messages doesn't cause more important ones to be dropped.
196*083bd7e5SJosef Bacik  */
197*083bd7e5SJosef Bacik static struct ratelimit_state printk_limits[] = {
198*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[0], DEFAULT_RATELIMIT_INTERVAL, 100),
199*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[1], DEFAULT_RATELIMIT_INTERVAL, 100),
200*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[2], DEFAULT_RATELIMIT_INTERVAL, 100),
201*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[3], DEFAULT_RATELIMIT_INTERVAL, 100),
202*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[4], DEFAULT_RATELIMIT_INTERVAL, 100),
203*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[5], DEFAULT_RATELIMIT_INTERVAL, 100),
204*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[6], DEFAULT_RATELIMIT_INTERVAL, 100),
205*083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[7], DEFAULT_RATELIMIT_INTERVAL, 100),
206*083bd7e5SJosef Bacik };
207*083bd7e5SJosef Bacik 
208*083bd7e5SJosef Bacik void __cold _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
209*083bd7e5SJosef Bacik {
210*083bd7e5SJosef Bacik 	char lvl[PRINTK_MAX_SINGLE_HEADER_LEN + 1] = "\0";
211*083bd7e5SJosef Bacik 	struct va_format vaf;
212*083bd7e5SJosef Bacik 	va_list args;
213*083bd7e5SJosef Bacik 	int kern_level;
214*083bd7e5SJosef Bacik 	const char *type = logtypes[4];
215*083bd7e5SJosef Bacik 	struct ratelimit_state *ratelimit = &printk_limits[4];
216*083bd7e5SJosef Bacik 
217*083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK_INDEX
218*083bd7e5SJosef Bacik 	printk_index_subsys_emit("%sBTRFS %s (device %s): ", NULL, fmt);
219*083bd7e5SJosef Bacik #endif
220*083bd7e5SJosef Bacik 
221*083bd7e5SJosef Bacik 	va_start(args, fmt);
222*083bd7e5SJosef Bacik 
223*083bd7e5SJosef Bacik 	while ((kern_level = printk_get_level(fmt)) != 0) {
224*083bd7e5SJosef Bacik 		size_t size = printk_skip_level(fmt) - fmt;
225*083bd7e5SJosef Bacik 
226*083bd7e5SJosef Bacik 		if (kern_level >= '0' && kern_level <= '7') {
227*083bd7e5SJosef Bacik 			memcpy(lvl, fmt,  size);
228*083bd7e5SJosef Bacik 			lvl[size] = '\0';
229*083bd7e5SJosef Bacik 			type = logtypes[kern_level - '0'];
230*083bd7e5SJosef Bacik 			ratelimit = &printk_limits[kern_level - '0'];
231*083bd7e5SJosef Bacik 		}
232*083bd7e5SJosef Bacik 		fmt += size;
233*083bd7e5SJosef Bacik 	}
234*083bd7e5SJosef Bacik 
235*083bd7e5SJosef Bacik 	vaf.fmt = fmt;
236*083bd7e5SJosef Bacik 	vaf.va = &args;
237*083bd7e5SJosef Bacik 
238*083bd7e5SJosef Bacik 	if (__ratelimit(ratelimit)) {
239*083bd7e5SJosef Bacik 		if (fs_info) {
240*083bd7e5SJosef Bacik 			char statestr[STATE_STRING_BUF_LEN];
241*083bd7e5SJosef Bacik 
242*083bd7e5SJosef Bacik 			btrfs_state_to_string(fs_info, statestr);
243*083bd7e5SJosef Bacik 			_printk("%sBTRFS %s (device %s%s): %pV\n", lvl, type,
244*083bd7e5SJosef Bacik 				fs_info->sb->s_id, statestr, &vaf);
245*083bd7e5SJosef Bacik 		} else {
246*083bd7e5SJosef Bacik 			_printk("%sBTRFS %s: %pV\n", lvl, type, &vaf);
247*083bd7e5SJosef Bacik 		}
248*083bd7e5SJosef Bacik 	}
249*083bd7e5SJosef Bacik 
250*083bd7e5SJosef Bacik 	va_end(args);
251*083bd7e5SJosef Bacik }
252*083bd7e5SJosef Bacik #endif
253*083bd7e5SJosef Bacik 
254*083bd7e5SJosef Bacik #ifdef CONFIG_BTRFS_ASSERT
255*083bd7e5SJosef Bacik void __cold btrfs_assertfail(const char *expr, const char *file, int line)
256*083bd7e5SJosef Bacik {
257*083bd7e5SJosef Bacik 	pr_err("assertion failed: %s, in %s:%d\n", expr, file, line);
258*083bd7e5SJosef Bacik 	BUG();
259*083bd7e5SJosef Bacik }
260*083bd7e5SJosef Bacik #endif
261*083bd7e5SJosef Bacik 
262*083bd7e5SJosef Bacik void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
263*083bd7e5SJosef Bacik {
264*083bd7e5SJosef Bacik 	btrfs_err(fs_info,
265*083bd7e5SJosef Bacik "Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
266*083bd7e5SJosef Bacik }
267*083bd7e5SJosef Bacik 
268*083bd7e5SJosef Bacik #if BITS_PER_LONG == 32
269*083bd7e5SJosef Bacik void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info)
270*083bd7e5SJosef Bacik {
271*083bd7e5SJosef Bacik 	if (!test_and_set_bit(BTRFS_FS_32BIT_WARN, &fs_info->flags)) {
272*083bd7e5SJosef Bacik 		btrfs_warn(fs_info, "reaching 32bit limit for logical addresses");
273*083bd7e5SJosef Bacik 		btrfs_warn(fs_info,
274*083bd7e5SJosef Bacik "due to page cache limit on 32bit systems, btrfs can't access metadata at or beyond %lluT",
275*083bd7e5SJosef Bacik 			   BTRFS_32BIT_MAX_FILE_SIZE >> 40);
276*083bd7e5SJosef Bacik 		btrfs_warn(fs_info,
277*083bd7e5SJosef Bacik 			   "please consider upgrading to 64bit kernel/hardware");
278*083bd7e5SJosef Bacik 	}
279*083bd7e5SJosef Bacik }
280*083bd7e5SJosef Bacik 
281*083bd7e5SJosef Bacik void __cold btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info)
282*083bd7e5SJosef Bacik {
283*083bd7e5SJosef Bacik 	if (!test_and_set_bit(BTRFS_FS_32BIT_ERROR, &fs_info->flags)) {
284*083bd7e5SJosef Bacik 		btrfs_err(fs_info, "reached 32bit limit for logical addresses");
285*083bd7e5SJosef Bacik 		btrfs_err(fs_info,
286*083bd7e5SJosef Bacik "due to page cache limit on 32bit systems, metadata beyond %lluT can't be accessed",
287*083bd7e5SJosef Bacik 			  BTRFS_32BIT_MAX_FILE_SIZE >> 40);
288*083bd7e5SJosef Bacik 		btrfs_err(fs_info,
289*083bd7e5SJosef Bacik 			   "please consider upgrading to 64bit kernel/hardware");
290*083bd7e5SJosef Bacik 	}
291*083bd7e5SJosef Bacik }
292*083bd7e5SJosef Bacik #endif
293*083bd7e5SJosef Bacik 
294*083bd7e5SJosef Bacik /*
295*083bd7e5SJosef Bacik  * We only mark the transaction aborted and then set the file system read-only.
296*083bd7e5SJosef Bacik  * This will prevent new transactions from starting or trying to join this
297*083bd7e5SJosef Bacik  * one.
298*083bd7e5SJosef Bacik  *
299*083bd7e5SJosef Bacik  * This means that error recovery at the call site is limited to freeing
300*083bd7e5SJosef Bacik  * any local memory allocations and passing the error code up without
301*083bd7e5SJosef Bacik  * further cleanup. The transaction should complete as it normally would
302*083bd7e5SJosef Bacik  * in the call path but will return -EIO.
303*083bd7e5SJosef Bacik  *
304*083bd7e5SJosef Bacik  * We'll complete the cleanup in btrfs_end_transaction and
305*083bd7e5SJosef Bacik  * btrfs_commit_transaction.
306*083bd7e5SJosef Bacik  */
307*083bd7e5SJosef Bacik __cold
308*083bd7e5SJosef Bacik void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
309*083bd7e5SJosef Bacik 			       const char *function,
310*083bd7e5SJosef Bacik 			       unsigned int line, int errno, bool first_hit)
311*083bd7e5SJosef Bacik {
312*083bd7e5SJosef Bacik 	struct btrfs_fs_info *fs_info = trans->fs_info;
313*083bd7e5SJosef Bacik 
314*083bd7e5SJosef Bacik 	WRITE_ONCE(trans->aborted, errno);
315*083bd7e5SJosef Bacik 	WRITE_ONCE(trans->transaction->aborted, errno);
316*083bd7e5SJosef Bacik 	if (first_hit && errno == -ENOSPC)
317*083bd7e5SJosef Bacik 		btrfs_dump_space_info_for_trans_abort(fs_info);
318*083bd7e5SJosef Bacik 	/* Wake up anybody who may be waiting on this transaction */
319*083bd7e5SJosef Bacik 	wake_up(&fs_info->transaction_wait);
320*083bd7e5SJosef Bacik 	wake_up(&fs_info->transaction_blocked_wait);
321*083bd7e5SJosef Bacik 	__btrfs_handle_fs_error(fs_info, function, line, errno, NULL);
322*083bd7e5SJosef Bacik }
323*083bd7e5SJosef Bacik 
324*083bd7e5SJosef Bacik /*
325*083bd7e5SJosef Bacik  * __btrfs_panic decodes unexpected, fatal errors from the caller, issues an
326*083bd7e5SJosef Bacik  * alert, and either panics or BUGs, depending on mount options.
327*083bd7e5SJosef Bacik  */
328*083bd7e5SJosef Bacik __cold
329*083bd7e5SJosef Bacik void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
330*083bd7e5SJosef Bacik 		   unsigned int line, int errno, const char *fmt, ...)
331*083bd7e5SJosef Bacik {
332*083bd7e5SJosef Bacik 	char *s_id = "<unknown>";
333*083bd7e5SJosef Bacik 	const char *errstr;
334*083bd7e5SJosef Bacik 	struct va_format vaf = { .fmt = fmt };
335*083bd7e5SJosef Bacik 	va_list args;
336*083bd7e5SJosef Bacik 
337*083bd7e5SJosef Bacik 	if (fs_info)
338*083bd7e5SJosef Bacik 		s_id = fs_info->sb->s_id;
339*083bd7e5SJosef Bacik 
340*083bd7e5SJosef Bacik 	va_start(args, fmt);
341*083bd7e5SJosef Bacik 	vaf.va = &args;
342*083bd7e5SJosef Bacik 
343*083bd7e5SJosef Bacik 	errstr = btrfs_decode_error(errno);
344*083bd7e5SJosef Bacik 	if (fs_info && (btrfs_test_opt(fs_info, PANIC_ON_FATAL_ERROR)))
345*083bd7e5SJosef Bacik 		panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (errno=%d %s)\n",
346*083bd7e5SJosef Bacik 			s_id, function, line, &vaf, errno, errstr);
347*083bd7e5SJosef Bacik 
348*083bd7e5SJosef Bacik 	btrfs_crit(fs_info, "panic in %s:%d: %pV (errno=%d %s)",
349*083bd7e5SJosef Bacik 		   function, line, &vaf, errno, errstr);
350*083bd7e5SJosef Bacik 	va_end(args);
351*083bd7e5SJosef Bacik 	/* Caller calls BUG() */
352*083bd7e5SJosef Bacik }
353