Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31ca03c9 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: refactor xfs_verifier_error and xfs_buf_ioerror



Since all verification errors also mark the buffer as having an error,
we can combine these two calls.  Later we'll add a xfs_failaddr_t
parameter to promote the idea of reporting corruption errors and the
address of the failing check to enable better debugging reports.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 9101d370
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -567,12 +567,9 @@ xfs_agfl_read_verify(
		return;

	if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF))
		xfs_buf_ioerror(bp, -EFSBADCRC);
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (!xfs_agfl_verify(bp))
		xfs_buf_ioerror(bp, -EFSCORRUPTED);

	if (bp->b_error)
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
}

static void
@@ -587,8 +584,7 @@ xfs_agfl_write_verify(
		return;

	if (!xfs_agfl_verify(bp)) {
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		return;
	}

@@ -2461,13 +2457,10 @@ xfs_agf_read_verify(

	if (xfs_sb_version_hascrc(&mp->m_sb) &&
	    !xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF))
		xfs_buf_ioerror(bp, -EFSBADCRC);
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (XFS_TEST_ERROR(!xfs_agf_verify(mp, bp), mp,
				XFS_ERRTAG_ALLOC_READ_AGF))
		xfs_buf_ioerror(bp, -EFSCORRUPTED);

	if (bp->b_error)
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
}

static void
@@ -2478,8 +2471,7 @@ xfs_agf_write_verify(
	struct xfs_buf_log_item	*bip = bp->b_fspriv;

	if (!xfs_agf_verify(mp, bp)) {
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		return;
	}

+4 −7
Original line number Diff line number Diff line
@@ -364,14 +364,12 @@ xfs_allocbt_read_verify(
	struct xfs_buf	*bp)
{
	if (!xfs_btree_sblock_verify_crc(bp))
		xfs_buf_ioerror(bp, -EFSBADCRC);
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (!xfs_allocbt_verify(bp))
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSCORRUPTED);

	if (bp->b_error) {
	if (bp->b_error)
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_verifier_error(bp);
	}
}

static void
@@ -380,8 +378,7 @@ xfs_allocbt_write_verify(
{
	if (!xfs_allocbt_verify(bp)) {
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		return;
	}
	xfs_btree_sblock_calc_crc(bp);
+3 −7
Original line number Diff line number Diff line
@@ -297,8 +297,7 @@ xfs_attr3_leaf_write_verify(
	struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr;

	if (!xfs_attr3_leaf_verify(bp)) {
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		return;
	}

@@ -325,12 +324,9 @@ xfs_attr3_leaf_read_verify(

	if (xfs_sb_version_hascrc(&mp->m_sb) &&
	     !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF))
		xfs_buf_ioerror(bp, -EFSBADCRC);
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (!xfs_attr3_leaf_verify(bp))
		xfs_buf_ioerror(bp, -EFSCORRUPTED);

	if (bp->b_error)
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
}

const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = {
+11 −13
Original line number Diff line number Diff line
@@ -137,22 +137,20 @@ xfs_attr3_rmt_read_verify(

	while (len > 0) {
		if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) {
			xfs_buf_ioerror(bp, -EFSBADCRC);
			break;
			xfs_verifier_error(bp, -EFSBADCRC);
			return;
		}
		if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) {
			xfs_buf_ioerror(bp, -EFSCORRUPTED);
			break;
			xfs_verifier_error(bp, -EFSCORRUPTED);
			return;
		}
		len -= blksize;
		ptr += blksize;
		bno += BTOBB(blksize);
	}

	if (bp->b_error)
		xfs_verifier_error(bp);
	else
		ASSERT(len == 0);
	if (len != 0)
		xfs_verifier_error(bp, -EFSCORRUPTED);
}

static void
@@ -178,8 +176,7 @@ xfs_attr3_rmt_write_verify(
		struct xfs_attr3_rmt_hdr *rmt = (struct xfs_attr3_rmt_hdr *)ptr;

		if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) {
			xfs_buf_ioerror(bp, -EFSCORRUPTED);
			xfs_verifier_error(bp);
			xfs_verifier_error(bp, -EFSCORRUPTED);
			return;
		}

@@ -188,8 +185,7 @@ xfs_attr3_rmt_write_verify(
		 * xfs_attr3_rmt_hdr_set() for the explanation.
		 */
		if (rmt->rm_lsn != cpu_to_be64(NULLCOMMITLSN)) {
			xfs_buf_ioerror(bp, -EFSCORRUPTED);
			xfs_verifier_error(bp);
			xfs_verifier_error(bp, -EFSCORRUPTED);
			return;
		}
		xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF);
@@ -198,7 +194,9 @@ xfs_attr3_rmt_write_verify(
		ptr += blksize;
		bno += BTOBB(blksize);
	}
	ASSERT(len == 0);

	if (len != 0)
		xfs_verifier_error(bp, -EFSCORRUPTED);
}

const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = {
+4 −7
Original line number Diff line number Diff line
@@ -467,14 +467,12 @@ xfs_bmbt_read_verify(
	struct xfs_buf	*bp)
{
	if (!xfs_btree_lblock_verify_crc(bp))
		xfs_buf_ioerror(bp, -EFSBADCRC);
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (!xfs_bmbt_verify(bp))
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSCORRUPTED);

	if (bp->b_error) {
	if (bp->b_error)
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_verifier_error(bp);
	}
}

static void
@@ -483,8 +481,7 @@ xfs_bmbt_write_verify(
{
	if (!xfs_bmbt_verify(bp)) {
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_buf_ioerror(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		return;
	}
	xfs_btree_lblock_calc_crc(bp);
Loading