diff options
-rw-r--r-- | fs/xfs/xfs_error.c | 25 | ||||
-rw-r--r-- | fs/xfs/xfs_error.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_linux.h | 1 |
3 files changed, 27 insertions, 0 deletions
diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 9995b807d627..a8b2ecb5f436 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c | |||
@@ -178,3 +178,28 @@ xfs_corruption_error( | |||
178 | xfs_error_report(tag, level, mp, filename, linenum, ra); | 178 | xfs_error_report(tag, level, mp, filename, linenum, ra); |
179 | xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair"); | 179 | xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair"); |
180 | } | 180 | } |
181 | |||
182 | /* | ||
183 | * Warnings specifically for verifier errors. Differentiate CRC vs. invalid | ||
184 | * values, and omit the stack trace unless the error level is tuned high. | ||
185 | */ | ||
186 | void | ||
187 | xfs_verifier_error( | ||
188 | struct xfs_buf *bp) | ||
189 | { | ||
190 | struct xfs_mount *mp = bp->b_target->bt_mount; | ||
191 | |||
192 | xfs_alert(mp, "Metadata %s detected at %pF, block 0x%llx", | ||
193 | bp->b_error == EFSBADCRC ? "CRC error" : "corruption", | ||
194 | __return_address, bp->b_bn); | ||
195 | |||
196 | xfs_alert(mp, "Unmount and run xfs_repair"); | ||
197 | |||
198 | if (xfs_error_level >= XFS_ERRLEVEL_LOW) { | ||
199 | xfs_alert(mp, "First 64 bytes of corrupted metadata buffer:"); | ||
200 | xfs_hex_dump(xfs_buf_offset(bp, 0), 64); | ||
201 | } | ||
202 | |||
203 | if (xfs_error_level >= XFS_ERRLEVEL_HIGH) | ||
204 | xfs_stack_trace(); | ||
205 | } | ||
diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 079a367f44ee..c1c57d4a4b5d 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h | |||
@@ -34,6 +34,7 @@ extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp, | |||
34 | extern void xfs_corruption_error(const char *tag, int level, | 34 | extern void xfs_corruption_error(const char *tag, int level, |
35 | struct xfs_mount *mp, void *p, const char *filename, | 35 | struct xfs_mount *mp, void *p, const char *filename, |
36 | int linenum, inst_t *ra); | 36 | int linenum, inst_t *ra); |
37 | extern void xfs_verifier_error(struct xfs_buf *bp); | ||
37 | 38 | ||
38 | #define XFS_ERROR_REPORT(e, lvl, mp) \ | 39 | #define XFS_ERROR_REPORT(e, lvl, mp) \ |
39 | xfs_error_report(e, lvl, mp, __FILE__, __LINE__, __return_address) | 40 | xfs_error_report(e, lvl, mp, __FILE__, __LINE__, __return_address) |
diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index e8fed74dd669..825249d2dfc1 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h | |||
@@ -179,6 +179,7 @@ typedef __uint64_t __psunsigned_t; | |||
179 | #define ENOATTR ENODATA /* Attribute not found */ | 179 | #define ENOATTR ENODATA /* Attribute not found */ |
180 | #define EWRONGFS EINVAL /* Mount with wrong filesystem type */ | 180 | #define EWRONGFS EINVAL /* Mount with wrong filesystem type */ |
181 | #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ | 181 | #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ |
182 | #define EFSBADCRC EBADMSG /* Bad CRC detected */ | ||
182 | 183 | ||
183 | #define SYNCHRONIZE() barrier() | 184 | #define SYNCHRONIZE() barrier() |
184 | #define __return_address __builtin_return_address(0) | 185 | #define __return_address __builtin_return_address(0) |