• David Fries's avatar
    W1: fix deadlocks and remove w1_control_thread · c30c9b15
    David Fries authored
    w1_control_thread was removed which would wake up every second and process
    newly registered family codes and complete some final cleanup for a
    removed master.  Those routines were moved to the threads that were
    previously requesting those operations.  A new function
    w1_reconnect_slaves takes care of reconnecting existing slave devices when
    a new family code is registered or removed.  The removal case was missing
    and would cause a deadlock waiting for the family code reference count to
    decrease, which will now happen.  A problem with registering a family code
    was fixed.  A slave device would be unattached if it wasn't yet claimed,
    then attached at the end of the list, two unclaimed slaves would cause an
    infinite loop.
    
    The struct w1_bus_master.search now takes a pointer to the struct
    w1_master device to avoid searching for it, which would have caused a
    lock ordering deadlock with the removal of w1_control_thread.
    Signed-off-by: default avatarDavid Fries <david@fries.net>
    Signed-off-by: default avatarEvgeniy Polyakov <johnpol@2ka.mipt.ru>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c30c9b15
w1_family.c 3.09 KB