• Josef Bacik's avatar
    btrfs: fix btrfs_calc_reclaim_metadata_size calculation · fa121a26
    Josef Bacik authored
    I noticed while running my snapshot torture test that we were getting a
    lot of metadata chunks allocated with very little actually used.
    Digging into this we would commit the transaction, still not have enough
    space, and then force a chunk allocation.
    
    I noticed that we were barely flushing any delalloc at all, despite the
    fact that we had around 13gib of outstanding delalloc reservations.  It
    turns out this is because of our btrfs_calc_reclaim_metadata_size()
    calculation.  It _only_ takes into account the outstanding ticket sizes,
    which isn't the whole story.  In this particular workload we're slowly
    filling up the disk, which means our overcommit space will suddenly
    become a lot less, and our outstanding reservations will be well more
    than what we can handle.  However we are only flushing based on our
    ticket size, which is much less than we need to actually reclaim.
    
    So fix btrfs_calc_reclaim_metadata_size() to take into account the
    overage in the case that we've gotten less available space suddenly.
    This makes it so we attempt to reclaim a lot more delalloc space, which
    allows us to make our reservations and we no longer are allocating a
    bunch of needless metadata chunks.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    fa121a26
space-info.c 38.9 KB