• Josef Bacik's avatar
    Btrfs: change how we calculate the global block rsv · ae2e4728
    Josef Bacik authored
    Traditionally we've calculated the global block rsv by guessing how much of the
    metadata used amount was the extent tree, and then taking the data size and
    figuring out how large the csum tree would have to be to hold that much data.
    
    This is imprecise and falls down on MIXED file systems as we can't trust the
    data used amount.  This resulted in failures for xfstests generic/333 because it
    creates lots of clones, which explodes out the extent tree.  Our global reserve
    calculations were woefully inaccurate in this case which meant we got into a
    situation where we did not have enough reserved to do our work.
    
    We know we only use the global block rsv for the extent, csum, and root trees,
    so just get the bytes used for these trees and use that as the basis of our
    global reserve.  Since these are not reference counted trees the bytes_used
    value will be accurate.  This fixed the transaction aborts seen with
    generic/333.  Thanks,
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ae2e4728
extent-tree.c 303 KB