• C
    Btrfs: break out of shrink_delalloc earlier · 36e39c40
    Chris Mason 提交于
    Josef had changed shrink_delalloc to exit after three shrink
    attempts, which wasn't quite enough because new writers could
    race in and steal free space.
    
    But it also fixed deadlocks and stalls as we tried to recover
    delalloc reservations.  The code was tweaked to loop 1024
    times, and would reset the counter any time a small amount
    of progress was made.  This was too drastic, and with a
    lot of writers we can end up stuck in shrink_delalloc forever.
    
    The shrink_delalloc loop is fairly complex because the caller is looping
    too, and the caller will go ahead and force a transaction commit to make
    sure we reclaim space.
    
    This reworks things to exit shrink_delalloc when we've forced some
    writeback and the delalloc reservations have gone down.  This means
    the writeback has not just started but has also finished at
    least some of the metadata changes required to reclaim delalloc
    space.
    
    If we've got this wrong, we're returning ENOSPC too early, which
    is a big improvement over the current behavior of hanging the machine.
    
    Test 224 in xfstests hammers on this nicely, and with 1000 writers
    trying to fill a 1GB drive we get our first ENOSPC at 93% full.  The
    other writers are able to continue until we get 100%.
    
    This is a worst case test for btrfs because the 1000 writers are doing
    small IO, and the small FS size means we don't have a lot of room
    for metadata chunks.
    Signed-off-by: NChris Mason <chris.mason@oracle.com>
    36e39c40
extent-tree.c 228.6 KB