summaryrefslogtreecommitdiffstats
path: root/fs/xfs/libxfs/xfs_alloc.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2023-04-12 04:00:04 +0200
committerDarrick J. Wong <djwong@kernel.org>2023-04-12 04:00:04 +0200
commitee12eaaa435a7be17152ac50943ee77249de624a (patch)
treefc7b010f0de443c60d9daa0cc6137b97ad60a1e2 /fs/xfs/libxfs/xfs_alloc.c
parentxfs: standardize ondisk to incore conversion for bmap btrees (diff)
downloadlinux-ee12eaaa435a7be17152ac50943ee77249de624a.tar.xz
linux-ee12eaaa435a7be17152ac50943ee77249de624a.zip
xfs: complain about bad records in query_range helpers
For every btree type except for the bmbt, refactor the code that complains about bad records into a helper and make the ->query_range helpers call it so that corruptions found via that avenue are logged. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
Diffstat (limited to 'fs/xfs/libxfs/xfs_alloc.c')
-rw-r--r--fs/xfs/libxfs/xfs_alloc.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
index 89c935cbcc4d..23f0acfc2a64 100644
--- a/fs/xfs/libxfs/xfs_alloc.c
+++ b/fs/xfs/libxfs/xfs_alloc.c
@@ -261,6 +261,24 @@ xfs_alloc_check_irec(
return NULL;
}
+static inline int
+xfs_alloc_complain_bad_rec(
+ struct xfs_btree_cur *cur,
+ xfs_failaddr_t fa,
+ const struct xfs_alloc_rec_incore *irec)
+{
+ struct xfs_mount *mp = cur->bc_mp;
+
+ xfs_warn(mp,
+ "%s Freespace BTree record corruption in AG %d detected at %pS!",
+ cur->bc_btnum == XFS_BTNUM_BNO ? "Block" : "Size",
+ cur->bc_ag.pag->pag_agno, fa);
+ xfs_warn(mp,
+ "start block 0x%x block count 0x%x", irec->ar_startblock,
+ irec->ar_blockcount);
+ return -EFSCORRUPTED;
+}
+
/*
* Get the data from the pointed-to record.
*/
@@ -272,8 +290,6 @@ xfs_alloc_get_rec(
int *stat) /* output: success/failure */
{
struct xfs_alloc_rec_incore irec;
- struct xfs_mount *mp = cur->bc_mp;
- struct xfs_perag *pag = cur->bc_ag.pag;
union xfs_btree_rec *rec;
xfs_failaddr_t fa;
int error;
@@ -285,21 +301,11 @@ xfs_alloc_get_rec(
xfs_alloc_btrec_to_irec(rec, &irec);
fa = xfs_alloc_check_irec(cur, &irec);
if (fa)
- goto out_bad_rec;
+ return xfs_alloc_complain_bad_rec(cur, fa, &irec);
*bno = irec.ar_startblock;
*len = irec.ar_blockcount;
return 0;
-
-out_bad_rec:
- xfs_warn(mp,
- "%s Freespace BTree record corruption in AG %d detected at %pS!",
- cur->bc_btnum == XFS_BTNUM_BNO ? "Block" : "Size",
- pag->pag_agno, fa);
- xfs_warn(mp,
- "start block 0x%x block count 0x%x", irec.ar_startblock,
- irec.ar_blockcount);
- return -EFSCORRUPTED;
}
/*
@@ -3692,10 +3698,12 @@ xfs_alloc_query_range_helper(
{
struct xfs_alloc_query_range_info *query = priv;
struct xfs_alloc_rec_incore irec;
+ xfs_failaddr_t fa;
xfs_alloc_btrec_to_irec(rec, &irec);
- if (xfs_alloc_check_irec(cur, &irec) != NULL)
- return -EFSCORRUPTED;
+ fa = xfs_alloc_check_irec(cur, &irec);
+ if (fa)
+ return xfs_alloc_complain_bad_rec(cur, fa, &irec);
return query->fn(cur, &irec, query->priv);
}