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

xfs: scrub should check incore counters against ondisk headers



In theory, the incore per-AG structure counters should match the ones on
disk, so check that.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 9a1f3049
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -514,6 +514,7 @@ xchk_agf(
{
{
	struct xfs_mount	*mp = sc->mp;
	struct xfs_mount	*mp = sc->mp;
	struct xfs_agf		*agf;
	struct xfs_agf		*agf;
	struct xfs_perag	*pag;
	xfs_agnumber_t		agno;
	xfs_agnumber_t		agno;
	xfs_agblock_t		agbno;
	xfs_agblock_t		agbno;
	xfs_agblock_t		eoag;
	xfs_agblock_t		eoag;
@@ -586,6 +587,16 @@ xchk_agf(
	if (agfl_count != 0 && fl_count != agfl_count)
	if (agfl_count != 0 && fl_count != agfl_count)
		xchk_block_set_corrupt(sc, sc->sa.agf_bp);
		xchk_block_set_corrupt(sc, sc->sa.agf_bp);


	/* Do the incore counters match? */
	pag = xfs_perag_get(mp, agno);
	if (pag->pagf_freeblks != be32_to_cpu(agf->agf_freeblks))
		xchk_block_set_corrupt(sc, sc->sa.agf_bp);
	if (pag->pagf_flcount != be32_to_cpu(agf->agf_flcount))
		xchk_block_set_corrupt(sc, sc->sa.agf_bp);
	if (pag->pagf_btreeblks != be32_to_cpu(agf->agf_btreeblks))
		xchk_block_set_corrupt(sc, sc->sa.agf_bp);
	xfs_perag_put(pag);

	xchk_agf_xref(sc);
	xchk_agf_xref(sc);
out:
out:
	return error;
	return error;
@@ -811,6 +822,7 @@ xchk_agi(
{
{
	struct xfs_mount	*mp = sc->mp;
	struct xfs_mount	*mp = sc->mp;
	struct xfs_agi		*agi;
	struct xfs_agi		*agi;
	struct xfs_perag	*pag;
	xfs_agnumber_t		agno;
	xfs_agnumber_t		agno;
	xfs_agblock_t		agbno;
	xfs_agblock_t		agbno;
	xfs_agblock_t		eoag;
	xfs_agblock_t		eoag;
@@ -881,6 +893,14 @@ xchk_agi(
	if (agi->agi_pad32 != cpu_to_be32(0))
	if (agi->agi_pad32 != cpu_to_be32(0))
		xchk_block_set_corrupt(sc, sc->sa.agi_bp);
		xchk_block_set_corrupt(sc, sc->sa.agi_bp);


	/* Do the incore counters match? */
	pag = xfs_perag_get(mp, agno);
	if (pag->pagi_count != be32_to_cpu(agi->agi_count))
		xchk_block_set_corrupt(sc, sc->sa.agi_bp);
	if (pag->pagi_freecount != be32_to_cpu(agi->agi_freecount))
		xchk_block_set_corrupt(sc, sc->sa.agi_bp);
	xfs_perag_put(pag);

	xchk_agi_xref(sc);
	xchk_agi_xref(sc);
out:
out:
	return error;
	return error;