• Jan Schmidt's avatar
    Btrfs: resolve tree mod log locking issue in btrfs_next_leaf · d42244a0
    Jan Schmidt authored
    With the tree mod log, we may end up with two roots (the current root and a
    rewinded version of it) both pointing to two leaves, l1 and l2, of which l2
    had already been cow-ed in the current transaction. If we don't rewind any
    tree blocks, we cannot have two roots both pointing to an already cowed tree
    block.
    
    Now there is btrfs_next_leaf, which has a leaf locked and wants a lock on
    the next (right) leaf. And there is push_leaf_left, which has a (cowed!)
    leaf locked and wants a lock on the previous (left) leaf.
    
    In order to solve this dead lock situation, we use try_lock in
    btrfs_next_leaf (only in case it's called with a tree mod log time_seq
    paramter) and if we fail to get a lock on the next leaf, we give up our lock
    on the current leaf and retry from the very beginning.
    Signed-off-by: default avatarJan Schmidt <list.btrfs@jan-o-sch.net>
    d42244a0
ctree.c 135 KB