• Filipe Manana's avatar
    btrfs: stop reserving excessive space for block group item updates · f66e0209
    Filipe Manana authored
    Space for block group item updates, necessary after allocating or
    deallocating an extent from a block group, is reserved in the delayed
    refs block reserve. Currently we do this by incrementing the transaction
    handle's delayed_ref_updates counter and then calling
    btrfs_update_delayed_refs_rsv(), which will increase the size of the
    delayed refs block reserve by an amount that corresponds to the same
    amount we use for delayed refs, given by btrfs_calc_delayed_ref_bytes().
    
    That is an excessive amount because it corresponds to the amount of space
    needed to insert one item in a btree (btrfs_calc_insert_metadata_size())
    times 2 when the free space tree feature is enabled. All we need is an
    amount as given by btrfs_calc_metadata_size(), since we only need to
    update an existing block group item in the extent tree (or block group
    tree if this feature is enabled). By using btrfs_calc_metadata_size() we
    will need to reserve 4 times less space when using the free space tree
    and 2 times less space when not using it, putting less pressure on space
    reservation.
    
    So use helpers to reserve and release space for block group item updates
    that use btrfs_calc_metadata_size() for calculation of the space.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    f66e0209
delayed-ref.h 12.6 KB