xfs: refactor the directory data block bestfree checks

In a directory data block, the zeroth bestfree item must point to the
longest free space.  Therefore, when we check the bestfree block's
records against the data blocks, we only need to compare with bf[0] and
don't need the loop.

The weird loop was most probably the result of an earlier refactoring
gone bad.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
Darrick J. Wong 2017-11-06 11:37:46 -08:00
parent 181fdfe662
commit 35ce852334
1 changed files with 5 additions and 15 deletions

View File

@ -435,25 +435,15 @@ xfs_scrub_directory_check_freesp(
struct xfs_buf *dbp, struct xfs_buf *dbp,
unsigned int len) unsigned int len)
{ {
struct xfs_dir2_data_free *bf;
struct xfs_dir2_data_free *dfp; struct xfs_dir2_data_free *dfp;
int offset;
if (len == 0) dfp = sc->ip->d_ops->data_bestfree_p(dbp->b_addr);
return;
bf = sc->ip->d_ops->data_bestfree_p(dbp->b_addr); if (len != be16_to_cpu(dfp->length))
for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) { xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
offset = be16_to_cpu(dfp->offset);
if (offset == 0)
break;
if (len == be16_to_cpu(dfp->length))
return;
/* Didn't find the best length in the bestfree data */
break;
}
xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk); if (len > 0 && be16_to_cpu(dfp->offset) == 0)
xfs_scrub_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
} }
/* Check free space info in a directory leaf1 block. */ /* Check free space info in a directory leaf1 block. */