[PATCH 05/16] xfs_repair: check for out-of-order inobt records

Darrick J. Wong
2020-05-09T16:30:28Z

From: Darrick J. Wong <darrick.wong@oracle.com>

Make sure that the inode btree records are in order.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
repair/scan.c | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/repair/scan.c b/repair/scan.c
index 2d156d64..7c46ab89 100644
--- a/repair/scan.c
+++ b/repair/scan.c
@@ -1947,6 +1947,7 @@ scan_inobt(
const struct xfs_buf_ops *ops)
{
struct aghdr_cnts *agcnts = priv;
+ xfs_agino_t lastino = 0;
int i;
int numrecs;
int state;
@@ -2029,7 +2030,16 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"),
* the block. skip processing of bogus records.
*/
for (i = 0; i < numrecs; i++) {
+ xfs_agino_t startino;
+
freecount = inorec_get_freecount(mp, &rp[i]);
+ startino = be32_to_cpu(rp[i].ir_startino);
+ if (i > 0 && startino <= lastino)
+ do_warn(_(
+ "out-of-order ino btree record %d (%u) block %u/%u\n"),
+ i, startino, agno, bno);
+ else
+ lastino = startino + XFS_INODES_PER_CHUNK - 1;

if (magic == XFS_IBT_MAGIC ||
magic == XFS_IBT_CRC_MAGIC) {