• Brian Foster's avatar
    xfs: account format bouncing into rmapbt swapext tx reservation · b3fed434
    Brian Foster authored
    The extent swap mechanism requires a unique implementation for
    rmapbt enabled filesystems. Because the rmapbt tracks extent owner
    information, extent swap must individually unmap and remap each
    extent between the two inodes.
    
    The rmapbt extent swap transaction block reservation currently
    accounts for the worst case bmapbt block and rmapbt block
    consumption based on the extent count of each inode. There is a
    corner case that exists due to the extent swap implementation that
    is not covered by this reservation, however.
    
    If one of the associated inodes is just over the max extent count
    used for extent format inodes (i.e., the inode is in btree format by
    a single extent), the unmap/remap cycle of the extent swap can
    bounce the inode between extent and btree format multiple times,
    almost as many times as there are extents in the inode (if the
    opposing inode happens to have one less, for example). Each back and
    forth cycle involves a block free and allocation, which isn't a
    problem except for that the initial transaction reservation must
    account for the total number of block allocations performed by the
    chain of deferred operations. If not, a block reservation overrun
    occurs and the filesystem shuts down.
    
    Update the rmapbt extent swap block reservation to check for this
    situation and add some block reservation slop to ensure the entire
    operation succeeds. We'd never likely require reservation for both
    inodes as fsr wouldn't defrag the file in that case, but the
    additional reservation is constrained by the data fork size so be
    cautious and check for both.
    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>
    b3fed434
xfs_bmap_util.c 53.6 KB