mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-23 23:50:51 +07:00
xfs: directory scrub should check the null bestfree entries too
Teach the directory scrubber to check all the bestfree entries,
including the null ones. We want to be able to detect the case where
the entry is null but there actually /is/ a directory data block.
Found by fuzzing lbests[0] = ones in xfs/391.
Fixes: df481968f3
("xfs: scrub directory freespace")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
498fe261f0
commit
6b48e5b8a2
@ -558,14 +558,27 @@ xchk_directory_leaf1_bestfree(
|
||||
/* Check all the bestfree entries. */
|
||||
for (i = 0; i < bestcount; i++, bestp++) {
|
||||
best = be16_to_cpu(*bestp);
|
||||
if (best == NULLDATAOFF)
|
||||
continue;
|
||||
error = xfs_dir3_data_read(sc->tp, sc->ip,
|
||||
i * args->geo->fsbcount, 0, &dbp);
|
||||
xfs_dir2_db_to_da(args->geo, i),
|
||||
XFS_DABUF_MAP_HOLE_OK,
|
||||
&dbp);
|
||||
if (!xchk_fblock_process_error(sc, XFS_DATA_FORK, lblk,
|
||||
&error))
|
||||
break;
|
||||
xchk_directory_check_freesp(sc, lblk, dbp, best);
|
||||
|
||||
if (!dbp) {
|
||||
if (best != NULLDATAOFF) {
|
||||
xchk_fblock_set_corrupt(sc, XFS_DATA_FORK,
|
||||
lblk);
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (best == NULLDATAOFF)
|
||||
xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
|
||||
else
|
||||
xchk_directory_check_freesp(sc, lblk, dbp, best);
|
||||
xfs_trans_brelse(sc->tp, dbp);
|
||||
if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user