Message ID | 20240327110318.2776850-9-hch@lst.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [01/13] xfs: make XFS_TRANS_LOWMODE match the other XFS_TRANS_ definitions | expand |
On Wed, Mar 27, 2024 at 12:03:13PM +0100, Christoph Hellwig wrote: > 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: Darrick J. Wong <djwong@kernel.org> Looks good. Reviewed-by: Dave Chinner <dchinner@redhat.com>
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 572c91c986b6af..a9a23a5d2e487f 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4917,6 +4917,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; @@ -4932,15 +4933,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; @@ -5017,12 +5014,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; }