mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
xfs: cleanup fdblock/frextent accounting in xfs_bmap_del_extent_delay
The code to account fdblocks and frextents in xfs_bmap_del_extent_delay is a bit weird in that it accounts frextents before the iext tree manipulations and fdblocks after it. Given that the iext tree manipulations cannot fail currently that's not really a problem, but still odd. Move the frextent manipulation to the end, and use a fdblocks variable to account of the unconditional indirect blocks and the data blocks only freed for !RT. This prepares for following updates in the area and already makes the code more readable. Also remove the !isrt assert given that this code clearly handles rt extents correctly, and we'll soon reinstate delalloc support for RT inodes. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
This commit is contained in:
parent
dc1b17a25c
commit
7e77d57a1f
@ -4919,6 +4919,7 @@ xfs_bmap_del_extent_delay(
|
||||
xfs_fileoff_t del_endoff, got_endoff;
|
||||
xfs_filblks_t got_indlen, new_indlen, stolen;
|
||||
uint32_t state = xfs_bmap_fork_to_state(whichfork);
|
||||
uint64_t fdblocks;
|
||||
int error = 0;
|
||||
bool isrt;
|
||||
|
||||
@ -4934,15 +4935,11 @@ xfs_bmap_del_extent_delay(
|
||||
ASSERT(got->br_startoff <= del->br_startoff);
|
||||
ASSERT(got_endoff >= del_endoff);
|
||||
|
||||
if (isrt)
|
||||
xfs_add_frextents(mp, xfs_rtb_to_rtx(mp, del->br_blockcount));
|
||||
|
||||
/*
|
||||
* Update the inode delalloc counter now and wait to update the
|
||||
* sb counters as we might have to borrow some blocks for the
|
||||
* indirect block accounting.
|
||||
*/
|
||||
ASSERT(!isrt);
|
||||
error = xfs_quota_unreserve_blkres(ip, del->br_blockcount);
|
||||
if (error)
|
||||
return error;
|
||||
@ -5019,12 +5016,15 @@ xfs_bmap_del_extent_delay(
|
||||
|
||||
ASSERT(da_old >= da_new);
|
||||
da_diff = da_old - da_new;
|
||||
if (!isrt)
|
||||
da_diff += del->br_blockcount;
|
||||
if (da_diff) {
|
||||
xfs_add_fdblocks(mp, da_diff);
|
||||
xfs_mod_delalloc(mp, -da_diff);
|
||||
}
|
||||
fdblocks = da_diff;
|
||||
|
||||
if (isrt)
|
||||
xfs_add_frextents(mp, xfs_rtb_to_rtx(mp, del->br_blockcount));
|
||||
else
|
||||
fdblocks += del->br_blockcount;
|
||||
|
||||
xfs_add_fdblocks(mp, fdblocks);
|
||||
xfs_mod_delalloc(mp, -(int64_t)fdblocks);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user