]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: report realtime rmap btree corruption errors to the health system
authorDarrick J. Wong <djwong@kernel.org>
Wed, 3 Jul 2024 21:22:18 +0000 (14:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 16 Jul 2024 22:49:20 +0000 (15:49 -0700)
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 <djwong@kernel.org>
libxfs/xfs_btree.h
libxfs/xfs_fs.h
libxfs/xfs_health.h
libxfs/xfs_inode_fork.c
libxfs/xfs_rtrmap_btree.c
man/man2/ioctl_xfs_rtgroup_geometry.2

index f917db0e7c2405571a073b75be29e5dd54499b4a..c3d593e82ad21cf8b9ae17027bf5379512911fd8 100644 (file)
@@ -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 */
index 4043773f69f7a494a447f1c2c1143684a1417579..63f0527f2f9763c34334fdbfb33842335418c34c 100644 (file)
@@ -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
index 5a35d4e7b0f0aa0b2154b1adf2c9e96d8d32403b..c03a42032d7fad63ba8a3de6fbff7102cb7c6f29 100644 (file)
@@ -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 | \
index 9b06bab5c6a76f1c8e6c716b281319d4380064c1..b2a5a155236fa4981bc3874fd8731c7da1518516 100644 (file)
@@ -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__,
index 6aed0cac2e70e1d761cf281b777586d5d517af3e..80a7cff6501752179483a5444d634532734524b9 100644 (file)
@@ -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));
index f64ae4e85f0863cf60975f2e1651994d75cf6537..26cfb5a3881e7869f3ed89c9d1a1147050c7623b 100644 (file)
@@ -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