@@ -32,6 +32,7 @@
#include "xfs_ag.h"
#include "xfs_rtrmap_btree.h"
#include "xfs_rtgroup.h"
+#include "xfs_rtrefcount_btree.h"
#include "scrub/xfs_scrub.h"
#include "scrub/scrub.h"
#include "scrub/common.h"
@@ -530,6 +531,39 @@ xrep_rmap_scan_rtrmapbt(
return -EFSCORRUPTED;
}
+static int
+xrep_rmap_scan_rtrefcountbt(
+ 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_refcountip) {
+ cur = xfs_rtrefcountbt_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 a refcount 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(
@@ -561,6 +595,8 @@ xrep_rmap_scan_ifork(
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_REFCOUNT) {
+ return xrep_rmap_scan_rtrefcountbt(&rf, ip);
} else if (ifp->if_format != XFS_DINODE_FMT_EXTENTS) {
return 0;
}