xfs_error.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
  4. * All Rights Reserved.
  5. */
  6. #ifndef __XFS_ERROR_H__
  7. #define __XFS_ERROR_H__
  8. struct xfs_mount;
  9. extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp,
  10. const char *filename, int linenum,
  11. xfs_failaddr_t failaddr);
  12. extern void xfs_corruption_error(const char *tag, int level,
  13. struct xfs_mount *mp, const void *buf, size_t bufsize,
  14. const char *filename, int linenum,
  15. xfs_failaddr_t failaddr);
  16. void xfs_buf_corruption_error(struct xfs_buf *bp, xfs_failaddr_t fa);
  17. extern void xfs_buf_verifier_error(struct xfs_buf *bp, int error,
  18. const char *name, const void *buf, size_t bufsz,
  19. xfs_failaddr_t failaddr);
  20. extern void xfs_verifier_error(struct xfs_buf *bp, int error,
  21. xfs_failaddr_t failaddr);
  22. extern void xfs_inode_verifier_error(struct xfs_inode *ip, int error,
  23. const char *name, const void *buf, size_t bufsz,
  24. xfs_failaddr_t failaddr);
  25. #define XFS_ERROR_REPORT(e, lvl, mp) \
  26. xfs_error_report(e, lvl, mp, __FILE__, __LINE__, __return_address)
  27. #define XFS_CORRUPTION_ERROR(e, lvl, mp, buf, bufsize) \
  28. xfs_corruption_error(e, lvl, mp, buf, bufsize, \
  29. __FILE__, __LINE__, __return_address)
  30. #define XFS_ERRLEVEL_OFF 0
  31. #define XFS_ERRLEVEL_LOW 1
  32. #define XFS_ERRLEVEL_HIGH 5
  33. /* Dump 128 bytes of any corrupt buffer */
  34. #define XFS_CORRUPTION_DUMP_LEN (128)
  35. #ifdef DEBUG
  36. extern int xfs_errortag_init(struct xfs_mount *mp);
  37. extern void xfs_errortag_del(struct xfs_mount *mp);
  38. extern bool xfs_errortag_test(struct xfs_mount *mp, const char *expression,
  39. const char *file, int line, unsigned int error_tag);
  40. #define XFS_TEST_ERROR(expr, mp, tag) \
  41. ((expr) || xfs_errortag_test((mp), #expr, __FILE__, __LINE__, (tag)))
  42. bool xfs_errortag_enabled(struct xfs_mount *mp, unsigned int tag);
  43. #define XFS_ERRORTAG_DELAY(mp, tag) \
  44. do { \
  45. might_sleep(); \
  46. if (!xfs_errortag_enabled((mp), (tag))) \
  47. break; \
  48. xfs_warn_ratelimited((mp), \
  49. "Injecting %ums delay at file %s, line %d, on filesystem \"%s\"", \
  50. (mp)->m_errortag[(tag)], __FILE__, __LINE__, \
  51. (mp)->m_super->s_id); \
  52. mdelay((mp)->m_errortag[(tag)]); \
  53. } while (0)
  54. extern int xfs_errortag_get(struct xfs_mount *mp, unsigned int error_tag);
  55. extern int xfs_errortag_set(struct xfs_mount *mp, unsigned int error_tag,
  56. unsigned int tag_value);
  57. extern int xfs_errortag_add(struct xfs_mount *mp, unsigned int error_tag);
  58. extern int xfs_errortag_clearall(struct xfs_mount *mp);
  59. #else
  60. #define xfs_errortag_init(mp) (0)
  61. #define xfs_errortag_del(mp)
  62. #define XFS_TEST_ERROR(expr, mp, tag) (expr)
  63. #define XFS_ERRORTAG_DELAY(mp, tag) ((void)0)
  64. #define xfs_errortag_set(mp, tag, val) (ENOSYS)
  65. #define xfs_errortag_add(mp, tag) (ENOSYS)
  66. #define xfs_errortag_clearall(mp) (ENOSYS)
  67. #endif /* DEBUG */
  68. /*
  69. * XFS panic tags -- allow a call to xfs_alert_tag() be turned into
  70. * a panic by setting fs.xfs.panic_mask in a sysctl.
  71. */
  72. #define XFS_NO_PTAG 0u
  73. #define XFS_PTAG_IFLUSH (1u << 0)
  74. #define XFS_PTAG_LOGRES (1u << 1)
  75. #define XFS_PTAG_AILDELETE (1u << 2)
  76. #define XFS_PTAG_ERROR_REPORT (1u << 3)
  77. #define XFS_PTAG_SHUTDOWN_CORRUPT (1u << 4)
  78. #define XFS_PTAG_SHUTDOWN_IOERROR (1u << 5)
  79. #define XFS_PTAG_SHUTDOWN_LOGERROR (1u << 6)
  80. #define XFS_PTAG_FSBLOCK_ZERO (1u << 7)
  81. #define XFS_PTAG_VERIFIER_ERROR (1u << 8)
  82. #define XFS_PTAG_MASK (XFS_PTAG_IFLUSH | \
  83. XFS_PTAG_LOGRES | \
  84. XFS_PTAG_AILDELETE | \
  85. XFS_PTAG_ERROR_REPORT | \
  86. XFS_PTAG_SHUTDOWN_CORRUPT | \
  87. XFS_PTAG_SHUTDOWN_IOERROR | \
  88. XFS_PTAG_SHUTDOWN_LOGERROR | \
  89. XFS_PTAG_FSBLOCK_ZERO | \
  90. XFS_PTAG_VERIFIER_ERROR)
  91. #define XFS_PTAG_STRINGS \
  92. { XFS_NO_PTAG, "none" }, \
  93. { XFS_PTAG_IFLUSH, "iflush" }, \
  94. { XFS_PTAG_LOGRES, "logres" }, \
  95. { XFS_PTAG_AILDELETE, "aildelete" }, \
  96. { XFS_PTAG_ERROR_REPORT , "error_report" }, \
  97. { XFS_PTAG_SHUTDOWN_CORRUPT, "corrupt" }, \
  98. { XFS_PTAG_SHUTDOWN_IOERROR, "ioerror" }, \
  99. { XFS_PTAG_SHUTDOWN_LOGERROR, "logerror" }, \
  100. { XFS_PTAG_FSBLOCK_ZERO, "fsb_zero" }, \
  101. { XFS_PTAG_VERIFIER_ERROR, "verifier" }
  102. #endif /* __XFS_ERROR_H__ */