• Josef Bacik's avatar
    btrfs: run btrfs_try_granting_tickets if a priority ticket fails · 42a72cb7
    Josef Bacik authored
    With normal tickets we could have a large reservation at the front of
    the list that is unable to be satisfied, but a smaller ticket later on
    that can be satisfied.  The way we handle this is to run
    btrfs_try_granting_tickets() in maybe_fail_all_tickets().
    
    However no such protection exists for priority tickets.  Fix this by
    handling it in handle_reserve_ticket().  If we've returned after
    attempting to flush space in a priority related way, we'll still be on
    the priority list and need to be removed.
    
    We rely on the flushing to free up space and wake the ticket, but if
    there is not enough space to reclaim _but_ there's enough space in the
    space_info to handle subsequent reservations then we would have gotten
    an ENOSPC erroneously.
    
    Address this by catching where we are still on the list, meaning we were
    a priority ticket, and removing ourselves and then running
    btrfs_try_granting_tickets().  This will handle this particular corner
    case.
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Tested-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    42a72cb7
space-info.c 41 KB