Stephen Hemminger
2007-Apr-18 12:34 UTC
[Bridge] [PATCH] (5/11) bridge - fix deadlock on device removal.
Fix a deadlock where deleting a device call br_del_if with lock held. br_del_if doesn't want to be called under lock anymore. diff -Nru a/net/bridge/br_notify.c b/net/bridge/br_notify.c --- a/net/bridge/br_notify.c 2004-05-21 16:12:47 -07:00 +++ b/net/bridge/br_notify.c 2004-05-21 16:12:47 -07:00 @@ -38,30 +38,35 @@ br = p->br; - spin_lock_bh(&br->lock); - switch (event) - { + switch (event) { case NETDEV_CHANGEADDR: + spin_lock_bh(&br->lock); br_fdb_changeaddr(p, dev->dev_addr); if (br->dev->flags & IFF_UP) br_stp_recalculate_bridge_id(br); + spin_unlock_bh(&br->lock); break; case NETDEV_DOWN: - if (br->dev->flags & IFF_UP) + if (br->dev->flags & IFF_UP) { + spin_lock_bh(&br->lock); br_stp_disable_port(p); + spin_unlock_bh(&br->lock); + } break; case NETDEV_UP: - if (br->dev->flags & IFF_UP) + if (br->dev->flags & IFF_UP) { + spin_lock_bh(&br->lock); br_stp_enable_port(p); + spin_unlock_bh(&br->lock); + } break; case NETDEV_UNREGISTER: br_del_if(br, dev); break; } - spin_unlock_bh(&br->lock); return NOTIFY_DONE; }