• Brian Foster's avatar
    xfs: preserve rmapbt swapext block reservation from freed blocks · f74681ba
    Brian Foster authored
    The rmapbt extent swap algorithm remaps individual extents between
    the source inode and the target to trigger reverse mapping metadata
    updates. If either inode straddles a format or other bmap allocation
    boundary, the individual unmap and map cycles can trigger repeated
    bmap block allocations and frees as the extent count bounces back
    and forth across the boundary. While net block usage is bound across
    the swap operation, this behavior can prematurely exhaust the
    transaction block reservation because it continuously drains as the
    transaction rolls. Each allocation accounts against the reservation
    and each free returns to global free space on transaction roll.
    
    The previous workaround to this problem attempted to detect this
    boundary condition and provide surplus block reservation to
    acommodate it. This is insufficient because more remaps can occur
    than implied by the extent counts; if start offset boundaries are
    not aligned between the two inodes, for example.
    
    To address this problem more generically and dynamically, add a
    transaction accounting mode that returns freed blocks to the
    transaction reservation instead of the superblock counters on
    transaction roll and use it when the rmapbt based algorithm is
    active. This allows the chain of remap transactions to preserve the
    block reservation based own its own frees and prevent premature
    exhaustion regardless of the remap pattern. Note that this is only
    safe for superblocks with lazy sb accounting, but the latter is
    required for v5 supers and the rmap feature depends on v5.
    
    Fixes: b3fed434 ("xfs: account format bouncing into rmapbt swapext tx reservation")
    Root-caused-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    f74681ba
xfs_trans.c 28.1 KB