• Omar Sandoval's avatar
    Btrfs: fix early ENOSPC due to delalloc · 17024ad0
    Omar Sandoval authored
    If a lot of metadata is reserved for outstanding delayed allocations, we
    rely on shrink_delalloc() to reclaim metadata space in order to fulfill
    reservation tickets. However, shrink_delalloc() has a shortcut where if
    it determines that space can be overcommitted, it will stop early. This
    made sense before the ticketed enospc system, but now it means that
    shrink_delalloc() will often not reclaim enough space to fulfill any
    tickets, leading to an early ENOSPC. (Reservation tickets don't care
    about being able to overcommit, they need every byte accounted for.)
    
    Fix it by getting rid of the shortcut so that shrink_delalloc() reclaims
    all of the metadata it is supposed to. This fixes early ENOSPCs we were
    seeing when doing a btrfs receive to populate a new filesystem, as well
    as early ENOSPCs Christoph saw when doing a big cp -r onto Btrfs.
    
    Fixes: 957780eb ("Btrfs: introduce ticketed enospc infrastructure")
    Tested-by: default avatarChristoph Anton Mitterer <mail@christoph.anton.mitterer.name>
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    17024ad0
extent-tree.c 300 KB