xfs_error.c (13249B)
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_errortag.h" 14#include "xfs_error.h" 15#include "xfs_sysfs.h" 16#include "xfs_inode.h" 17 18#ifdef DEBUG 19 20static unsigned int xfs_errortag_random_default[] = { 21 XFS_RANDOM_DEFAULT, 22 XFS_RANDOM_IFLUSH_1, 23 XFS_RANDOM_IFLUSH_2, 24 XFS_RANDOM_IFLUSH_3, 25 XFS_RANDOM_IFLUSH_4, 26 XFS_RANDOM_IFLUSH_5, 27 XFS_RANDOM_IFLUSH_6, 28 XFS_RANDOM_DA_READ_BUF, 29 XFS_RANDOM_BTREE_CHECK_LBLOCK, 30 XFS_RANDOM_BTREE_CHECK_SBLOCK, 31 XFS_RANDOM_ALLOC_READ_AGF, 32 XFS_RANDOM_IALLOC_READ_AGI, 33 XFS_RANDOM_ITOBP_INOTOBP, 34 XFS_RANDOM_IUNLINK, 35 XFS_RANDOM_IUNLINK_REMOVE, 36 XFS_RANDOM_DIR_INO_VALIDATE, 37 XFS_RANDOM_BULKSTAT_READ_CHUNK, 38 XFS_RANDOM_IODONE_IOERR, 39 XFS_RANDOM_STRATREAD_IOERR, 40 XFS_RANDOM_STRATCMPL_IOERR, 41 XFS_RANDOM_DIOWRITE_IOERR, 42 XFS_RANDOM_BMAPIFORMAT, 43 XFS_RANDOM_FREE_EXTENT, 44 XFS_RANDOM_RMAP_FINISH_ONE, 45 XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE, 46 XFS_RANDOM_REFCOUNT_FINISH_ONE, 47 XFS_RANDOM_BMAP_FINISH_ONE, 48 XFS_RANDOM_AG_RESV_CRITICAL, 49 XFS_RANDOM_DROP_WRITES, 50 XFS_RANDOM_LOG_BAD_CRC, 51 XFS_RANDOM_LOG_ITEM_PIN, 52 XFS_RANDOM_BUF_LRU_REF, 53 XFS_RANDOM_FORCE_SCRUB_REPAIR, 54 XFS_RANDOM_FORCE_SUMMARY_RECALC, 55 XFS_RANDOM_IUNLINK_FALLBACK, 56 XFS_RANDOM_BUF_IOERROR, 57 XFS_RANDOM_REDUCE_MAX_IEXTENTS, 58 XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT, 59 XFS_RANDOM_AG_RESV_FAIL, 60 XFS_RANDOM_LARP, 61 XFS_RANDOM_DA_LEAF_SPLIT, 62 XFS_RANDOM_ATTR_LEAF_TO_NODE, 63}; 64 65struct xfs_errortag_attr { 66 struct attribute attr; 67 unsigned int tag; 68}; 69 70static inline struct xfs_errortag_attr * 71to_attr(struct attribute *attr) 72{ 73 return container_of(attr, struct xfs_errortag_attr, attr); 74} 75 76static inline struct xfs_mount * 77to_mp(struct kobject *kobject) 78{ 79 struct xfs_kobj *kobj = to_kobj(kobject); 80 81 return container_of(kobj, struct xfs_mount, m_errortag_kobj); 82} 83 84STATIC ssize_t 85xfs_errortag_attr_store( 86 struct kobject *kobject, 87 struct attribute *attr, 88 const char *buf, 89 size_t count) 90{ 91 struct xfs_mount *mp = to_mp(kobject); 92 struct xfs_errortag_attr *xfs_attr = to_attr(attr); 93 int ret; 94 unsigned int val; 95 96 if (strcmp(buf, "default") == 0) { 97 val = xfs_errortag_random_default[xfs_attr->tag]; 98 } else { 99 ret = kstrtouint(buf, 0, &val); 100 if (ret) 101 return ret; 102 } 103 104 ret = xfs_errortag_set(mp, xfs_attr->tag, val); 105 if (ret) 106 return ret; 107 return count; 108} 109 110STATIC ssize_t 111xfs_errortag_attr_show( 112 struct kobject *kobject, 113 struct attribute *attr, 114 char *buf) 115{ 116 struct xfs_mount *mp = to_mp(kobject); 117 struct xfs_errortag_attr *xfs_attr = to_attr(attr); 118 119 return snprintf(buf, PAGE_SIZE, "%u\n", 120 xfs_errortag_get(mp, xfs_attr->tag)); 121} 122 123static const struct sysfs_ops xfs_errortag_sysfs_ops = { 124 .show = xfs_errortag_attr_show, 125 .store = xfs_errortag_attr_store, 126}; 127 128#define XFS_ERRORTAG_ATTR_RW(_name, _tag) \ 129static struct xfs_errortag_attr xfs_errortag_attr_##_name = { \ 130 .attr = {.name = __stringify(_name), \ 131 .mode = VERIFY_OCTAL_PERMISSIONS(S_IWUSR | S_IRUGO) }, \ 132 .tag = (_tag), \ 133} 134 135#define XFS_ERRORTAG_ATTR_LIST(_name) &xfs_errortag_attr_##_name.attr 136 137XFS_ERRORTAG_ATTR_RW(noerror, XFS_ERRTAG_NOERROR); 138XFS_ERRORTAG_ATTR_RW(iflush1, XFS_ERRTAG_IFLUSH_1); 139XFS_ERRORTAG_ATTR_RW(iflush2, XFS_ERRTAG_IFLUSH_2); 140XFS_ERRORTAG_ATTR_RW(iflush3, XFS_ERRTAG_IFLUSH_3); 141XFS_ERRORTAG_ATTR_RW(iflush4, XFS_ERRTAG_IFLUSH_4); 142XFS_ERRORTAG_ATTR_RW(iflush5, XFS_ERRTAG_IFLUSH_5); 143XFS_ERRORTAG_ATTR_RW(iflush6, XFS_ERRTAG_IFLUSH_6); 144XFS_ERRORTAG_ATTR_RW(dareadbuf, XFS_ERRTAG_DA_READ_BUF); 145XFS_ERRORTAG_ATTR_RW(btree_chk_lblk, XFS_ERRTAG_BTREE_CHECK_LBLOCK); 146XFS_ERRORTAG_ATTR_RW(btree_chk_sblk, XFS_ERRTAG_BTREE_CHECK_SBLOCK); 147XFS_ERRORTAG_ATTR_RW(readagf, XFS_ERRTAG_ALLOC_READ_AGF); 148XFS_ERRORTAG_ATTR_RW(readagi, XFS_ERRTAG_IALLOC_READ_AGI); 149XFS_ERRORTAG_ATTR_RW(itobp, XFS_ERRTAG_ITOBP_INOTOBP); 150XFS_ERRORTAG_ATTR_RW(iunlink, XFS_ERRTAG_IUNLINK); 151XFS_ERRORTAG_ATTR_RW(iunlinkrm, XFS_ERRTAG_IUNLINK_REMOVE); 152XFS_ERRORTAG_ATTR_RW(dirinovalid, XFS_ERRTAG_DIR_INO_VALIDATE); 153XFS_ERRORTAG_ATTR_RW(bulkstat, XFS_ERRTAG_BULKSTAT_READ_CHUNK); 154XFS_ERRORTAG_ATTR_RW(logiodone, XFS_ERRTAG_IODONE_IOERR); 155XFS_ERRORTAG_ATTR_RW(stratread, XFS_ERRTAG_STRATREAD_IOERR); 156XFS_ERRORTAG_ATTR_RW(stratcmpl, XFS_ERRTAG_STRATCMPL_IOERR); 157XFS_ERRORTAG_ATTR_RW(diowrite, XFS_ERRTAG_DIOWRITE_IOERR); 158XFS_ERRORTAG_ATTR_RW(bmapifmt, XFS_ERRTAG_BMAPIFORMAT); 159XFS_ERRORTAG_ATTR_RW(free_extent, XFS_ERRTAG_FREE_EXTENT); 160XFS_ERRORTAG_ATTR_RW(rmap_finish_one, XFS_ERRTAG_RMAP_FINISH_ONE); 161XFS_ERRORTAG_ATTR_RW(refcount_continue_update, XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE); 162XFS_ERRORTAG_ATTR_RW(refcount_finish_one, XFS_ERRTAG_REFCOUNT_FINISH_ONE); 163XFS_ERRORTAG_ATTR_RW(bmap_finish_one, XFS_ERRTAG_BMAP_FINISH_ONE); 164XFS_ERRORTAG_ATTR_RW(ag_resv_critical, XFS_ERRTAG_AG_RESV_CRITICAL); 165XFS_ERRORTAG_ATTR_RW(drop_writes, XFS_ERRTAG_DROP_WRITES); 166XFS_ERRORTAG_ATTR_RW(log_bad_crc, XFS_ERRTAG_LOG_BAD_CRC); 167XFS_ERRORTAG_ATTR_RW(log_item_pin, XFS_ERRTAG_LOG_ITEM_PIN); 168XFS_ERRORTAG_ATTR_RW(buf_lru_ref, XFS_ERRTAG_BUF_LRU_REF); 169XFS_ERRORTAG_ATTR_RW(force_repair, XFS_ERRTAG_FORCE_SCRUB_REPAIR); 170XFS_ERRORTAG_ATTR_RW(bad_summary, XFS_ERRTAG_FORCE_SUMMARY_RECALC); 171XFS_ERRORTAG_ATTR_RW(iunlink_fallback, XFS_ERRTAG_IUNLINK_FALLBACK); 172XFS_ERRORTAG_ATTR_RW(buf_ioerror, XFS_ERRTAG_BUF_IOERROR); 173XFS_ERRORTAG_ATTR_RW(reduce_max_iextents, XFS_ERRTAG_REDUCE_MAX_IEXTENTS); 174XFS_ERRORTAG_ATTR_RW(bmap_alloc_minlen_extent, XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT); 175XFS_ERRORTAG_ATTR_RW(ag_resv_fail, XFS_ERRTAG_AG_RESV_FAIL); 176XFS_ERRORTAG_ATTR_RW(larp, XFS_ERRTAG_LARP); 177XFS_ERRORTAG_ATTR_RW(da_leaf_split, XFS_ERRTAG_DA_LEAF_SPLIT); 178XFS_ERRORTAG_ATTR_RW(attr_leaf_to_node, XFS_ERRTAG_ATTR_LEAF_TO_NODE); 179 180static struct attribute *xfs_errortag_attrs[] = { 181 XFS_ERRORTAG_ATTR_LIST(noerror), 182 XFS_ERRORTAG_ATTR_LIST(iflush1), 183 XFS_ERRORTAG_ATTR_LIST(iflush2), 184 XFS_ERRORTAG_ATTR_LIST(iflush3), 185 XFS_ERRORTAG_ATTR_LIST(iflush4), 186 XFS_ERRORTAG_ATTR_LIST(iflush5), 187 XFS_ERRORTAG_ATTR_LIST(iflush6), 188 XFS_ERRORTAG_ATTR_LIST(dareadbuf), 189 XFS_ERRORTAG_ATTR_LIST(btree_chk_lblk), 190 XFS_ERRORTAG_ATTR_LIST(btree_chk_sblk), 191 XFS_ERRORTAG_ATTR_LIST(readagf), 192 XFS_ERRORTAG_ATTR_LIST(readagi), 193 XFS_ERRORTAG_ATTR_LIST(itobp), 194 XFS_ERRORTAG_ATTR_LIST(iunlink), 195 XFS_ERRORTAG_ATTR_LIST(iunlinkrm), 196 XFS_ERRORTAG_ATTR_LIST(dirinovalid), 197 XFS_ERRORTAG_ATTR_LIST(bulkstat), 198 XFS_ERRORTAG_ATTR_LIST(logiodone), 199 XFS_ERRORTAG_ATTR_LIST(stratread), 200 XFS_ERRORTAG_ATTR_LIST(stratcmpl), 201 XFS_ERRORTAG_ATTR_LIST(diowrite), 202 XFS_ERRORTAG_ATTR_LIST(bmapifmt), 203 XFS_ERRORTAG_ATTR_LIST(free_extent), 204 XFS_ERRORTAG_ATTR_LIST(rmap_finish_one), 205 XFS_ERRORTAG_ATTR_LIST(refcount_continue_update), 206 XFS_ERRORTAG_ATTR_LIST(refcount_finish_one), 207 XFS_ERRORTAG_ATTR_LIST(bmap_finish_one), 208 XFS_ERRORTAG_ATTR_LIST(ag_resv_critical), 209 XFS_ERRORTAG_ATTR_LIST(drop_writes), 210 XFS_ERRORTAG_ATTR_LIST(log_bad_crc), 211 XFS_ERRORTAG_ATTR_LIST(log_item_pin), 212 XFS_ERRORTAG_ATTR_LIST(buf_lru_ref), 213 XFS_ERRORTAG_ATTR_LIST(force_repair), 214 XFS_ERRORTAG_ATTR_LIST(bad_summary), 215 XFS_ERRORTAG_ATTR_LIST(iunlink_fallback), 216 XFS_ERRORTAG_ATTR_LIST(buf_ioerror), 217 XFS_ERRORTAG_ATTR_LIST(reduce_max_iextents), 218 XFS_ERRORTAG_ATTR_LIST(bmap_alloc_minlen_extent), 219 XFS_ERRORTAG_ATTR_LIST(ag_resv_fail), 220 XFS_ERRORTAG_ATTR_LIST(larp), 221 XFS_ERRORTAG_ATTR_LIST(da_leaf_split), 222 XFS_ERRORTAG_ATTR_LIST(attr_leaf_to_node), 223 NULL, 224}; 225ATTRIBUTE_GROUPS(xfs_errortag); 226 227static struct kobj_type xfs_errortag_ktype = { 228 .release = xfs_sysfs_release, 229 .sysfs_ops = &xfs_errortag_sysfs_ops, 230 .default_groups = xfs_errortag_groups, 231}; 232 233int 234xfs_errortag_init( 235 struct xfs_mount *mp) 236{ 237 mp->m_errortag = kmem_zalloc(sizeof(unsigned int) * XFS_ERRTAG_MAX, 238 KM_MAYFAIL); 239 if (!mp->m_errortag) 240 return -ENOMEM; 241 242 return xfs_sysfs_init(&mp->m_errortag_kobj, &xfs_errortag_ktype, 243 &mp->m_kobj, "errortag"); 244} 245 246void 247xfs_errortag_del( 248 struct xfs_mount *mp) 249{ 250 xfs_sysfs_del(&mp->m_errortag_kobj); 251 kmem_free(mp->m_errortag); 252} 253 254bool 255xfs_errortag_test( 256 struct xfs_mount *mp, 257 const char *expression, 258 const char *file, 259 int line, 260 unsigned int error_tag) 261{ 262 unsigned int randfactor; 263 264 /* 265 * To be able to use error injection anywhere, we need to ensure error 266 * injection mechanism is already initialized. 267 * 268 * Code paths like I/O completion can be called before the 269 * initialization is complete, but be able to inject errors in such 270 * places is still useful. 271 */ 272 if (!mp->m_errortag) 273 return false; 274 275 ASSERT(error_tag < XFS_ERRTAG_MAX); 276 randfactor = mp->m_errortag[error_tag]; 277 if (!randfactor || prandom_u32() % randfactor) 278 return false; 279 280 xfs_warn_ratelimited(mp, 281"Injecting error (%s) at file %s, line %d, on filesystem \"%s\"", 282 expression, file, line, mp->m_super->s_id); 283 return true; 284} 285 286int 287xfs_errortag_get( 288 struct xfs_mount *mp, 289 unsigned int error_tag) 290{ 291 if (error_tag >= XFS_ERRTAG_MAX) 292 return -EINVAL; 293 294 return mp->m_errortag[error_tag]; 295} 296 297int 298xfs_errortag_set( 299 struct xfs_mount *mp, 300 unsigned int error_tag, 301 unsigned int tag_value) 302{ 303 if (error_tag >= XFS_ERRTAG_MAX) 304 return -EINVAL; 305 306 mp->m_errortag[error_tag] = tag_value; 307 return 0; 308} 309 310int 311xfs_errortag_add( 312 struct xfs_mount *mp, 313 unsigned int error_tag) 314{ 315 BUILD_BUG_ON(ARRAY_SIZE(xfs_errortag_random_default) != XFS_ERRTAG_MAX); 316 317 if (error_tag >= XFS_ERRTAG_MAX) 318 return -EINVAL; 319 320 return xfs_errortag_set(mp, error_tag, 321 xfs_errortag_random_default[error_tag]); 322} 323 324int 325xfs_errortag_clearall( 326 struct xfs_mount *mp) 327{ 328 memset(mp->m_errortag, 0, sizeof(unsigned int) * XFS_ERRTAG_MAX); 329 return 0; 330} 331#endif /* DEBUG */ 332 333void 334xfs_error_report( 335 const char *tag, 336 int level, 337 struct xfs_mount *mp, 338 const char *filename, 339 int linenum, 340 xfs_failaddr_t failaddr) 341{ 342 if (level <= xfs_error_level) { 343 xfs_alert_tag(mp, XFS_PTAG_ERROR_REPORT, 344 "Internal error %s at line %d of file %s. Caller %pS", 345 tag, linenum, filename, failaddr); 346 347 xfs_stack_trace(); 348 } 349} 350 351void 352xfs_corruption_error( 353 const char *tag, 354 int level, 355 struct xfs_mount *mp, 356 const void *buf, 357 size_t bufsize, 358 const char *filename, 359 int linenum, 360 xfs_failaddr_t failaddr) 361{ 362 if (buf && level <= xfs_error_level) 363 xfs_hex_dump(buf, bufsize); 364 xfs_error_report(tag, level, mp, filename, linenum, failaddr); 365 xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair"); 366} 367 368/* 369 * Complain about the kinds of metadata corruption that we can't detect from a 370 * verifier, such as incorrect inter-block relationship data. Does not set 371 * bp->b_error. 372 * 373 * Call xfs_buf_mark_corrupt, not this function. 374 */ 375void 376xfs_buf_corruption_error( 377 struct xfs_buf *bp, 378 xfs_failaddr_t fa) 379{ 380 struct xfs_mount *mp = bp->b_mount; 381 382 xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR, 383 "Metadata corruption detected at %pS, %s block 0x%llx", 384 fa, bp->b_ops->name, xfs_buf_daddr(bp)); 385 386 xfs_alert(mp, "Unmount and run xfs_repair"); 387 388 if (xfs_error_level >= XFS_ERRLEVEL_HIGH) 389 xfs_stack_trace(); 390} 391 392/* 393 * Warnings specifically for verifier errors. Differentiate CRC vs. invalid 394 * values, and omit the stack trace unless the error level is tuned high. 395 */ 396void 397xfs_buf_verifier_error( 398 struct xfs_buf *bp, 399 int error, 400 const char *name, 401 const void *buf, 402 size_t bufsz, 403 xfs_failaddr_t failaddr) 404{ 405 struct xfs_mount *mp = bp->b_mount; 406 xfs_failaddr_t fa; 407 int sz; 408 409 fa = failaddr ? failaddr : __return_address; 410 __xfs_buf_ioerror(bp, error, fa); 411 412 xfs_alert_tag(mp, XFS_PTAG_VERIFIER_ERROR, 413 "Metadata %s detected at %pS, %s block 0x%llx %s", 414 bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", 415 fa, bp->b_ops->name, xfs_buf_daddr(bp), name); 416 417 xfs_alert(mp, "Unmount and run xfs_repair"); 418 419 if (xfs_error_level >= XFS_ERRLEVEL_LOW) { 420 sz = min_t(size_t, XFS_CORRUPTION_DUMP_LEN, bufsz); 421 xfs_alert(mp, "First %d bytes of corrupted metadata buffer:", 422 sz); 423 xfs_hex_dump(buf, sz); 424 } 425 426 if (xfs_error_level >= XFS_ERRLEVEL_HIGH) 427 xfs_stack_trace(); 428} 429 430/* 431 * Warnings specifically for verifier errors. Differentiate CRC vs. invalid 432 * values, and omit the stack trace unless the error level is tuned high. 433 */ 434void 435xfs_verifier_error( 436 struct xfs_buf *bp, 437 int error, 438 xfs_failaddr_t failaddr) 439{ 440 return xfs_buf_verifier_error(bp, error, "", xfs_buf_offset(bp, 0), 441 XFS_CORRUPTION_DUMP_LEN, failaddr); 442} 443 444/* 445 * Warnings for inode corruption problems. Don't bother with the stack 446 * trace unless the error level is turned up high. 447 */ 448void 449xfs_inode_verifier_error( 450 struct xfs_inode *ip, 451 int error, 452 const char *name, 453 const void *buf, 454 size_t bufsz, 455 xfs_failaddr_t failaddr) 456{ 457 struct xfs_mount *mp = ip->i_mount; 458 xfs_failaddr_t fa; 459 int sz; 460 461 fa = failaddr ? failaddr : __return_address; 462 463 xfs_alert(mp, "Metadata %s detected at %pS, inode 0x%llx %s", 464 error == -EFSBADCRC ? "CRC error" : "corruption", 465 fa, ip->i_ino, name); 466 467 xfs_alert(mp, "Unmount and run xfs_repair"); 468 469 if (buf && xfs_error_level >= XFS_ERRLEVEL_LOW) { 470 sz = min_t(size_t, XFS_CORRUPTION_DUMP_LEN, bufsz); 471 xfs_alert(mp, "First %d bytes of corrupted metadata buffer:", 472 sz); 473 xfs_hex_dump(buf, sz); 474 } 475 476 if (xfs_error_level >= XFS_ERRLEVEL_HIGH) 477 xfs_stack_trace(); 478}