xfs: modify verifiers to differentiate CRC from other errors
Modify all read & write verifiers to differentiate between CRC errors and other inconsistencies. This sets the appropriate error number on bp->b_error, and then calls xfs_verifier_error() if something went wrong. That function will issue the appropriate message to the user. Signed-off-by: Eric Sandeen <sandeen@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:

committed by
Dave Chinner

parent
db9355c296
commit
ce5028cfe3
@@ -474,7 +474,6 @@ xfs_agfl_read_verify(
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
struct xfs_mount *mp = bp->b_target->bt_mount;
|
||||
int agfl_ok = 1;
|
||||
|
||||
/*
|
||||
* There is no verification of non-crc AGFLs because mkfs does not
|
||||
@@ -485,14 +484,13 @@ xfs_agfl_read_verify(
|
||||
if (!xfs_sb_version_hascrc(&mp->m_sb))
|
||||
return;
|
||||
|
||||
agfl_ok = xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF);
|
||||
|
||||
agfl_ok = agfl_ok && xfs_agfl_verify(bp);
|
||||
|
||||
if (!agfl_ok) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
|
||||
if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF))
|
||||
xfs_buf_ioerror(bp, EFSBADCRC);
|
||||
else if (!xfs_agfl_verify(bp))
|
||||
xfs_buf_ioerror(bp, EFSCORRUPTED);
|
||||
}
|
||||
|
||||
if (bp->b_error)
|
||||
xfs_verifier_error(bp);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -507,8 +505,8 @@ xfs_agfl_write_verify(
|
||||
return;
|
||||
|
||||
if (!xfs_agfl_verify(bp)) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
|
||||
xfs_buf_ioerror(bp, EFSCORRUPTED);
|
||||
xfs_verifier_error(bp);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2236,18 +2234,17 @@ xfs_agf_read_verify(
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
struct xfs_mount *mp = bp->b_target->bt_mount;
|
||||
int agf_ok = 1;
|
||||
|
||||
if (xfs_sb_version_hascrc(&mp->m_sb))
|
||||
agf_ok = xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF);
|
||||
|
||||
agf_ok = agf_ok && xfs_agf_verify(mp, bp);
|
||||
|
||||
if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF,
|
||||
XFS_RANDOM_ALLOC_READ_AGF))) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
|
||||
if (xfs_sb_version_hascrc(&mp->m_sb) &&
|
||||
!xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF))
|
||||
xfs_buf_ioerror(bp, EFSBADCRC);
|
||||
else if (XFS_TEST_ERROR(!xfs_agf_verify(mp, bp), mp,
|
||||
XFS_ERRTAG_ALLOC_READ_AGF,
|
||||
XFS_RANDOM_ALLOC_READ_AGF))
|
||||
xfs_buf_ioerror(bp, EFSCORRUPTED);
|
||||
}
|
||||
|
||||
if (bp->b_error)
|
||||
xfs_verifier_error(bp);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2258,8 +2255,8 @@ xfs_agf_write_verify(
|
||||
struct xfs_buf_log_item *bip = bp->b_fspriv;
|
||||
|
||||
if (!xfs_agf_verify(mp, bp)) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);
|
||||
xfs_buf_ioerror(bp, EFSCORRUPTED);
|
||||
xfs_verifier_error(bp);
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user