From: Glen Overby Date: Thu, 15 Dec 2005 19:13:54 +0000 (+0000) Subject: xfs_check does not look at the contents of the AGF BNO and CNT btrees. It X-Git-Tag: v2.8.0~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ac8ea13b1b8600ba8bfd4e873920f31b43daf6f;p=thirdparty%2Fxfsprogs-dev.git xfs_check does not look at the contents of the AGF BNO and CNT btrees. It only looks at the headers of the btree blocks. All entries in those blocks should be in sorted order, so there is no reason that xfs_check can't look at the contents of the AGF BNO and CNT btrees to verify that all (valid) records are in sorted order. check the contents of the BNO and CNT btrees to check that all entries are in sorted order. --- diff --git a/db/check.c b/db/check.c index a8ef90339..ded1fc5fe 100644 --- a/db/check.c +++ b/db/check.c @@ -4233,6 +4233,7 @@ scanfunc_bno( xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; xfs_agnumber_t seqno = INT_GET(agf->agf_seqno, ARCH_CONVERT); + xfs_agblock_t lastblock; if (INT_GET(block->bb_magic, ARCH_CONVERT) != XFS_ABTB_MAGIC) { dbprintf("bad magic # %#x in btbno block %u/%u\n", @@ -4261,10 +4262,21 @@ scanfunc_bno( } rp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc, block, 1, mp->m_alloc_mxr[0]); + lastblock = 0; for (i = 0; i < INT_GET(block->bb_numrecs, ARCH_CONVERT); i++) { set_dbmap(seqno, INT_GET(rp[i].ar_startblock, ARCH_CONVERT), INT_GET(rp[i].ar_blockcount, ARCH_CONVERT), DBM_FREE1, seqno, bno); + if (INT_GET(rp[i].ar_startblock, ARCH_CONVERT) <= lastblock) { + dbprintf( + "out-of-order bno btree record %d (%u %u) block %u/%u\n", + i, INT_GET(rp[i].ar_startblock, ARCH_CONVERT), + INT_GET(rp[i].ar_blockcount, ARCH_CONVERT), + INT_GET(agf->agf_seqno, ARCH_CONVERT), bno); + serious_error++; + } else { + lastblock = INT_GET(rp[i].ar_startblock, ARCH_CONVERT); + } } return; } @@ -4296,6 +4308,7 @@ scanfunc_cnt( int i; xfs_alloc_ptr_t *pp; xfs_alloc_rec_t *rp; + xfs_extlen_t lastcount; if (INT_GET(block->bb_magic, ARCH_CONVERT) != XFS_ABTC_MAGIC) { dbprintf("bad magic # %#x in btcnt block %u/%u\n", @@ -4324,6 +4337,7 @@ scanfunc_cnt( } rp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc, block, 1, mp->m_alloc_mxr[0]); + lastcount = 0; for (i = 0; i < INT_GET(block->bb_numrecs, ARCH_CONVERT); i++) { check_set_dbmap(seqno, INT_GET(rp[i].ar_startblock, ARCH_CONVERT), INT_GET(rp[i].ar_blockcount, ARCH_CONVERT), DBM_FREE1, DBM_FREE2, @@ -4332,6 +4346,15 @@ scanfunc_cnt( agffreeblks += INT_GET(rp[i].ar_blockcount, ARCH_CONVERT); if (INT_GET(rp[i].ar_blockcount, ARCH_CONVERT) > agflongest) agflongest = INT_GET(rp[i].ar_blockcount, ARCH_CONVERT); + if (INT_GET(rp[i].ar_blockcount, ARCH_CONVERT) < lastcount) { + dbprintf( + "out-of-order cnt btree record %d (%u %u) block %u/%u\n", + i, INT_GET(rp[i].ar_startblock, ARCH_CONVERT), + INT_GET(rp[i].ar_blockcount, ARCH_CONVERT), + INT_GET(agf->agf_seqno, ARCH_CONVERT), bno); + } else { + lastcount = INT_GET(rp[i].ar_blockcount, ARCH_CONVERT); + } } return; }