forked from Minki/linux
xfs: cross-reference the realtime bitmap
While we're scrubbing various btrees, cross-reference the records with the other metadata. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
f6d5fc21fd
commit
46d9bfb5e7
@ -1097,3 +1097,24 @@ xfs_verify_rtbno(
|
||||
{
|
||||
return rtbno < mp->m_sb.sb_rblocks;
|
||||
}
|
||||
|
||||
/* Is the given extent all free? */
|
||||
int
|
||||
xfs_rtalloc_extent_is_free(
|
||||
struct xfs_mount *mp,
|
||||
struct xfs_trans *tp,
|
||||
xfs_rtblock_t start,
|
||||
xfs_extlen_t len,
|
||||
bool *is_free)
|
||||
{
|
||||
xfs_rtblock_t end;
|
||||
int matches;
|
||||
int error;
|
||||
|
||||
error = xfs_rtcheck_range(mp, tp, start, len, 1, &end, &matches);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
*is_free = matches;
|
||||
return 0;
|
||||
}
|
||||
|
@ -243,6 +243,9 @@ xfs_scrub_bmap_rt_extent_xref(
|
||||
{
|
||||
if (info->sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
|
||||
return;
|
||||
|
||||
xfs_scrub_xref_is_used_rt_space(info->sc, irec->br_startblock,
|
||||
irec->br_blockcount);
|
||||
}
|
||||
|
||||
/* Cross-reference a single datadev extent record. */
|
||||
|
@ -98,3 +98,26 @@ xfs_scrub_rtsummary(
|
||||
/* XXX: implement this some day */
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
||||
/* xref check that the extent is not free in the rtbitmap */
|
||||
void
|
||||
xfs_scrub_xref_is_used_rt_space(
|
||||
struct xfs_scrub_context *sc,
|
||||
xfs_rtblock_t fsbno,
|
||||
xfs_extlen_t len)
|
||||
{
|
||||
bool is_free;
|
||||
int error;
|
||||
|
||||
xfs_ilock(sc->mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP);
|
||||
error = xfs_rtalloc_extent_is_free(sc->mp, sc->tp, fsbno, len,
|
||||
&is_free);
|
||||
if (!xfs_scrub_should_check_xref(sc, &error, NULL))
|
||||
goto out_unlock;
|
||||
if (is_free)
|
||||
xfs_scrub_ino_xref_set_corrupt(sc, sc->mp->m_rbmip->i_ino,
|
||||
NULL);
|
||||
out_unlock:
|
||||
xfs_iunlock(sc->mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP);
|
||||
}
|
||||
|
@ -142,5 +142,11 @@ void xfs_scrub_xref_is_cow_staging(struct xfs_scrub_context *sc,
|
||||
xfs_agblock_t bno, xfs_extlen_t len);
|
||||
void xfs_scrub_xref_is_not_shared(struct xfs_scrub_context *sc,
|
||||
xfs_agblock_t bno, xfs_extlen_t len);
|
||||
#ifdef CONFIG_XFS_RT
|
||||
void xfs_scrub_xref_is_used_rt_space(struct xfs_scrub_context *sc,
|
||||
xfs_rtblock_t rtbno, xfs_extlen_t len);
|
||||
#else
|
||||
# define xfs_scrub_xref_is_used_rt_space(sc, rtbno, len) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif /* __XFS_SCRUB_SCRUB_H__ */
|
||||
|
@ -139,6 +139,9 @@ int xfs_rtalloc_query_all(struct xfs_trans *tp,
|
||||
xfs_rtalloc_query_range_fn fn,
|
||||
void *priv);
|
||||
bool xfs_verify_rtbno(struct xfs_mount *mp, xfs_rtblock_t rtbno);
|
||||
int xfs_rtalloc_extent_is_free(struct xfs_mount *mp, struct xfs_trans *tp,
|
||||
xfs_rtblock_t start, xfs_extlen_t len,
|
||||
bool *is_free);
|
||||
#else
|
||||
# define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb) (ENOSYS)
|
||||
# define xfs_rtfree_extent(t,b,l) (ENOSYS)
|
||||
@ -148,6 +151,7 @@ bool xfs_verify_rtbno(struct xfs_mount *mp, xfs_rtblock_t rtbno);
|
||||
# define xfs_rtalloc_query_all(t,f,p) (ENOSYS)
|
||||
# define xfs_rtbuf_get(m,t,b,i,p) (ENOSYS)
|
||||
# define xfs_verify_rtbno(m, r) (false)
|
||||
# define xfs_rtalloc_extent_is_free(m,t,s,l,i) (ENOSYS)
|
||||
static inline int /* error */
|
||||
xfs_rtmount_init(
|
||||
xfs_mount_t *mp) /* file system mount structure */
|
||||
|
Loading…
Reference in New Issue
Block a user