mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
xfs: change bmap scrubber to store the previous mapping
Convert the inode data/attr/cow fork scrubber to remember the entire previous mapping, not just the next expected offset. No behavior changes here, but this will enable some better checking in subsequent patches. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
1fc7a0597d
commit
971ee3a670
@ -96,11 +96,23 @@ out:
|
||||
|
||||
struct xchk_bmap_info {
|
||||
struct xfs_scrub *sc;
|
||||
|
||||
/* Incore extent tree cursor */
|
||||
struct xfs_iext_cursor icur;
|
||||
xfs_fileoff_t lastoff;
|
||||
|
||||
/* Previous fork mapping that we examined */
|
||||
struct xfs_bmbt_irec prev_rec;
|
||||
|
||||
/* Is this a realtime fork? */
|
||||
bool is_rt;
|
||||
|
||||
/* May mappings point to shared space? */
|
||||
bool is_shared;
|
||||
|
||||
/* Was the incore extent tree loaded? */
|
||||
bool was_loaded;
|
||||
|
||||
/* Which inode fork are we checking? */
|
||||
int whichfork;
|
||||
};
|
||||
|
||||
@ -405,7 +417,8 @@ xchk_bmap_iextent(
|
||||
* Check for out-of-order extents. This record could have come
|
||||
* from the incore list, for which there is no ordering check.
|
||||
*/
|
||||
if (irec->br_startoff < info->lastoff)
|
||||
if (irec->br_startoff < info->prev_rec.br_startoff +
|
||||
info->prev_rec.br_blockcount)
|
||||
xchk_fblock_set_corrupt(info->sc, info->whichfork,
|
||||
irec->br_startoff);
|
||||
|
||||
@ -712,7 +725,8 @@ xchk_bmap_iextent_delalloc(
|
||||
* Check for out-of-order extents. This record could have come
|
||||
* from the incore list, for which there is no ordering check.
|
||||
*/
|
||||
if (irec->br_startoff < info->lastoff)
|
||||
if (irec->br_startoff < info->prev_rec.br_startoff +
|
||||
info->prev_rec.br_blockcount)
|
||||
xchk_fblock_set_corrupt(info->sc, info->whichfork,
|
||||
irec->br_startoff);
|
||||
|
||||
@ -806,7 +820,6 @@ xchk_bmap(
|
||||
goto out;
|
||||
|
||||
/* Scrub extent records. */
|
||||
info.lastoff = 0;
|
||||
ifp = xfs_ifork_ptr(ip, whichfork);
|
||||
for_each_xfs_iext(ifp, &info.icur, &irec) {
|
||||
if (xchk_should_terminate(sc, &error) ||
|
||||
@ -823,7 +836,7 @@ xchk_bmap(
|
||||
xchk_bmap_iextent_delalloc(ip, &info, &irec);
|
||||
else
|
||||
xchk_bmap_iextent(ip, &info, &irec);
|
||||
info.lastoff = irec.br_startoff + irec.br_blockcount;
|
||||
memcpy(&info.prev_rec, &irec, sizeof(struct xfs_bmbt_irec));
|
||||
}
|
||||
|
||||
error = xchk_bmap_check_rmaps(sc, whichfork);
|
||||
|
Loading…
Reference in New Issue
Block a user