• Kent Overstreet's avatar
    bcachefs: Fix restart handling in for_each_btree_key() · e5fa91d7
    Kent Overstreet authored
    Code that uses for_each_btree_key often wants transaction restarts to be
    handled locally and not returned. Originally, we wouldn't return
    transaction restarts if there was a single iterator in the transaction -
    the reasoning being if there weren't other iterators being invalidated,
    and the current iterator was being advanced/retraversed, there weren't
    any locks or iterators we were required to preserve.
    
    But with the btree_path conversion that approach doesn't work anymore -
    even when we're using for_each_btree_key() with a single iterator there
    will still be two paths in the transaction, since we now always preserve
    the path at the pos the iterator was initialized at - the reason being
    that on restart we often restart from the same place.
    
    And it turns out there's now a lot of for_each_btree_key() uses that _do
    not_ want transaction restarts handled locally, and should be returning
    them.
    
    This patch splits out for_each_btree_key_norestart() and
    for_each_btree_key_continue_norestart(), and converts existing users as
    appropriate. for_each_btree_key(), for_each_btree_key_continue(), and
    for_each_btree_node() now handle transaction restarts themselves by
    calling bch2_trans_begin() when necessary - and the old hack to not
    return transaction restarts when there's a single path in the
    transaction has been deleted.
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
    e5fa91d7
btree_iter.c 72.5 KB