]> 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>
Tue, 7 Mar 2023 03:55:58 +0000 (19:55 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:38 +0000 (15:03 -0800)
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_fs_staging.h
libxfs/xfs_health.h
libxfs/xfs_inode_fork.c
libxfs/xfs_rtrmap_btree.c
man/man2/ioctl_xfs_rtgroup_geometry.2

index 4e875efd33f7f50e7e7df7afc46bf9bdfe08c330..84a510ce52f926afedaff4daa160396ea855a668 100644 (file)
@@ -216,6 +216,7 @@ struct xfs_rtgroup_geometry {
 };
 #define XFS_RTGROUP_GEOM_SICK_SUPER    (1 << 0)  /* superblock */
 #define XFS_RTGROUP_GEOM_SICK_BITMAP   (1 << 1)  /* rtbitmap for this group */
+#define XFS_RTGROUP_GEOM_SICK_RMAPBT   (1 << 2)  /* reverse mappings */
 
 #define XFS_IOC_RTGROUP_GEOMETRY _IOWR('X', 63, struct xfs_rtgroup_geometry)
 
index 57316e9619dd33bf49079bb45ad10363fb339ef1..ffbd102e78e1bc1e4df0e606fb7faa2bc8edb16d 100644 (file)
@@ -68,6 +68,7 @@ struct xfs_rtgroup;
 #define XFS_SICK_RT_BITMAP     (1 << 0)  /* realtime bitmap */
 #define XFS_SICK_RT_SUMMARY    (1 << 1)  /* realtime summary */
 #define XFS_SICK_RT_SUPER      (1 << 2)  /* rt group superblock */
+#define XFS_SICK_RT_RMAPBT     (1 << 3)  /* reverse mappings */
 
 /* Observable health issues for AG metadata. */
 #define XFS_SICK_AG_SB         (1 << 0)  /* superblock */
@@ -107,7 +108,8 @@ struct xfs_rtgroup;
 
 #define XFS_SICK_RT_PRIMARY    (XFS_SICK_RT_BITMAP | \
                                 XFS_SICK_RT_SUMMARY | \
-                                XFS_SICK_RT_SUPER)
+                                XFS_SICK_RT_SUPER | \
+                                XFS_SICK_RT_RMAPBT)
 
 #define XFS_SICK_AG_PRIMARY    (XFS_SICK_AG_SB | \
                                 XFS_SICK_AG_AGF | \
index bf0c9c29efb6c4b097867886e1d1fb63214ffce9..72a2e5e7c13677aabf88095cbaed0da447a5255b 100644 (file)
@@ -264,8 +264,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 a00b873563ecf3626d9b49f6587c9344f6b8f632..5365e5f8b28048d86a0caa7dd639e67ef7afba46 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;
 
@@ -798,8 +799,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 83c4428da6a71f487c7fd271ef104c1b70b3854e..8711e7b7e8e2f87389b3ad33e551199bd07e5416 100644 (file)
@@ -73,6 +73,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