#include "xfs_trans.h"
 #include "xfs_rtalloc.h"
 #include "xfs_inode.h"
+#include "xfs_bmap.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 
        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. */
 int
 xchk_rtbitmap(
        if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
                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);
        if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, 0, &error))
                goto out;