Blame SOURCES/xfsprogs-5.7.0-xfs_repair-convert-to-libxfs_verify_agbno.patch

d13294
From dcd6c2e1490ba5c59c14ca8ea843ca36048888b8 Mon Sep 17 00:00:00 2001
d13294
From: "Darrick J. Wong" <darrick.wong@oracle.com>
d13294
Date: Fri, 10 Jul 2020 15:35:45 -0400
d13294
Subject: [PATCH] xfs_repair: convert to libxfs_verify_agbno
d13294
d13294
Convert the homegrown verify_agbno callers to use the libxfs function,
d13294
as needed.  In some places we drop the "bno != 0" checks because those
d13294
conditionals are checking btree roots; btree roots should never be
d13294
zero if the corresponding feature bit is set; and repair skips the if
d13294
clause entirely if the feature bit is disabled.
d13294
d13294
In effect, this strengthens repair to validate that AG btree pointers
d13294
neither point to the AG headers nor past the end of the AG.
d13294
d13294
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
d13294
Reviewed-by: Christoph Hellwig <hch@lst.de>
d13294
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
d13294
---
d13294
 libxfs/libxfs_api_defs.h |  1 +
d13294
 repair/dinode.c          | 11 -----------
d13294
 repair/dinode.h          |  5 -----
d13294
 repair/scan.c            | 36 +++++++++++++++++++++++-------------
d13294
 4 files changed, 24 insertions(+), 29 deletions(-)
d13294
d13294
Index: xfsprogs-5.0.0/libxfs/libxfs_api_defs.h
d13294
===================================================================
d13294
--- xfsprogs-5.0.0.orig/libxfs/libxfs_api_defs.h
d13294
+++ xfsprogs-5.0.0/libxfs/libxfs_api_defs.h
d13294
@@ -121,6 +121,7 @@
d13294
 #define xfs_verify_agbno		libxfs_verify_agbno
d13294
 #define xfs_verify_cksum		libxfs_verify_cksum
d13294
 #define xfs_dinode_verify		libxfs_dinode_verify
d13294
+#define xfs_ag_block_count		libxfs_ag_block_count
d13294
 
d13294
 #define xfs_alloc_ag_max_usable		libxfs_alloc_ag_max_usable
d13294
 #define xfs_allocbt_maxrecs		libxfs_allocbt_maxrecs
d13294
Index: xfsprogs-5.0.0/repair/dinode.c
d13294
===================================================================
d13294
--- xfsprogs-5.0.0.orig/repair/dinode.c
d13294
+++ xfsprogs-5.0.0/repair/dinode.c
d13294
@@ -284,17 +284,6 @@ verify_dfsbno_range(xfs_mount_t	*mp,
d13294
 	return (XR_DFSBNORANGE_VALID);
d13294
 }
d13294
 
d13294
-int
d13294
-verify_agbno(xfs_mount_t	*mp,
d13294
-		xfs_agnumber_t	agno,
d13294
-		xfs_agblock_t	agbno)
d13294
-{
d13294
-	xfs_sb_t	*sbp = &mp->m_sb;;
d13294
-
d13294
-	/* range check ag #, ag block.  range-checking offset is pointless */
d13294
-	return verify_ag_bno(sbp, agno, agbno) == 0;
d13294
-}
d13294
-
d13294
 static int
