Record BMBT blocks in the raw rmap list.
[dchinner: remove unused lastowner/lastoffset variables from scan.c]
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
return slab_add(ag_rmaps[agno].ar_raw_rmaps, &rmap);
}
+/*
+ * Add a reverse mapping for an inode fork's block mapping btree block.
+ */
+int
+add_bmbt_rmap(
+ struct xfs_mount *mp,
+ xfs_ino_t ino,
+ int whichfork,
+ xfs_fsblock_t fsbno)
+{
+ xfs_agnumber_t agno;
+ xfs_agblock_t agbno;
+
+ if (!needs_rmap_work(mp))
+ return 0;
+
+ agno = XFS_FSB_TO_AGNO(mp, fsbno);
+ agbno = XFS_FSB_TO_AGBNO(mp, fsbno);
+ ASSERT(agno != NULLAGNUMBER);
+ ASSERT(agno < mp->m_sb.sb_agcount);
+ ASSERT(agbno + 1 <= mp->m_sb.sb_agblocks);
+
+ return __add_raw_rmap(mp, agno, agbno, 1, ino,
+ whichfork == XFS_ATTR_FORK, true);
+}
+
/*
* Add a reverse mapping for a per-AG fixed metadata extent.
*/
extern int add_rmap(struct xfs_mount *, xfs_ino_t, int, struct xfs_bmbt_irec *);
extern int add_ag_rmap(struct xfs_mount *, xfs_agnumber_t agno,
xfs_agblock_t agbno, xfs_extlen_t len, uint64_t owner);
+extern int add_bmbt_rmap(struct xfs_mount *, xfs_ino_t, int, xfs_fsblock_t);
extern int fold_raw_rmaps(struct xfs_mount *mp, xfs_agnumber_t agno);
extern bool mergeable_rmaps(struct xfs_rmap_irec *r1, struct xfs_rmap_irec *r2);
#include "bmap.h"
#include "progress.h"
#include "threads.h"
+#include "rmap.h"
static xfs_mount_t *mp = NULL;
xfs_agnumber_t agno;
xfs_agblock_t agbno;
int state;
+ int error;
/*
* unlike the ag freeblock btrees, if anything looks wrong
(*tot)++;
numrecs = be16_to_cpu(block->bb_numrecs);
+ /* Record BMBT blocks in the reverse-mapping data. */
+ if (check_dups && collect_rmaps) {
+ error = add_bmbt_rmap(mp, ino, whichfork, bno);
+ if (error)
+ do_error(
+_("couldn't add inode %"PRIu64" bmbt block %"PRIu64" reverse-mapping data."),
+ ino, bno);
+ }
+
if (level == 0) {
if (numrecs > mp->m_bmap_dmxr[0] || (isroot == 0 && numrecs <
mp->m_bmap_dmnr[0])) {
int numrecs;
int state;
xfs_agblock_t lastblock = 0;
- int64_t lastowner = 0;
- int64_t lastoffset = 0;
if (magic != XFS_RMAP_CRC_MAGIC) {
name = "(unknown)";
if (i == 0) {
advance:
lastblock = b;
- lastowner = owner;
- lastoffset = offset;
} else {
bool bad;