Commit 35ce8523 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

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: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 181fdfe6
Loading
Loading
Loading
Loading
+5 −15
Original line number Diff line number Diff line
@@ -435,24 +435,14 @@ xfs_scrub_directory_check_freesp(
	struct xfs_buf			*dbp,
	unsigned int			len)
{
	struct xfs_dir2_data_free	*bf;
	struct xfs_dir2_data_free	*dfp;
	int				offset;

	if (len == 0)
		return;
	dfp = sc->ip->d_ops->data_bestfree_p(dbp->b_addr);

	bf = sc->ip->d_ops->data_bestfree_p(dbp->b_addr);
	for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) {
		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;
	}
	if (len != be16_to_cpu(dfp->length))
		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);
}