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

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

xfs: refactor verifier callers to print address of failing check



Refactor the callers of verifiers to print the instruction address of a
failing check.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent a6a781a5
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -557,6 +557,7 @@ xfs_agfl_read_verify(
	struct xfs_buf	*bp)
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	xfs_failaddr_t	fa;

	/*
	 * There is no verification of non-crc AGFLs because mkfs does not
@@ -568,9 +569,12 @@ xfs_agfl_read_verify(
		return;

	if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF))
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (xfs_agfl_verify(bp))
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSBADCRC, __this_address);
	else {
		fa = xfs_agfl_verify(bp);
		if (fa)
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
	}
}

static void
@@ -579,13 +583,15 @@ xfs_agfl_write_verify(
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	struct xfs_buf_log_item	*bip = bp->b_fspriv;
	xfs_failaddr_t		fa;

	/* no verification of non-crc AGFLs */
	if (!xfs_sb_version_hascrc(&mp->m_sb))
		return;

	if (xfs_agfl_verify(bp)) {
		xfs_verifier_error(bp, -EFSCORRUPTED);
	fa = xfs_agfl_verify(bp);
	if (fa) {
		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
		return;
	}

@@ -2455,13 +2461,16 @@ xfs_agf_read_verify(
	struct xfs_buf	*bp)
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	xfs_failaddr_t	fa;

	if (xfs_sb_version_hascrc(&mp->m_sb) &&
	    !xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF))
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (XFS_TEST_ERROR(xfs_agf_verify(mp, bp), mp,
				XFS_ERRTAG_ALLOC_READ_AGF))
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSBADCRC, __this_address);
	else {
		fa = xfs_agf_verify(mp, bp);
		if (XFS_TEST_ERROR(fa, mp, XFS_ERRTAG_ALLOC_READ_AGF))
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
	}
}

static void
@@ -2470,9 +2479,11 @@ xfs_agf_write_verify(
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	struct xfs_buf_log_item	*bip = bp->b_fspriv;
	xfs_failaddr_t		fa;

	if (xfs_agf_verify(mp, bp)) {
		xfs_verifier_error(bp, -EFSCORRUPTED);
	fa = xfs_agf_verify(mp, bp);
	if (fa) {
		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
		return;
	}

+13 −5
Original line number Diff line number Diff line
@@ -366,10 +366,15 @@ static void
xfs_allocbt_read_verify(
	struct xfs_buf	*bp)
{
	xfs_failaddr_t	fa;

	if (!xfs_btree_sblock_verify_crc(bp))
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (xfs_allocbt_verify(bp))
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSBADCRC, __this_address);
	else {
		fa = xfs_allocbt_verify(bp);
		if (fa)
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
	}

	if (bp->b_error)
		trace_xfs_btree_corrupt(bp, _RET_IP_);
@@ -379,9 +384,12 @@ static void
xfs_allocbt_write_verify(
	struct xfs_buf	*bp)
{
	if (xfs_allocbt_verify(bp)) {
	xfs_failaddr_t	fa;

	fa = xfs_allocbt_verify(bp);
	if (fa) {
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
		return;
	}
	xfs_btree_sblock_calc_crc(bp);
+11 −5
Original line number Diff line number Diff line
@@ -295,9 +295,11 @@ xfs_attr3_leaf_write_verify(
	struct xfs_mount	*mp = bp->b_target->bt_mount;
	struct xfs_buf_log_item	*bip = bp->b_fspriv;
	struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr;
	xfs_failaddr_t		fa;

	if (xfs_attr3_leaf_verify(bp)) {
		xfs_verifier_error(bp, -EFSCORRUPTED);
	fa = xfs_attr3_leaf_verify(bp);
	if (fa) {
		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
		return;
	}

@@ -321,12 +323,16 @@ xfs_attr3_leaf_read_verify(
	struct xfs_buf		*bp)
{
	struct xfs_mount	*mp = bp->b_target->bt_mount;
	xfs_failaddr_t		fa;

	if (xfs_sb_version_hascrc(&mp->m_sb) &&
	     !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF))
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (xfs_attr3_leaf_verify(bp))
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSBADCRC, __this_address);
	else {
		fa = xfs_attr3_leaf_verify(bp);
		if (fa)
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
	}
}

const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = {
+13 −9
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ xfs_attr3_rmt_read_verify(
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	char		*ptr;
	xfs_failaddr_t	fa;
	int		len;
	xfs_daddr_t	bno;
	int		blksize = mp->m_attr_geo->blksize;
@@ -137,12 +138,13 @@ xfs_attr3_rmt_read_verify(

	while (len > 0) {
		if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) {
			xfs_verifier_error(bp, -EFSBADCRC);
			xfs_verifier_error(bp, -EFSBADCRC, __this_address);
			return;
		}
		if (xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) {
			xfs_verifier_error(bp, -EFSCORRUPTED);
			return;
		fa = xfs_attr3_rmt_verify(mp, ptr, blksize, bno);
		if (fa) {
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
			break;
		}
		len -= blksize;
		ptr += blksize;
@@ -150,7 +152,7 @@ xfs_attr3_rmt_read_verify(
	}

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

static void
@@ -158,6 +160,7 @@ xfs_attr3_rmt_write_verify(
	struct xfs_buf	*bp)
{
	struct xfs_mount *mp = bp->b_target->bt_mount;
	xfs_failaddr_t	fa;
	int		blksize = mp->m_attr_geo->blksize;
	char		*ptr;
	int		len;
@@ -175,8 +178,9 @@ xfs_attr3_rmt_write_verify(
	while (len > 0) {
		struct xfs_attr3_rmt_hdr *rmt = (struct xfs_attr3_rmt_hdr *)ptr;

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

@@ -185,7 +189,7 @@ xfs_attr3_rmt_write_verify(
		 * xfs_attr3_rmt_hdr_set() for the explanation.
		 */
		if (rmt->rm_lsn != cpu_to_be64(NULLCOMMITLSN)) {
			xfs_verifier_error(bp, -EFSCORRUPTED);
			xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
			return;
		}
		xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF);
@@ -196,7 +200,7 @@ xfs_attr3_rmt_write_verify(
	}

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

const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = {
+13 −5
Original line number Diff line number Diff line
@@ -468,10 +468,15 @@ static void
xfs_bmbt_read_verify(
	struct xfs_buf	*bp)
{
	xfs_failaddr_t	fa;

	if (!xfs_btree_lblock_verify_crc(bp))
		xfs_verifier_error(bp, -EFSBADCRC);
	else if (xfs_bmbt_verify(bp))
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSBADCRC, __this_address);
	else {
		fa = xfs_bmbt_verify(bp);
		if (fa)
			xfs_verifier_error(bp, -EFSCORRUPTED, fa);
	}

	if (bp->b_error)
		trace_xfs_btree_corrupt(bp, _RET_IP_);
@@ -481,9 +486,12 @@ static void
xfs_bmbt_write_verify(
	struct xfs_buf	*bp)
{
	if (xfs_bmbt_verify(bp)) {
	xfs_failaddr_t	fa;

	fa = xfs_bmbt_verify(bp);
	if (fa) {
		trace_xfs_btree_corrupt(bp, _RET_IP_);
		xfs_verifier_error(bp, -EFSCORRUPTED);
		xfs_verifier_error(bp, -EFSCORRUPTED, fa);
		return;
	}
	xfs_btree_lblock_calc_crc(bp);
Loading