mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
xfs: make _bmap_count_blocks consistent wrt delalloc extent behavior
There is an inconsistency in the way that _bmap_count_blocks deals with delalloc reservations -- if the specified fork is in extents format, *count is set to the total number of blocks referenced by the in-core fork, including delalloc extents. However, if the fork is in btree format, *count is set to the number of blocks referenced by the on-disk fork, which does /not/ include delalloc extents. For the lone existing caller of _bmap_count_blocks this hasn't been an issue because the function is only used to count xattr fork blocks (where there aren't any delalloc reservations). However, when scrub comes along it will use this same function to check di_nblocks against both on-disk extent maps, so we need this behavior to be consistent. Therefore, fix _bmap_count_leaves not to include delalloc extents and remove unnecessary parameters. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
ea7cdd7b7b
commit
d29cb3e45e
@ -219,20 +219,22 @@ xfs_bmap_eof(
|
||||
*/
|
||||
|
||||
/*
|
||||
* Count leaf blocks given a range of extent records.
|
||||
* Count leaf blocks given a range of extent records. Delayed allocation
|
||||
* extents are not counted towards the totals.
|
||||
*/
|
||||
STATIC void
|
||||
xfs_bmap_count_leaves(
|
||||
xfs_ifork_t *ifp,
|
||||
xfs_extnum_t idx,
|
||||
int numrecs,
|
||||
struct xfs_ifork *ifp,
|
||||
int *count)
|
||||
{
|
||||
int b;
|
||||
xfs_extnum_t i;
|
||||
xfs_extnum_t nr_exts = xfs_iext_count(ifp);
|
||||
|
||||
for (b = 0; b < numrecs; b++) {
|
||||
xfs_bmbt_rec_host_t *frp = xfs_iext_get_ext(ifp, idx + b);
|
||||
*count += xfs_bmbt_get_blockcount(frp);
|
||||
for (i = 0; i < nr_exts; i++) {
|
||||
xfs_bmbt_rec_host_t *frp = xfs_iext_get_ext(ifp, i);
|
||||
if (!isnullstartblock(xfs_bmbt_get_startblock(frp))) {
|
||||
*count += xfs_bmbt_get_blockcount(frp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -334,7 +336,8 @@ xfs_bmap_count_tree(
|
||||
}
|
||||
|
||||
/*
|
||||
* Count fsblocks of the given fork.
|
||||
* Count fsblocks of the given fork. Delayed allocation extents are
|
||||
* not counted towards the totals.
|
||||
*/
|
||||
static int /* error */
|
||||
xfs_bmap_count_blocks(
|
||||
@ -354,7 +357,7 @@ xfs_bmap_count_blocks(
|
||||
mp = ip->i_mount;
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
if ( XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS ) {
|
||||
xfs_bmap_count_leaves(ifp, 0, xfs_iext_count(ifp), count);
|
||||
xfs_bmap_count_leaves(ifp, count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user