Commit f866560b authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: rtbitmap scrubber should verify written extents

Ensure that the realtime bitmap file is backed entirely by written
extents.  No holes, no unwritten blocks, etc.
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarAllison Collins <allison.henderson@oracle.com>
parent e2705b03
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "xfs_trans.h" #include "xfs_trans.h"
#include "xfs_rtalloc.h" #include "xfs_rtalloc.h"
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_bmap.h"
#include "scrub/scrub.h" #include "scrub/scrub.h"
#include "scrub/common.h" #include "scrub/common.h"
...@@ -58,6 +59,41 @@ xchk_rtbitmap_rec( ...@@ -58,6 +59,41 @@ xchk_rtbitmap_rec(
return 0; return 0;
} }
/* Make sure the entire rtbitmap file is mapped with written extents. */
STATIC int
xchk_rtbitmap_check_extents(
struct xfs_scrub *sc)
{
struct xfs_mount *mp = sc->mp;
struct xfs_bmbt_irec map;
xfs_rtblock_t off;
int nmap;
int error = 0;
for (off = 0; off < mp->m_sb.sb_rbmblocks;) {
if (xchk_should_terminate(sc, &error) ||
(sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
break;
/* Make sure we have a written extent. */
nmap = 1;
error = xfs_bmapi_read(mp->m_rbmip, off,
mp->m_sb.sb_rbmblocks - off, &map, &nmap,
XFS_DATA_FORK);
if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, off, &error))
break;
if (nmap != 1 || !xfs_bmap_is_written_extent(&map)) {
xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, off);
break;
}
off += map.br_blockcount;
}
return error;
}
/* Scrub the realtime bitmap. */ /* Scrub the realtime bitmap. */
int int
xchk_rtbitmap( xchk_rtbitmap(
...@@ -70,6 +106,10 @@ xchk_rtbitmap( ...@@ -70,6 +106,10 @@ xchk_rtbitmap(
if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)) if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
return error; return error;
error = xchk_rtbitmap_check_extents(sc);
if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
return error;
error = xfs_rtalloc_query_all(sc->tp, xchk_rtbitmap_rec, sc); error = xfs_rtalloc_query_all(sc->tp, xchk_rtbitmap_rec, sc);
if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, &error)) if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, &error))
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment