#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"
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_rtgroup *rtg = NULL;
+ struct xfs_btree_cur *cur;
+ int error;
+
+ if (rf->whichfork != XFS_DATA_FORK)
+ return -EFSCORRUPTED;
+
+ while ((rtg = xfs_rtgroup_next(sc->mp, rtg))) {
+ if (ip == rtg->rtg_inodes[XFS_RTGI_RMAP]) {
+ cur = xfs_rtrmapbt_init_cursor(sc->tp, rtg);
+ error = xrep_rmap_scan_iroot_btree(rf, cur);
+ xfs_btree_del_cursor(cur, error);
+ xfs_rtgroup_rele(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(
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;
}