• Josef Bacik's avatar
    btrfs: stop partially refilling tickets when releasing space · 91182645
    Josef Bacik authored
    btrfs_space_info_add_old_bytes is used when adding the extra space from
    an existing reservation back into the space_info to be used by any
    waiting tickets.  In order to keep us from overcommitting we check to
    make sure that we can still use this space for our reserve ticket, and
    if we cannot we'll simply subtract it from space_info->bytes_may_use.
    
    However this is problematic, because it assumes that only changes to
    bytes_may_use would affect our ability to make reservations.  Any
    changes to bytes_reserved would be missed.  If we were unable to make a
    reservation prior because of reserved space, but that reserved space was
    free'd due to unlink or truncate and we were allowed to immediately
    reclaim that metadata space we would still ENOSPC.
    
    Consider the example where we create a file with a bunch of extents,
    using up 2MiB of actual space for the new tree blocks.  Then we try to
    make a reservation of 2MiB but we do not have enough space to make this
    reservation.  The iput() occurs in another thread and we remove this
    space, and since we did not write the blocks we simply do
    space_info->bytes_reserved -= 2MiB.  We would never see this because we
    do not check our space info used, we just try to re-use the freed
    reservations.
    
    To fix this problem, and to greatly simplify the wakeup code, do away
    with this partial refilling nonsense.  Use
    btrfs_space_info_add_old_bytes to subtract the reservation from
    space_info->bytes_may_use, and then check the ticket against the total
    used of the space_info the same way we do with the initial reservation
    attempt.
    
    This keeps the reservation logic consistent and solves the problem of
    early ENOSPC in the case that we free up space in places other than
    bytes_may_use and bytes_pinned.  Thanks,
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    91182645
space-info.c 30.5 KB