diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2019-01-16 10:12:39 -0800 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2019-02-04 09:31:22 -0800 |
commit | babcf3e7ff0e5ac0cc5f583cc75278bc0ab633be (patch) | |
tree | 1afc5dbfcf6cd6677f8bf1d956429877425b66eb /fs/xfs/scrub/rtbitmap.c | |
parent | d289cd66856e46b6eb56f5d6208daa131fd9da90 (diff) |
xfs: cross-reference the realtime rmapbtrealtime-rmap_2019-02-04
When we're scrubbing the realtime metadata, cross-reference
the rtrmapt.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs/scrub/rtbitmap.c')
-rw-r--r-- | fs/xfs/scrub/rtbitmap.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/xfs/scrub/rtbitmap.c b/fs/xfs/scrub/rtbitmap.c index 43912027a15d..db8bd05ba51c 100644 --- a/fs/xfs/scrub/rtbitmap.c +++ b/fs/xfs/scrub/rtbitmap.c @@ -15,12 +15,16 @@ #include "xfs_log_format.h" #include "xfs_trans.h" #include "xfs_sb.h" +#include "xfs_inode.h" #include "xfs_alloc.h" #include "xfs_rtalloc.h" #include "xfs_inode.h" +#include "xfs_rmap.h" +#include "xfs_rtrmap_btree.h" #include "scrub/xfs_scrub.h" #include "scrub/scrub.h" #include "scrub/common.h" +#include "scrub/btree.h" #include "scrub/trace.h" /* Set us up with the realtime metadata locked. */ @@ -39,11 +43,31 @@ xchk_setup_rt( sc->ip = sc->mp->m_rbmip; xfs_ilock(sc->ip, sc->ilock_flags); + if (xfs_sb_version_hasrmapbt(&sc->mp->m_sb)) { + unsigned int lockmode = XFS_ILOCK_EXCL; + + xfs_ilock(sc->mp->m_rrmapip, lockmode); + xfs_trans_ijoin(sc->tp, sc->mp->m_rrmapip, lockmode); + } + return 0; } /* Realtime bitmap. */ +/* Cross-reference rtbitmap entries with other metadata. */ +STATIC void +xchk_rtbitmap_xref( + struct xfs_scrub *sc, + xfs_rtblock_t startblock, + xfs_rtblock_t blockcount) +{ + if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) + return; + + xchk_xref_has_no_owner(sc, startblock, blockcount); +} + /* Scrub a free extent record from the realtime bitmap. */ STATIC int xchk_rtbitmap_rec( @@ -62,6 +86,8 @@ xchk_rtbitmap_rec( !xfs_verify_rtbno(sc->mp, startblock) || !xfs_verify_rtbno(sc->mp, startblock + blockcount - 1)) xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, 0); + + xchk_rtbitmap_xref(sc, startblock, blockcount); return 0; } @@ -77,6 +103,10 @@ xchk_rtbitmap( if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)) return error; + error = xchk_rt_init(sc, &sc->sa); + if (error) + return error; + error = xfs_rtalloc_query_all(sc->tp, xchk_rtbitmap_rec, sc); if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, &error)) goto out; |