d13294
 process_rt_rec(
d13294
 	xfs_mount_t		*mp,
d13294
Index: xfsprogs-5.0.0/repair/dinode.h
d13294
===================================================================
d13294
--- xfsprogs-5.0.0.orig/repair/dinode.h
d13294
+++ xfsprogs-5.0.0/repair/dinode.h
d13294
@@ -10,11 +10,6 @@ struct blkmap;
d13294
 struct prefetch_args;
d13294
 
d13294
 int
d13294
-verify_agbno(xfs_mount_t	*mp,
d13294
-		xfs_agnumber_t	agno,
d13294
-		xfs_agblock_t	agbno);
d13294
-
d13294
-int
d13294
 verify_dfsbno(xfs_mount_t	*mp,
d13294
 		xfs_fsblock_t	fsbno);
d13294
 
d13294
Index: xfsprogs-5.0.0/repair/scan.c
d13294
===================================================================
d13294
--- xfsprogs-5.0.0.orig/repair/scan.c
d13294
+++ xfsprogs-5.0.0/repair/scan.c
d13294
@@ -642,14 +642,14 @@ _("%s freespace btree block claimed (sta
d13294
 			len = be32_to_cpu(rp[i].ar_blockcount);
d13294
 			end = b + len;
d13294
 
d13294
-			if (b == 0 || !verify_agbno(mp, agno, b)) {
d13294
+			if (!libxfs_verify_agbno(mp, agno, b)) {
d13294
 				do_warn(
d13294
 	_("invalid start block %u in record %u of %s btree block %u/%u\n"),
d13294
 					b, i, name, agno, bno);
d13294
 				continue;
d13294
 			}
d13294
 			if (len == 0 || end <= b ||
d13294
-			    !verify_agbno(mp, agno, end - 1)) {
d13294
+			    !libxfs_verify_agbno(mp, agno, end - 1)) {
d13294
 				do_warn(
d13294
 	_("invalid length %u in record %u of %s btree block %u/%u\n"),
d13294
 					len, i, name, agno, bno);
d13294
@@ -914,6 +914,16 @@ rmap_in_order(
d13294
 	return offset > lastoffset;
d13294
 }
d13294
 
d13294
+static inline bool
d13294
+verify_rmap_agbno(
d13294
+	struct xfs_mount	*mp,
d13294
+	xfs_agnumber_t		agno,
d13294
+	xfs_agblock_t		agbno)
d13294
+{
d13294
+	return agbno < libxfs_ag_block_count(mp, agno);
d13294
+}
d13294
+
d13294
+
d13294
 static void
d13294
 scan_rmapbt(
d13294
 	struct xfs_btree_block	*block,
d13294
@@ -1031,14 +1041,14 @@ _("%s rmap btree block claimed (state %d
d13294
 			end = key.rm_startblock + key.rm_blockcount;
d13294
 
d13294
 			/* Make sure agbno & len make sense. */
d13294
-			if (!verify_agbno(mp, agno, b)) {
d13294
+			if (!verify_rmap_agbno(mp, agno, b)) {
d13294
 				do_warn(
d13294
 	_("invalid start block %u in record %u of %s btree block %u/%u\n"),
d13294
 					b, i, name, agno, bno);
d13294
 				continue;
d13294
 			}
d13294
 			if (len == 0 || end <= b ||
d13294
-			    !verify_agbno(mp, agno, end - 1)) {
d13294
+			    !verify_rmap_agbno(mp, agno, end - 1)) {
d13294
 				do_warn(
d13294
 	_("invalid length %u in record %u of %s btree block %u/%u\n"),
d13294
 					len, i, name, agno, bno);
d13294
@@ -1325,14 +1335,14 @@ _("leftover CoW extent has invalid start
d13294
 			}
d13294
 			end = agb + len;
d13294
 
d13294
-			if (!verify_agbno(mp, agno, agb)) {
d13294
+			if (!libxfs_verify_agbno(mp, agno, agb)) {
d13294
 				do_warn(
d13294
 	_("invalid start block %u in record %u of %s btree block %u/%u\n"),
d13294
 					b, i, name, agno, bno);
d13294
 				continue;
d13294
 			}
d13294
 			if (len == 0 || end <= agb ||
d13294
-			    !verify_agbno(mp, agno, end - 1)) {
d13294
+			    !libxfs_verify_agbno(mp, agno, end - 1)) {
d13294
 				do_warn(
d13294
 	_("invalid length %u in record %u of %s btree block %u/%u\n"),
d13294
 					len, i, name, agno, bno);
d13294
@@ -2145,7 +2155,7 @@ scan_agfl(
d13294
 {
d13294
 	struct agfl_state	*as = priv;
d13294
 
d13294
-	if (verify_agbno(mp, as->agno, bno))
d13294
+	if (libxfs_verify_agbno(mp, as->agno, bno))
d13294
 		set_bmap(as->agno, bno, XR_E_FREE);
d13294
 	else
d13294
 		do_warn(_("bad agbno %u in agfl, agno %d\n"),
d13294
@@ -2217,7 +2227,7 @@ validate_agf(
d13294
 	uint32_t		magic;
d13294
 
d13294
 	bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]);
d13294
-	if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+	if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 		magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTB_CRC_MAGIC
d13294
 							 : XFS_ABTB_MAGIC;
d13294
 		scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]),
d13294
@@ -2229,7 +2239,7 @@ validate_agf(
d13294
 	}
d13294
 
d13294
 	bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]);
d13294
-	if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+	if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 		magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_ABTC_CRC_MAGIC
d13294
 							 : XFS_ABTC_MAGIC;
d13294
 		scan_sbtree(bno, be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]),
d13294
@@ -2249,7 +2259,7 @@ validate_agf(
d13294
 		priv.last_rec.rm_owner = XFS_RMAP_OWN_UNKNOWN;
d13294
 		priv.nr_blocks = 0;
d13294
 		bno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_RMAP]);
d13294
-		if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+		if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 			scan_sbtree(bno,
d13294
 				    be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]),
d13294
 				    agno, 0, scan_rmapbt, 1, XFS_RMAP_CRC_MAGIC,
d13294
@@ -2267,7 +2277,7 @@ validate_agf(
d13294
 
d13294
 	if (xfs_sb_version_hasreflink(&mp->m_sb)) {
d13294
 		bno = be32_to_cpu(agf->agf_refcount_root);
d13294
-		if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+		if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 			struct refc_priv	priv;
d13294
 
d13294
 			memset(&priv, 0, sizeof(priv));
d13294
@@ -2315,7 +2325,7 @@ validate_agi(
d13294
 	uint32_t		magic;
d13294
 
d13294
 	bno = be32_to_cpu(agi->agi_root);
d13294
-	if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+	if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 		magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC
d13294
 							 : XFS_IBT_MAGIC;
d13294
 		scan_sbtree(bno, be32_to_cpu(agi->agi_level),
d13294
@@ -2328,7 +2338,7 @@ validate_agi(
d13294
 
d13294
 	if (xfs_sb_version_hasfinobt(&mp->m_sb)) {
d13294
 		bno = be32_to_cpu(agi->agi_free_root);
d13294
-		if (bno != 0 && verify_agbno(mp, agno, bno)) {
d13294
+		if (libxfs_verify_agbno(mp, agno, bno)) {
d13294
 			magic = xfs_sb_version_hascrc(&mp->m_sb) ?
d13294
 					XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC;
d13294
 			scan_sbtree(bno, be32_to_cpu(agi->agi_free_level),