|
@@ -347,33 +347,52 @@ xfs_corruption_error(
|
|
|
* values, and omit the stack trace unless the error level is tuned high.
|
|
|
*/
|
|
|
void
|
|
|
-xfs_verifier_error(
|
|
|
+xfs_buf_verifier_error(
|
|
|
struct xfs_buf *bp,
|
|
|
int error,
|
|
|
+ const char *name,
|
|
|
+ void *buf,
|
|
|
+ size_t bufsz,
|
|
|
xfs_failaddr_t failaddr)
|
|
|
{
|
|
|
struct xfs_mount *mp = bp->b_target->bt_mount;
|
|
|
xfs_failaddr_t fa;
|
|
|
+ int sz;
|
|
|
|
|
|
fa = failaddr ? failaddr : __return_address;
|
|
|
__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",
|
|
|
- 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");
|
|
|
|
|
|
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_CORRUPTION_DUMP_LEN);
|
|
|
- xfs_hex_dump(xfs_buf_offset(bp, 0), XFS_CORRUPTION_DUMP_LEN);
|
|
|
+ sz);
|
|
|
+ xfs_hex_dump(buf, sz);
|
|
|
}
|
|
|
|
|
|
if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
|
|
|
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
|
|
|
* trace unless the error level is turned up high.
|