xref: /openbmc/linux/fs/btrfs/messages.c (revision 7f0add250f829248281e1745d92648f72192a8f4)
1083bd7e5SJosef Bacik // SPDX-License-Identifier: GPL-2.0
2083bd7e5SJosef Bacik 
3083bd7e5SJosef Bacik #include "fs.h"
4083bd7e5SJosef Bacik #include "messages.h"
5083bd7e5SJosef Bacik #include "discard.h"
6083bd7e5SJosef Bacik #include "transaction.h"
7083bd7e5SJosef Bacik #include "space-info.h"
8*7f0add25SJosef Bacik #include "super.h"
9083bd7e5SJosef Bacik 
10083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
11083bd7e5SJosef Bacik 
12083bd7e5SJosef Bacik #define STATE_STRING_PREFACE	": state "
13083bd7e5SJosef Bacik #define STATE_STRING_BUF_LEN	(sizeof(STATE_STRING_PREFACE) + BTRFS_FS_STATE_COUNT)
14083bd7e5SJosef Bacik 
15083bd7e5SJosef Bacik /*
16083bd7e5SJosef Bacik  * Characters to print to indicate error conditions or uncommon filesystem state.
17083bd7e5SJosef Bacik  * RO is not an error.
18083bd7e5SJosef Bacik  */
19083bd7e5SJosef Bacik static const char fs_state_chars[] = {
20083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_ERROR]			= 'E',
21083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_REMOUNTING]		= 'M',
22083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_RO]			= 0,
23083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_TRANS_ABORTED]		= 'A',
24083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_DEV_REPLACING]		= 'R',
25083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_DUMMY_FS_INFO]		= 0,
26083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_NO_CSUMS]		= 'C',
27083bd7e5SJosef Bacik 	[BTRFS_FS_STATE_LOG_CLEANUP_ERROR]	= 'L',
28083bd7e5SJosef Bacik };
29083bd7e5SJosef Bacik 
30083bd7e5SJosef Bacik static void btrfs_state_to_string(const struct btrfs_fs_info *info, char *buf)
31083bd7e5SJosef Bacik {
32083bd7e5SJosef Bacik 	unsigned int bit;
33083bd7e5SJosef Bacik 	bool states_printed = false;
34083bd7e5SJosef Bacik 	unsigned long fs_state = READ_ONCE(info->fs_state);
35083bd7e5SJosef Bacik 	char *curr = buf;
36083bd7e5SJosef Bacik 
37083bd7e5SJosef Bacik 	memcpy(curr, STATE_STRING_PREFACE, sizeof(STATE_STRING_PREFACE));
38083bd7e5SJosef Bacik 	curr += sizeof(STATE_STRING_PREFACE) - 1;
39083bd7e5SJosef Bacik 
40083bd7e5SJosef Bacik 	for_each_set_bit(bit, &fs_state, sizeof(fs_state)) {
41083bd7e5SJosef Bacik 		WARN_ON_ONCE(bit >= BTRFS_FS_STATE_COUNT);
42083bd7e5SJosef Bacik 		if ((bit < BTRFS_FS_STATE_COUNT) && fs_state_chars[bit]) {
43083bd7e5SJosef Bacik 			*curr++ = fs_state_chars[bit];
44083bd7e5SJosef Bacik 			states_printed = true;
45083bd7e5SJosef Bacik 		}
46083bd7e5SJosef Bacik 	}
47083bd7e5SJosef Bacik 
48083bd7e5SJosef Bacik 	/* If no states were printed, reset the buffer */
49083bd7e5SJosef Bacik 	if (!states_printed)
50083bd7e5SJosef Bacik 		curr = buf;
51083bd7e5SJosef Bacik 
52083bd7e5SJosef Bacik 	*curr++ = 0;
53083bd7e5SJosef Bacik }
54083bd7e5SJosef Bacik #endif
55083bd7e5SJosef Bacik 
56083bd7e5SJosef Bacik /*
57083bd7e5SJosef Bacik  * Generally the error codes correspond to their respective errors, but there
58083bd7e5SJosef Bacik  * are a few special cases.
59083bd7e5SJosef Bacik  *
60083bd7e5SJosef Bacik  * EUCLEAN: Any sort of corruption that we encounter.  The tree-checker for
61083bd7e5SJosef Bacik  *          instance will return EUCLEAN if any of the blocks are corrupted in
62083bd7e5SJosef Bacik  *          a way that is problematic.  We want to reserve EUCLEAN for these
63083bd7e5SJosef Bacik  *          sort of corruptions.
64083bd7e5SJosef Bacik  *
65083bd7e5SJosef Bacik  * EROFS: If we check BTRFS_FS_STATE_ERROR and fail out with a return error, we
66083bd7e5SJosef Bacik  *        need to use EROFS for this case.  We will have no idea of the
67083bd7e5SJosef Bacik  *        original failure, that will have been reported at the time we tripped
68083bd7e5SJosef Bacik  *        over the error.  Each subsequent error that doesn't have any context
69083bd7e5SJosef Bacik  *        of the original error should use EROFS when handling BTRFS_FS_STATE_ERROR.
70083bd7e5SJosef Bacik  */
71083bd7e5SJosef Bacik const char * __attribute_const__ btrfs_decode_error(int errno)
72083bd7e5SJosef Bacik {
73083bd7e5SJosef Bacik 	char *errstr = "unknown";
74083bd7e5SJosef Bacik 
75083bd7e5SJosef Bacik 	switch (errno) {
76083bd7e5SJosef Bacik 	case -ENOENT:		/* -2 */
77083bd7e5SJosef Bacik 		errstr = "No such entry";
78083bd7e5SJosef Bacik 		break;
79083bd7e5SJosef Bacik 	case -EIO:		/* -5 */
80083bd7e5SJosef Bacik 		errstr = "IO failure";
81083bd7e5SJosef Bacik 		break;
82083bd7e5SJosef Bacik 	case -ENOMEM:		/* -12*/
83083bd7e5SJosef Bacik 		errstr = "Out of memory";
84083bd7e5SJosef Bacik 		break;
85083bd7e5SJosef Bacik 	case -EEXIST:		/* -17 */
86083bd7e5SJosef Bacik 		errstr = "Object already exists";
87083bd7e5SJosef Bacik 		break;
88083bd7e5SJosef Bacik 	case -ENOSPC:		/* -28 */
89083bd7e5SJosef Bacik 		errstr = "No space left";
90083bd7e5SJosef Bacik 		break;
91083bd7e5SJosef Bacik 	case -EROFS:		/* -30 */
92083bd7e5SJosef Bacik 		errstr = "Readonly filesystem";
93083bd7e5SJosef Bacik 		break;
94083bd7e5SJosef Bacik 	case -EOPNOTSUPP:	/* -95 */
95083bd7e5SJosef Bacik 		errstr = "Operation not supported";
96083bd7e5SJosef Bacik 		break;
97083bd7e5SJosef Bacik 	case -EUCLEAN:		/* -117 */
98083bd7e5SJosef Bacik 		errstr = "Filesystem corrupted";
99083bd7e5SJosef Bacik 		break;
100083bd7e5SJosef Bacik 	case -EDQUOT:		/* -122 */
101083bd7e5SJosef Bacik 		errstr = "Quota exceeded";
102083bd7e5SJosef Bacik 		break;
103083bd7e5SJosef Bacik 	}
104083bd7e5SJosef Bacik 
105083bd7e5SJosef Bacik 	return errstr;
106083bd7e5SJosef Bacik }
107083bd7e5SJosef Bacik 
108083bd7e5SJosef Bacik /*
109083bd7e5SJosef Bacik  * __btrfs_handle_fs_error decodes expected errors from the caller and
110083bd7e5SJosef Bacik  * invokes the appropriate error response.
111083bd7e5SJosef Bacik  */
112083bd7e5SJosef Bacik __cold
113083bd7e5SJosef Bacik void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
114083bd7e5SJosef Bacik 		       unsigned int line, int errno, const char *fmt, ...)
115083bd7e5SJosef Bacik {
116083bd7e5SJosef Bacik 	struct super_block *sb = fs_info->sb;
117083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
118083bd7e5SJosef Bacik 	char statestr[STATE_STRING_BUF_LEN];
119083bd7e5SJosef Bacik 	const char *errstr;
120083bd7e5SJosef Bacik #endif
121083bd7e5SJosef Bacik 
122083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK_INDEX
123083bd7e5SJosef Bacik 	printk_index_subsys_emit(
124083bd7e5SJosef Bacik 		"BTRFS: error (device %s%s) in %s:%d: errno=%d %s", KERN_CRIT, fmt);
125083bd7e5SJosef Bacik #endif
126083bd7e5SJosef Bacik 
127083bd7e5SJosef Bacik 	/*
128083bd7e5SJosef Bacik 	 * Special case: if the error is EROFS, and we're already under
129083bd7e5SJosef Bacik 	 * SB_RDONLY, then it is safe here.
130083bd7e5SJosef Bacik 	 */
131083bd7e5SJosef Bacik 	if (errno == -EROFS && sb_rdonly(sb))
132083bd7e5SJosef Bacik 		return;
133083bd7e5SJosef Bacik 
134083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
135083bd7e5SJosef Bacik 	errstr = btrfs_decode_error(errno);
136083bd7e5SJosef Bacik 	btrfs_state_to_string(fs_info, statestr);
137083bd7e5SJosef Bacik 	if (fmt) {
138083bd7e5SJosef Bacik 		struct va_format vaf;
139083bd7e5SJosef Bacik 		va_list args;
140083bd7e5SJosef Bacik 
141083bd7e5SJosef Bacik 		va_start(args, fmt);
142083bd7e5SJosef Bacik 		vaf.fmt = fmt;
143083bd7e5SJosef Bacik 		vaf.va = &args;
144083bd7e5SJosef Bacik 
145083bd7e5SJosef Bacik 		pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s (%pV)\n",
146083bd7e5SJosef Bacik 			sb->s_id, statestr, function, line, errno, errstr, &vaf);
147083bd7e5SJosef Bacik 		va_end(args);
148083bd7e5SJosef Bacik 	} else {
149083bd7e5SJosef Bacik 		pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s\n",
150083bd7e5SJosef Bacik 			sb->s_id, statestr, function, line, errno, errstr);
151083bd7e5SJosef Bacik 	}
152083bd7e5SJosef Bacik #endif
153083bd7e5SJosef Bacik 
154083bd7e5SJosef Bacik 	/*
155083bd7e5SJosef Bacik 	 * Today we only save the error info to memory.  Long term we'll also
156083bd7e5SJosef Bacik 	 * send it down to the disk.
157083bd7e5SJosef Bacik 	 */
158083bd7e5SJosef Bacik 	set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state);
159083bd7e5SJosef Bacik 
160083bd7e5SJosef Bacik 	/* Don't go through full error handling during mount. */
161083bd7e5SJosef Bacik 	if (!(sb->s_flags & SB_BORN))
162083bd7e5SJosef Bacik 		return;
163083bd7e5SJosef Bacik 
164083bd7e5SJosef Bacik 	if (sb_rdonly(sb))
165083bd7e5SJosef Bacik 		return;
166083bd7e5SJosef Bacik 
167083bd7e5SJosef Bacik 	btrfs_discard_stop(fs_info);
168083bd7e5SJosef Bacik 
169083bd7e5SJosef Bacik 	/* Handle error by forcing the filesystem readonly. */
170083bd7e5SJosef Bacik 	btrfs_set_sb_rdonly(sb);
171083bd7e5SJosef Bacik 	btrfs_info(fs_info, "forced readonly");
172083bd7e5SJosef Bacik 	/*
173083bd7e5SJosef Bacik 	 * Note that a running device replace operation is not canceled here
174083bd7e5SJosef Bacik 	 * although there is no way to update the progress. It would add the
175083bd7e5SJosef Bacik 	 * risk of a deadlock, therefore the canceling is omitted. The only
176083bd7e5SJosef Bacik 	 * penalty is that some I/O remains active until the procedure
177083bd7e5SJosef Bacik 	 * completes. The next time when the filesystem is mounted writable
178083bd7e5SJosef Bacik 	 * again, the device replace operation continues.
179083bd7e5SJosef Bacik 	 */
180083bd7e5SJosef Bacik }
181083bd7e5SJosef Bacik 
182083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK
183083bd7e5SJosef Bacik static const char * const logtypes[] = {
184083bd7e5SJosef Bacik 	"emergency",
185083bd7e5SJosef Bacik 	"alert",
186083bd7e5SJosef Bacik 	"critical",
187083bd7e5SJosef Bacik 	"error",
188083bd7e5SJosef Bacik 	"warning",
189083bd7e5SJosef Bacik 	"notice",
190083bd7e5SJosef Bacik 	"info",
191083bd7e5SJosef Bacik 	"debug",
192083bd7e5SJosef Bacik };
193083bd7e5SJosef Bacik 
194083bd7e5SJosef Bacik /*
195083bd7e5SJosef Bacik  * Use one ratelimit state per log level so that a flood of less important
196083bd7e5SJosef Bacik  * messages doesn't cause more important ones to be dropped.
197083bd7e5SJosef Bacik  */
198083bd7e5SJosef Bacik static struct ratelimit_state printk_limits[] = {
199083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[0], DEFAULT_RATELIMIT_INTERVAL, 100),
200083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[1], DEFAULT_RATELIMIT_INTERVAL, 100),
201083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[2], DEFAULT_RATELIMIT_INTERVAL, 100),
202083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[3], DEFAULT_RATELIMIT_INTERVAL, 100),
203083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[4], DEFAULT_RATELIMIT_INTERVAL, 100),
204083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[5], DEFAULT_RATELIMIT_INTERVAL, 100),
205083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[6], DEFAULT_RATELIMIT_INTERVAL, 100),
206083bd7e5SJosef Bacik 	RATELIMIT_STATE_INIT(printk_limits[7], DEFAULT_RATELIMIT_INTERVAL, 100),
207083bd7e5SJosef Bacik };
208083bd7e5SJosef Bacik 
209083bd7e5SJosef Bacik void __cold _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
210083bd7e5SJosef Bacik {
211083bd7e5SJosef Bacik 	char lvl[PRINTK_MAX_SINGLE_HEADER_LEN + 1] = "\0";
212083bd7e5SJosef Bacik 	struct va_format vaf;
213083bd7e5SJosef Bacik 	va_list args;
214083bd7e5SJosef Bacik 	int kern_level;
215083bd7e5SJosef Bacik 	const char *type = logtypes[4];
216083bd7e5SJosef Bacik 	struct ratelimit_state *ratelimit = &printk_limits[4];
217083bd7e5SJosef Bacik 
218083bd7e5SJosef Bacik #ifdef CONFIG_PRINTK_INDEX
219083bd7e5SJosef Bacik 	printk_index_subsys_emit("%sBTRFS %s (device %s): ", NULL, fmt);
220083bd7e5SJosef Bacik #endif
221083bd7e5SJosef Bacik 
222083bd7e5SJosef Bacik 	va_start(args, fmt);
223083bd7e5SJosef Bacik 
224083bd7e5SJosef Bacik 	while ((kern_level = printk_get_level(fmt)) != 0) {
225083bd7e5SJosef Bacik 		size_t size = printk_skip_level(fmt) - fmt;
226083bd7e5SJosef Bacik 
227083bd7e5SJosef Bacik 		if (kern_level >= '0' && kern_level <= '7') {
228083bd7e5SJosef Bacik 			memcpy(lvl, fmt,  size);
229083bd7e5SJosef Bacik 			lvl[size] = '\0';
230083bd7e5SJosef Bacik 			type = logtypes[kern_level - '0'];
231083bd7e5SJosef Bacik 			ratelimit = &printk_limits[kern_level - '0'];
232083bd7e5SJosef Bacik 		}
233083bd7e5SJosef Bacik 		fmt += size;
234083bd7e5SJosef Bacik 	}
235083bd7e5SJosef Bacik 
236083bd7e5SJosef Bacik 	vaf.fmt = fmt;
237083bd7e5SJosef Bacik 	vaf.va = &args;
238083bd7e5SJosef Bacik 
239083bd7e5SJosef Bacik 	if (__ratelimit(ratelimit)) {
240083bd7e5SJosef Bacik 		if (fs_info) {
241083bd7e5SJosef Bacik 			char statestr[STATE_STRING_BUF_LEN];
242083bd7e5SJosef Bacik 
243083bd7e5SJosef Bacik 			btrfs_state_to_string(fs_info, statestr);
244083bd7e5SJosef Bacik 			_printk("%sBTRFS %s (device %s%s): %pV\n", lvl, type,
245083bd7e5SJosef Bacik 				fs_info->sb->s_id, statestr, &vaf);
246083bd7e5SJosef Bacik 		} else {
247083bd7e5SJosef Bacik 			_printk("%sBTRFS %s: %pV\n", lvl, type, &vaf);
248083bd7e5SJosef Bacik 		}
249083bd7e5SJosef Bacik 	}
250083bd7e5SJosef Bacik 
251083bd7e5SJosef Bacik 	va_end(args);
252083bd7e5SJosef Bacik }
253083bd7e5SJosef Bacik #endif
254083bd7e5SJosef Bacik 
255083bd7e5SJosef Bacik #ifdef CONFIG_BTRFS_ASSERT
256083bd7e5SJosef Bacik void __cold btrfs_assertfail(const char *expr, const char *file, int line)
257083bd7e5SJosef Bacik {
258083bd7e5SJosef Bacik 	pr_err("assertion failed: %s, in %s:%d\n", expr, file, line);
259083bd7e5SJosef Bacik 	BUG();
260083bd7e5SJosef Bacik }
261083bd7e5SJosef Bacik #endif
262083bd7e5SJosef Bacik 
263083bd7e5SJosef Bacik void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
264083bd7e5SJosef Bacik {
265083bd7e5SJosef Bacik 	btrfs_err(fs_info,
266083bd7e5SJosef Bacik "Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
267083bd7e5SJosef Bacik }
268083bd7e5SJosef Bacik 
269083bd7e5SJosef Bacik #if BITS_PER_LONG == 32
270083bd7e5SJosef Bacik void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info)
271083bd7e5SJosef Bacik {
272083bd7e5SJosef Bacik 	if (!test_and_set_bit(BTRFS_FS_32BIT_WARN, &fs_info->flags)) {
273083bd7e5SJosef Bacik 		btrfs_warn(fs_info, "reaching 32bit limit for logical addresses");
274083bd7e5SJosef Bacik 		btrfs_warn(fs_info,
275083bd7e5SJosef Bacik "due to page cache limit on 32bit systems, btrfs can't access metadata at or beyond %lluT",
276083bd7e5SJosef Bacik 			   BTRFS_32BIT_MAX_FILE_SIZE >> 40);
277083bd7e5SJosef Bacik 		btrfs_warn(fs_info,
278083bd7e5SJosef Bacik 			   "please consider upgrading to 64bit kernel/hardware");
279083bd7e5SJosef Bacik 	}
280083bd7e5SJosef Bacik }
281083bd7e5SJosef Bacik 
282083bd7e5SJosef Bacik void __cold btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info)
283083bd7e5SJosef Bacik {
284083bd7e5SJosef Bacik 	if (!test_and_set_bit(BTRFS_FS_32BIT_ERROR, &fs_info->flags)) {
285083bd7e5SJosef Bacik 		btrfs_err(fs_info, "reached 32bit limit for logical addresses");
286083bd7e5SJosef Bacik 		btrfs_err(fs_info,
287083bd7e5SJosef Bacik "due to page cache limit on 32bit systems, metadata beyond %lluT can't be accessed",
288083bd7e5SJosef Bacik 			  BTRFS_32BIT_MAX_FILE_SIZE >> 40);
289083bd7e5SJosef Bacik 		btrfs_err(fs_info,
290083bd7e5SJosef Bacik 			   "please consider upgrading to 64bit kernel/hardware");
291083bd7e5SJosef Bacik 	}
292083bd7e5SJosef Bacik }
293083bd7e5SJosef Bacik #endif
294083bd7e5SJosef Bacik 
295083bd7e5SJosef Bacik /*
296083bd7e5SJosef Bacik  * We only mark the transaction aborted and then set the file system read-only.
297083bd7e5SJosef Bacik  * This will prevent new transactions from starting or trying to join this
298083bd7e5SJosef Bacik  * one.
299083bd7e5SJosef Bacik  *
300083bd7e5SJosef Bacik  * This means that error recovery at the call site is limited to freeing
301083bd7e5SJosef Bacik  * any local memory allocations and passing the error code up without
302083bd7e5SJosef Bacik  * further cleanup. The transaction should complete as it normally would
303083bd7e5SJosef Bacik  * in the call path but will return -EIO.
304083bd7e5SJosef Bacik  *
305083bd7e5SJosef Bacik  * We'll complete the cleanup in btrfs_end_transaction and
306083bd7e5SJosef Bacik  * btrfs_commit_transaction.
307083bd7e5SJosef Bacik  */
308083bd7e5SJosef Bacik __cold
309083bd7e5SJosef Bacik void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
310083bd7e5SJosef Bacik 			       const char *function,
311083bd7e5SJosef Bacik 			       unsigned int line, int errno, bool first_hit)
312083bd7e5SJosef Bacik {
313083bd7e5SJosef Bacik 	struct btrfs_fs_info *fs_info = trans->fs_info;
314083bd7e5SJosef Bacik 
315083bd7e5SJosef Bacik 	WRITE_ONCE(trans->aborted, errno);
316083bd7e5SJosef Bacik 	WRITE_ONCE(trans->transaction->aborted, errno);
317083bd7e5SJosef Bacik 	if (first_hit && errno == -ENOSPC)
318083bd7e5SJosef Bacik 		btrfs_dump_space_info_for_trans_abort(fs_info);
319083bd7e5SJosef Bacik 	/* Wake up anybody who may be waiting on this transaction */
320083bd7e5SJosef Bacik 	wake_up(&fs_info->transaction_wait);
321083bd7e5SJosef Bacik 	wake_up(&fs_info->transaction_blocked_wait);
322083bd7e5SJosef Bacik 	__btrfs_handle_fs_error(fs_info, function, line, errno, NULL);
323083bd7e5SJosef Bacik }
324083bd7e5SJosef Bacik 
325083bd7e5SJosef Bacik /*
326083bd7e5SJosef Bacik  * __btrfs_panic decodes unexpected, fatal errors from the caller, issues an
327083bd7e5SJosef Bacik  * alert, and either panics or BUGs, depending on mount options.
328083bd7e5SJosef Bacik  */
329083bd7e5SJosef Bacik __cold
330083bd7e5SJosef Bacik void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
331083bd7e5SJosef Bacik 		   unsigned int line, int errno, const char *fmt, ...)
332083bd7e5SJosef Bacik {
333083bd7e5SJosef Bacik 	char *s_id = "<unknown>";
334083bd7e5SJosef Bacik 	const char *errstr;
335083bd7e5SJosef Bacik 	struct va_format vaf = { .fmt = fmt };
336083bd7e5SJosef Bacik 	va_list args;
337083bd7e5SJosef Bacik 
338083bd7e5SJosef Bacik 	if (fs_info)
339083bd7e5SJosef Bacik 		s_id = fs_info->sb->s_id;
340083bd7e5SJosef Bacik 
341083bd7e5SJosef Bacik 	va_start(args, fmt);
342083bd7e5SJosef Bacik 	vaf.va = &args;
343083bd7e5SJosef Bacik 
344083bd7e5SJosef Bacik 	errstr = btrfs_decode_error(errno);
345083bd7e5SJosef Bacik 	if (fs_info && (btrfs_test_opt(fs_info, PANIC_ON_FATAL_ERROR)))
346083bd7e5SJosef Bacik 		panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (errno=%d %s)\n",
347083bd7e5SJosef Bacik 			s_id, function, line, &vaf, errno, errstr);
348083bd7e5SJosef Bacik 
349083bd7e5SJosef Bacik 	btrfs_crit(fs_info, "panic in %s:%d: %pV (errno=%d %s)",
350083bd7e5SJosef Bacik 		   function, line, &vaf, errno, errstr);
351083bd7e5SJosef Bacik 	va_end(args);
352083bd7e5SJosef Bacik 	/* Caller calls BUG() */
353083bd7e5SJosef Bacik }
354