• Josef Bacik's avatar
    btrfs: rip out may_commit_transaction · c416a30c
    Josef Bacik authored
    may_commit_transaction was introduced before the ticketing
    infrastructure existed.  There was a problem where we'd legitimately be
    out of space, but every reservation would trigger a transaction commit
    and then fail.  Thus if you had 1000 things trying to make a
    reservation, they'd all do the flushing loop and thus commit the
    transaction 1000 times before they'd get their ENOSPC.
    
    This helper was introduced to short circuit this, if there wasn't space
    that could be reclaimed by committing the transaction then simply ENOSPC
    out.  This made true ENOSPC tests much faster as we didn't waste a bunch
    of time.
    
    However many of our bugs over the years have been from cases where we
    didn't account for some space that would be reclaimed by committing a
    transaction.  The delayed refs rsv space, delayed rsv, many pinned bytes
    miscalculations, etc.  And in the meantime the original problem has been
    solved with ticketing.  We no longer will commit the transaction 1000
    times.  Instead we'll get 1000 waiters, we will go through the flushing
    mechanisms, and if there's no progress after 2 loops we ENOSPC everybody
    out.  The ticketing infrastructure gives us a deterministic way to see
    if we're making progress or not, thus we avoid a lot of extra work.
    
    So simplify this step by simply unconditionally committing the
    transaction.  This removes what is arguably our most common source of
    early ENOSPC bugs and will allow us to drastically simplify many of the
    things we track because we simply won't need them with this stuff gone.
    Reviewed-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>
    c416a30c
space-info.c 50.5 KB