• Dennis Yang's avatar
    dm thin metadata: THIN_MAX_CONCURRENT_LOCKS should be 6 · 2904adc5
    Dennis Yang authored
    commit 490ae017 upstream.
    
    For btree removal, there is a corner case that a single thread
    could takes 6 locks which is more than THIN_MAX_CONCURRENT_LOCKS(5)
    and leads to deadlock.
    
    A btree removal might eventually call
    rebalance_children()->rebalance3() to rebalance entries of three
    neighbor child nodes when shadow_spine has already acquired two
    write locks. In rebalance3(), it tries to shadow and acquire the
    write locks of all three child nodes. However, shadowing a child
    node requires acquiring a read lock of the original child node and
    a write lock of the new block. Although the read lock will be
    released after block shadowing, shadowing the third child node
    in rebalance3() could still take the sixth lock.
    (2 write locks for shadow_spine +
     2 write locks for the first two child nodes's shadow +
     1 write lock for the last child node's shadow +
     1 read lock for the last child node)
    Signed-off-by: default avatarDennis Yang <dennisyang@qnap.com>
    Acked-by: default avatarJoe Thornber <thornber@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2904adc5
dm-thin-metadata.c 44.9 KB