@@ -30,6 +30,8 @@
#include "xfs_refcount.h"
#include "xfs_refcount_btree.h"
#include "xfs_ag.h"
+#include "xfs_rtrmap_btree.h"
+#include "xfs_rtgroup.h"
#include "scrub/xfs_scrub.h"
#include "scrub/scrub.h"
#include "scrub/common.h"
@@ -496,6 +498,38 @@ xrep_rmap_scan_iext(
return xrep_rmap_stash_accumulated(rf);
}
+static int
+xrep_rmap_scan_rtrmapbt(
+ struct xrep_rmap_ifork *rf,
+ struct xfs_inode *ip)
+{
+ struct xfs_scrub *sc = rf->rr->sc;
+ struct xfs_btree_cur *cur;
+ struct xfs_rtgroup *rtg;
+ xfs_rgnumber_t rgno;
+ int error;
+
+ if (rf->whichfork != XFS_DATA_FORK)
+ return -EFSCORRUPTED;
+
+ for_each_rtgroup(sc->mp, rgno, rtg) {
+ if (ip == rtg->rtg_rmapip) {
+ cur = xfs_rtrmapbt_init_cursor(sc->mp, sc->tp, rtg, ip);
+ error = xrep_rmap_scan_iroot_btree(rf, cur);
+ xfs_btree_del_cursor(cur, error);
+ xfs_rtgroup_put(rtg);
+ return error;
+ }
+ }
+
+ /*
+ * We shouldn't find an rmap format inode that isn't associated with
+ * an rtgroup!
+ */
+ ASSERT(0);
+ return -EFSCORRUPTED;
+}
+
/* Find all the extents from a given AG in an inode fork. */
STATIC int
xrep_rmap_scan_ifork(
@@ -525,6 +559,8 @@ xrep_rmap_scan_ifork(
error = xrep_rmap_scan_bmbt(&rf, ip, &mappings_done);
if (error || mappings_done)
return error;
+ } else if (ifp->if_format == XFS_DINODE_FMT_RMAP) {
+ return xrep_rmap_scan_rtrmapbt(&rf, ip);
} else if (ifp->if_format != XFS_DINODE_FMT_EXTENTS) {
return 0;
}