From 574b37a2d7ca886d06d00a0eeed7e7bde8ab107c Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Wed, 3 Jul 2024 14:22:18 -0700 Subject: [PATCH] xfs: report realtime rmap btree corruption errors to the health system Whenever we encounter corrupt realtime rmap btree blocks, we should report that to the health monitoring system for later reporting. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.h | 2 +- libxfs/xfs_fs.h | 1 + libxfs/xfs_health.h | 4 +++- libxfs/xfs_inode_fork.c | 4 +++- libxfs/xfs_rtrmap_btree.c | 6 +++++- man/man2/ioctl_xfs_rtgroup_geometry.2 | 3 +++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index f917db0e7..c3d593e82 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -136,7 +136,7 @@ struct xfs_btree_ops { /* offset of btree stats array */ unsigned int statoff; - /* sick mask for health reporting (only for XFS_BTREE_TYPE_AG) */ + /* sick mask for health reporting (not for bmap btrees) */ unsigned int sick_mask; /* cursor operations */ diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 4043773f6..63f0527f2 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -987,6 +987,7 @@ struct xfs_rtgroup_geometry { }; #define XFS_RTGROUP_GEOM_SICK_SUPER (1U << 0) /* superblock */ #define XFS_RTGROUP_GEOM_SICK_BITMAP (1U << 1) /* rtbitmap for this group */ +#define XFS_RTGROUP_GEOM_SICK_RMAPBT (1U << 2) /* reverse mappings */ /* * ioctl commands that are used by Linux filesystems diff --git a/libxfs/xfs_health.h b/libxfs/xfs_health.h index 5a35d4e7b..c03a42032 100644 --- a/libxfs/xfs_health.h +++ b/libxfs/xfs_health.h @@ -71,6 +71,7 @@ struct xfs_rtgroup; /* Observable health issues for realtime group metadata. */ #define XFS_SICK_RG_SUPER (1 << 0) /* rt group superblock */ #define XFS_SICK_RG_BITMAP (1 << 1) /* rt group part of rtbitmap */ +#define XFS_SICK_RG_RMAPBT (1 << 2) /* reverse mappings */ /* Observable health issues for AG metadata. */ #define XFS_SICK_AG_SB (1 << 0) /* superblock */ @@ -118,7 +119,8 @@ struct xfs_rtgroup; XFS_SICK_RT_SUMMARY) #define XFS_SICK_RG_PRIMARY (XFS_SICK_RG_SUPER | \ - XFS_SICK_RG_BITMAP) + XFS_SICK_RG_BITMAP | \ + XFS_SICK_RG_RMAPBT) #define XFS_SICK_AG_PRIMARY (XFS_SICK_AG_SB | \ XFS_SICK_AG_AGF | \ diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 9b06bab5c..b2a5a1552 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -268,8 +268,10 @@ xfs_iformat_data_fork( case XFS_DINODE_FMT_BTREE: return xfs_iformat_btree(ip, dip, XFS_DATA_FORK); case XFS_DINODE_FMT_RMAP: - if (!xfs_has_rtrmapbt(ip->i_mount)) + if (!xfs_has_rtrmapbt(ip->i_mount)) { + xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE); return -EFSCORRUPTED; + } return xfs_iformat_rtrmap(ip, dip); default: xfs_inode_verifier_error(ip, -EFSCORRUPTED, __func__, diff --git a/libxfs/xfs_rtrmap_btree.c b/libxfs/xfs_rtrmap_btree.c index 6aed0cac2..80a7cff65 100644 --- a/libxfs/xfs_rtrmap_btree.c +++ b/libxfs/xfs_rtrmap_btree.c @@ -25,6 +25,7 @@ #include "xfs_rtgroup.h" #include "xfs_bmap.h" #include "xfs_imeta.h" +#include "xfs_health.h" static struct kmem_cache *xfs_rtrmapbt_cur_cache; @@ -476,6 +477,7 @@ const struct xfs_btree_ops xfs_rtrmapbt_ops = { .lru_refs = XFS_RMAP_BTREE_REF, .statoff = XFS_STATS_CALC_INDEX(xs_rtrmap_2), + .sick_mask = XFS_SICK_RG_RMAPBT, .dup_cursor = xfs_rtrmapbt_dup_cursor, .alloc_block = xfs_btree_alloc_imeta_block, @@ -734,8 +736,10 @@ xfs_iformat_rtrmap( level = be16_to_cpu(dfp->bb_level); if (level > mp->m_rtrmap_maxlevels || - xfs_rtrmap_droot_space_calc(level, numrecs) > dsize) + xfs_rtrmap_droot_space_calc(level, numrecs) > dsize) { + xfs_inode_mark_sick(ip, XFS_SICK_INO_CORE); return -EFSCORRUPTED; + } xfs_iroot_alloc(ip, XFS_DATA_FORK, xfs_rtrmap_broot_space_calc(mp, level, numrecs)); diff --git a/man/man2/ioctl_xfs_rtgroup_geometry.2 b/man/man2/ioctl_xfs_rtgroup_geometry.2 index f64ae4e85..26cfb5a38 100644 --- a/man/man2/ioctl_xfs_rtgroup_geometry.2 +++ b/man/man2/ioctl_xfs_rtgroup_geometry.2 @@ -71,6 +71,9 @@ Realtime group superblock. .TP .B XFS_RTGROUP_GEOM_SICK_BITMAP Realtime bitmap for this group. +.TP +.B XFS_RTGROUP_GEOM_SICK_RTRMAPBT +Reverse mapping btree for this group. .RE .SH RETURN VALUE On error, \-1 is returned, and -- 2.50.1