Commit 6edb1810 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: refactor inode buffer verifier error logging

When the inode buffer verifier encounters an error, it's much more
helpful to print a buffer from the offending inode instead of just the
start of the inode chunk buffer.
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 90a58f95
...@@ -115,13 +115,15 @@ xfs_inode_buf_verify( ...@@ -115,13 +115,15 @@ xfs_inode_buf_verify(
return; return;
} }
xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
#ifdef DEBUG #ifdef DEBUG
xfs_alert(mp, xfs_alert(mp,
"bad inode magic/vsn daddr %lld #%d (magic=%x)", "bad inode magic/vsn daddr %lld #%d (magic=%x)",
(unsigned long long)bp->b_bn, i, (unsigned long long)bp->b_bn, i,
be16_to_cpu(dip->di_magic)); be16_to_cpu(dip->di_magic));
#endif #endif
xfs_buf_verifier_error(bp, -EFSCORRUPTED,
__func__, dip, sizeof(*dip),
NULL);
} }
} }
xfs_inobp_check(mp, bp); xfs_inobp_check(mp, bp);
......
...@@ -347,33 +347,52 @@ xfs_corruption_error( ...@@ -347,33 +347,52 @@ xfs_corruption_error(
* values, and omit the stack trace unless the error level is tuned high. * values, and omit the stack trace unless the error level is tuned high.
*/ */
void void
xfs_verifier_error( xfs_buf_verifier_error(
struct xfs_buf *bp, struct xfs_buf *bp,
int error, int error,
const char *name,
void *buf,
size_t bufsz,
xfs_failaddr_t failaddr) xfs_failaddr_t failaddr)
{ {
struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_mount *mp = bp->b_target->bt_mount;
xfs_failaddr_t fa; xfs_failaddr_t fa;
int sz;
fa = failaddr ? failaddr : __return_address; fa = failaddr ? failaddr : __return_address;
__xfs_buf_ioerror(bp, error, fa); __xfs_buf_ioerror(bp, error, fa);
xfs_alert(mp, "Metadata %s detected at %pS, %s block 0x%llx", xfs_alert(mp, "Metadata %s detected at %pS, %s block 0x%llx %s",
bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", bp->b_error == -EFSBADCRC ? "CRC error" : "corruption",
fa, bp->b_ops->name, bp->b_bn); fa, bp->b_ops->name, bp->b_bn, name);
xfs_alert(mp, "Unmount and run xfs_repair"); xfs_alert(mp, "Unmount and run xfs_repair");
if (xfs_error_level >= XFS_ERRLEVEL_LOW) { if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
sz = min_t(size_t, XFS_CORRUPTION_DUMP_LEN, bufsz);
xfs_alert(mp, "First %d bytes of corrupted metadata buffer:", xfs_alert(mp, "First %d bytes of corrupted metadata buffer:",
XFS_CORRUPTION_DUMP_LEN); sz);
xfs_hex_dump(xfs_buf_offset(bp, 0), XFS_CORRUPTION_DUMP_LEN); xfs_hex_dump(buf, sz);
} }
if (xfs_error_level >= XFS_ERRLEVEL_HIGH) if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
xfs_stack_trace(); xfs_stack_trace();
} }
/*
* Warnings specifically for verifier errors. Differentiate CRC vs. invalid
* values, and omit the stack trace unless the error level is tuned high.
*/
void
xfs_verifier_error(
struct xfs_buf *bp,
int error,
xfs_failaddr_t failaddr)
{
return xfs_buf_verifier_error(bp, error, "", xfs_buf_offset(bp, 0),
XFS_CORRUPTION_DUMP_LEN, failaddr);
}
/* /*
* Warnings for inode corruption problems. Don't bother with the stack * Warnings for inode corruption problems. Don't bother with the stack
* trace unless the error level is turned up high. * trace unless the error level is turned up high.
......
...@@ -26,6 +26,9 @@ extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp, ...@@ -26,6 +26,9 @@ extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp,
extern void xfs_corruption_error(const char *tag, int level, extern void xfs_corruption_error(const char *tag, int level,
struct xfs_mount *mp, void *p, const char *filename, struct xfs_mount *mp, void *p, const char *filename,
int linenum, xfs_failaddr_t failaddr); int linenum, xfs_failaddr_t failaddr);
extern void xfs_buf_verifier_error(struct xfs_buf *bp, int error,
const char *name, void *buf, size_t bufsz,
xfs_failaddr_t failaddr);
extern void xfs_verifier_error(struct xfs_buf *bp, int error, extern void xfs_verifier_error(struct xfs_buf *bp, int error,
xfs_failaddr_t failaddr); xfs_failaddr_t failaddr);
extern void xfs_inode_verifier_error(struct xfs_inode *ip, int error, extern void xfs_inode_verifier_error(struct xfs_inode *ip, int error,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment