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