xref: /linux/fs/xfs/xfs_error.c (revision e445fba2d76369d72b497ecadf6b9787930693d9)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6 #include "xfs.h"
7 #include "xfs_shared.h"
8 #include "xfs_format.h"
9 #include "xfs_fs.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_error.h"
14 #include "xfs_sysfs.h"
15 #include "xfs_inode.h"
16 
17 #ifdef DEBUG
18 
19 #define XFS_ERRTAG(_tag, _name, _default) \
20 	[XFS_ERRTAG_##_tag]	= (_default),
21 #include "xfs_errortag.h"
22 static const unsigned int xfs_errortag_random_default[] = { XFS_ERRTAGS };
23 #undef XFS_ERRTAG
24 
25 struct xfs_errortag_attr {
26 	struct attribute	attr;
27 	unsigned int		tag;
28 };
29 
30 static inline struct xfs_errortag_attr *
to_attr(struct attribute * attr)31 to_attr(struct attribute *attr)
32 {
33 	return container_of(attr, struct xfs_errortag_attr, attr);
34 }
35 
36 static inline struct xfs_mount *
to_mp(struct kobject * kobject)37 to_mp(struct kobject *kobject)
38 {
39 	struct xfs_kobj *kobj = to_kobj(kobject);
40 
41 	return container_of(kobj, struct xfs_mount, m_errortag_kobj);
42 }
43 
44 STATIC ssize_t
xfs_errortag_attr_store(struct kobject * kobject,struct attribute * attr,const char * buf,size_t count)45 xfs_errortag_attr_store(
46 	struct kobject		*kobject,
47 	struct attribute	*attr,
48 	const char		*buf,
49 	size_t			count)
50 {
51 	struct xfs_mount	*mp = to_mp(kobject);
52 	unsigned int		error_tag = to_attr(attr)->tag;
53 	int			ret;
54 
55 	if (strcmp(buf, "default") == 0) {
56 		mp->m_errortag[error_tag] =
57 			xfs_errortag_random_default[error_tag];
58 	} else {
59 		ret = kstrtouint(buf, 0, &mp->m_errortag[error_tag]);
60 		if (ret)
61 			return ret;
62 	}
63 
64 	return count;
65 }
66 
67 STATIC ssize_t
xfs_errortag_attr_show(struct kobject * kobject,struct attribute * attr,char * buf)68 xfs_errortag_attr_show(
69 	struct kobject		*kobject,
70 	struct attribute	*attr,
71 	char			*buf)
72 {
73 	struct xfs_mount	*mp = to_mp(kobject);
74 	unsigned int		error_tag = to_attr(attr)->tag;
75 
76 	return snprintf(buf, PAGE_SIZE, "%u\n", mp->m_errortag[error_tag]);
77 }
78 
79 static const struct sysfs_ops xfs_errortag_sysfs_ops = {
80 	.show = xfs_errortag_attr_show,
81 	.store = xfs_errortag_attr_store,
82 };
83 
84 #define XFS_ERRTAG(_tag, _name, _default)				\
85 static struct xfs_errortag_attr xfs_errortag_attr_##_name = {		\
86 	.attr = {.name = __stringify(_name),				\
87 		 .mode = VERIFY_OCTAL_PERMISSIONS(S_IWUSR | S_IRUGO) },	\
88 	.tag	= XFS_ERRTAG_##_tag,					\
89 };
90 #include "xfs_errortag.h"
91 XFS_ERRTAGS
92 #undef XFS_ERRTAG
93 
94 #define XFS_ERRTAG(_tag, _name, _default) \
95 	&xfs_errortag_attr_##_name.attr,
96 #include "xfs_errortag.h"
97 static struct attribute *xfs_errortag_attrs[] = {
98 	XFS_ERRTAGS
99 	NULL
100 };
101 ATTRIBUTE_GROUPS(xfs_errortag);
102 #undef XFS_ERRTAG
103 
104 /* -1 because XFS_ERRTAG_DROP_WRITES got removed, + 1 for NULL termination */
105 static_assert(ARRAY_SIZE(xfs_errortag_attrs) == XFS_ERRTAG_MAX);
106 
107 static const struct kobj_type xfs_errortag_ktype = {
108 	.release = xfs_sysfs_release,
109 	.sysfs_ops = &xfs_errortag_sysfs_ops,
110 	.default_groups = xfs_errortag_groups,
111 };
112 
113 int
xfs_errortag_init(struct xfs_mount * mp)114 xfs_errortag_init(
115 	struct xfs_mount	*mp)
116 {
117 	int ret;
118 
119 	mp->m_errortag = kzalloc(sizeof(unsigned int) * XFS_ERRTAG_MAX,
120 				GFP_KERNEL | __GFP_RETRY_MAYFAIL);
121 	if (!mp->m_errortag)
122 		return -ENOMEM;
123 
124 	ret = xfs_sysfs_init(&mp->m_errortag_kobj, &xfs_errortag_ktype,
125 				&mp->m_kobj, "errortag");
126 	if (ret)
127 		kfree(mp->m_errortag);
128 	return ret;
129 }
130 
131 void
xfs_errortag_del(struct xfs_mount * mp)132 xfs_errortag_del(
133 	struct xfs_mount	*mp)
134 {
135 	xfs_sysfs_del(&mp->m_errortag_kobj);
136 	kfree(mp->m_errortag);
137 }
138 
139 static bool
xfs_errortag_valid(unsigned int error_tag)140 xfs_errortag_valid(
141 	unsigned int		error_tag)
142 {
143 	if (error_tag >= XFS_ERRTAG_MAX)
144 		return false;
145 
146 	/* Error out removed injection types */
147 	if (error_tag == XFS_ERRTAG_DROP_WRITES)
148 		return false;
149 	return true;
150 }
151 
152 bool
xfs_errortag_enabled(struct xfs_mount * mp,unsigned int tag)153 xfs_errortag_enabled(
154 	struct xfs_mount	*mp,
155 	unsigned int		tag)
156 {
157 	if (!mp->m_errortag)
158 		return false;
159 	if (!xfs_errortag_valid(tag))
160 		return false;
161 
162 	return mp->m_errortag[tag] != 0;
163 }
164 
165 bool
xfs_errortag_test(struct xfs_mount * mp,const char * file,int line,unsigned int error_tag)166 xfs_errortag_test(
167 	struct xfs_mount	*mp,
168 	const char		*file,
169 	int			line,
170 	unsigned int		error_tag)
171 {
172 	unsigned int		randfactor;
173 
174 	/*
175 	 * To be able to use error injection anywhere, we need to ensure error
176 	 * injection mechanism is already initialized.
177 	 *
178 	 * Code paths like I/O completion can be called before the
179 	 * initialization is complete, but be able to inject errors in such
180 	 * places is still useful.
181 	 */
182 	if (!mp->m_errortag)
183 		return false;
184 
185 	if (!xfs_errortag_valid(error_tag))
186 		return false;
187 
188 	randfactor = mp->m_errortag[error_tag];
189 	if (!randfactor || get_random_u32_below(randfactor))
190 		return false;
191 
192 	xfs_warn_ratelimited(mp,
193 "Injecting error at file %s, line %d, on filesystem \"%s\"",
194 			file, line, mp->m_super->s_id);
195 	return true;
196 }
197 
198 int
xfs_errortag_add(struct xfs_mount * mp,unsigned int error_tag)199 xfs_errortag_add(
200 	struct xfs_mount	*mp,
201 	unsigned int		error_tag)
202 {
203 	BUILD_BUG_ON(ARRAY_SIZE(xfs_errortag_random_default) != XFS_ERRTAG_MAX);
204 
205 	if (!xfs_errortag_valid(error_tag))
206 		return -EINVAL;
207 	mp->m_errortag[error_tag] = xfs_errortag_random_default[error_tag];
208 	return 0;
209 }
210 
211 int
xfs_errortag_clearall(struct xfs_mount * mp)212 xfs_errortag_clearall(
213 	struct xfs_mount	*mp)
214 {
215 	memset(mp->m_errortag, 0, sizeof(unsigned int) * XFS_ERRTAG_MAX);
216 	return 0;
217 }
218 #endif /* DEBUG */
219 
220 void
xfs_error_report(const char * tag,int level,struct xfs_mount * mp,const char * filename,int linenum,xfs_failaddr_t failaddr)221 xfs_error_report(
222 	const char		*tag,
223 	int			level,
224 	struct xfs_mount	*mp,
225 	const char		*filename,
226 	int			linenum,
227 	xfs_failaddr_t		failaddr)
228 {
229 	if (level <= xfs_error_level) {
230 		xfs_alert_tag(mp, XFS_PTAG_ERROR_REPORT,
231 		"Internal error %s at line %d of file %s.  Caller %pS",
232 			    tag, linenum, filename, failaddr);
233 
234 		xfs_stack_trace();
235 	}
236 }
237 
238 void
xfs_corruption_error(const char * tag,int level,struct xfs_mount * mp,const void * buf,size_t bufsize,const char * filename,int linenum,xfs_failaddr_t failaddr)239 xfs_corruption_error(
240 	const char		*tag,
241 	int			level,
242 	struct xfs_mount	*mp,
243 	const void		*buf,
244 	size_t			bufsize,
245 	const char		*filename,
246 	int			linenum,
247 	xfs_failaddr_t		failaddr)
248 {
249 	if (buf && level <= xfs_error_level)
250 		xfs_hex_dump(buf, bufsize);
251 	xfs_error_report(tag, level, mp, filename, linenum, failaddr);
252 	xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair");
253 }
254 
255 /*
256  * Complain about the kinds of metadata corruption that we can't detect from a
257  * verifier, such as incorrect inter-block relationship data.  Does not set
258  * bp->b_error.
259  *
260  * Call xfs_buf_mark_corrupt, not this function.
261  */
262 void
xfs_buf_corruption_error(struct xfs_buf * bp,xfs_failaddr_t fa)263 xfs_buf_corruption_error(
264 	struct xfs_buf		*bp,
265 	xfs_failaddr_t		fa)
266 {
267 	struct xfs_mount	*mp = bp->b_mount;
268 
269 	xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR,
270 		  "Metadata corruption detected at %pS, %s block 0x%llx",
271 		  fa, bp->b_ops->name, xfs_buf_daddr(bp));
272 
273 	xfs_alert(mp, "Unmount and run xfs_repair");
274 
275 	if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
276 		xfs_stack_trace();
277 }
278 
279 /*
280  * Warnings specifically for verifier errors.  Differentiate CRC vs. invalid
281  * values, and omit the stack trace unless the error level is tuned high.
282  */
283 void
xfs_buf_verifier_error(struct xfs_buf * bp,int error,const char * name,const void * buf,size_t bufsz,xfs_failaddr_t failaddr)284 xfs_buf_verifier_error(
285 	struct xfs_buf		*bp,
286 	int			error,
287 	const char		*name,
288 	const void		*buf,
289 	size_t			bufsz,
290 	xfs_failaddr_t		failaddr)
291 {
292 	struct xfs_mount	*mp = bp->b_mount;
293 	xfs_failaddr_t		fa;
294 	int			sz;
295 
296 	fa = failaddr ? failaddr : __return_address;
297 	__xfs_buf_ioerror(bp, error, fa);
298 
299 	xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR,
300 		  "Metadata %s detected at %pS, %s block 0x%llx %s",
301 		  bp->b_error == -EFSBADCRC ? "CRC error" : "corruption",
302 		  fa, bp->b_ops->name, xfs_buf_daddr(bp), name);
303 
304 	xfs_alert(mp, "Unmount and run xfs_repair");
305 
306 	if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
307 		sz = min_t(size_t, XFS_CORRUPTION_DUMP_LEN, bufsz);
308 		xfs_alert(mp, "First %d bytes of corrupted metadata buffer:",
309 				sz);
310 		xfs_hex_dump(buf, sz);
311 	}
312 
313 	if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
314 		xfs_stack_trace();
315 }
316 
317 /*
318  * Warnings specifically for verifier errors.  Differentiate CRC vs. invalid
319  * values, and omit the stack trace unless the error level is tuned high.
320  */
321 void
xfs_verifier_error(struct xfs_buf * bp,int error,xfs_failaddr_t failaddr)322 xfs_verifier_error(
323 	struct xfs_buf		*bp,
324 	int			error,
325 	xfs_failaddr_t		failaddr)
326 {
327 	return xfs_buf_verifier_error(bp, error, "", xfs_buf_offset(bp, 0),
328 			XFS_CORRUPTION_DUMP_LEN, failaddr);
329 }
330 
331 /*
332  * Warnings for inode corruption problems.  Don't bother with the stack
333  * trace unless the error level is turned up high.
334  */
335 void
xfs_inode_verifier_error(struct xfs_inode * ip,int error,const char * name,const void * buf,size_t bufsz,xfs_failaddr_t failaddr)336 xfs_inode_verifier_error(
337 	struct xfs_inode	*ip,
338 	int			error,
339 	const char		*name,
340 	const void		*buf,
341 	size_t			bufsz,
342 	xfs_failaddr_t		failaddr)
343 {
344 	struct xfs_mount	*mp = ip->i_mount;
345 	xfs_failaddr_t		fa;
346 	int			sz;
347 
348 	fa = failaddr ? failaddr : __return_address;
349 
350 	xfs_alert(mp, "Metadata %s detected at %pS, inode 0x%llx %s",
351 		  error == -EFSBADCRC ? "CRC error" : "corruption",
352 		  fa, ip->i_ino, name);
353 
354 	xfs_alert(mp, "Unmount and run xfs_repair");
355 
356 	if (buf && xfs_error_level >= XFS_ERRLEVEL_LOW) {
357 		sz = min_t(size_t, XFS_CORRUPTION_DUMP_LEN, bufsz);
358 		xfs_alert(mp, "First %d bytes of corrupted metadata buffer:",
359 				sz);
360 		xfs_hex_dump(buf, sz);
361 	}
362 
363 	if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
364 		xfs_stack_trace();
365 }
366