]> git.karo-electronics.de Git - linux-beck.git/commitdiff
xfs: add xfs_verifier_error()
authorEric Sandeen <sandeen@sandeen.net>
Thu, 27 Feb 2014 04:21:07 +0000 (15:21 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 27 Feb 2014 04:21:07 +0000 (15:21 +1100)
We want to distinguish between corruption, CRC errors,
etc.  In addition, the full stack trace on verifier errors
seems less than helpful; it looks more like an oops than
corruption.

Create a new function to specifically alert the user to
verifier errors, which can differentiate between
EFSCORRUPTED and CRC mismatches.  It doesn't dump stack
unless the xfs error level is turned up high.

Define a new error message (EFSBADCRC) to clearly identify
CRC errors.  (Defined to EBADMSG, bad message)

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h
fs/xfs/xfs_linux.h

index 9995b807d627eb564da0747124359caa6141ee57..a8b2ecb5f436ac1cd4e9d854388904bb6784615a 100644 (file)
@@ -178,3 +178,28 @@ xfs_corruption_error(
        xfs_error_report(tag, level, mp, filename, linenum, ra);
        xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair");
 }
+
+/*
+ * 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)
+{
+       struct xfs_mount *mp = bp->b_target->bt_mount;
+
+       xfs_alert(mp, "Metadata %s detected at %pF, block 0x%llx",
+                 bp->b_error == EFSBADCRC ? "CRC error" : "corruption",
+                 __return_address, bp->b_bn);
+
+       xfs_alert(mp, "Unmount and run xfs_repair");
+
+       if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
+               xfs_alert(mp, "First 64 bytes of corrupted metadata buffer:");
+               xfs_hex_dump(xfs_buf_offset(bp, 0), 64);
+       }
+
+       if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
+               xfs_stack_trace();
+}
index 079a367f44eeb6f67c16666c695a5fd3a246637d..c1c57d4a4b5db6f37a626d7e78a48f32facf8dcd 100644 (file)
@@ -34,6 +34,7 @@ extern void xfs_error_report(const char *tag, int level, struct xfs_mount *mp,
 extern void xfs_corruption_error(const char *tag, int level,
                        struct xfs_mount *mp, void *p, const char *filename,
                        int linenum, inst_t *ra);
+extern void xfs_verifier_error(struct xfs_buf *bp);
 
 #define        XFS_ERROR_REPORT(e, lvl, mp)    \
        xfs_error_report(e, lvl, mp, __FILE__, __LINE__, __return_address)
index e8fed74dd669085419a6119fae0055a23ca0ea84..825249d2dfc1a740b6c5523ac1808af53776efb0 100644 (file)
@@ -179,6 +179,7 @@ typedef __uint64_t __psunsigned_t;
 #define ENOATTR                ENODATA         /* Attribute not found */
 #define EWRONGFS       EINVAL          /* Mount with wrong filesystem type */
 #define EFSCORRUPTED   EUCLEAN         /* Filesystem is corrupted */
+#define EFSBADCRC      EBADMSG         /* Bad CRC detected */
 
 #define SYNCHRONIZE()  barrier()
 #define __return_address __builtin_return_address(0)