| To: | "David S. Miller" <davem@xxxxxxxxxx> |
|---|---|
| Subject: | [PATCH] (5/11) bridge - fix deadlock on device removal. |
| From: | Stephen Hemminger <shemminger@xxxxxxxx> |
| Date: | Fri, 21 May 2004 16:13:47 -0700 |
| Cc: | bridge@xxxxxxxx, netdev@xxxxxxxxxxx |
| Organization: | Open Source Development Lab |
| Sender: | netdev-bounce@xxxxxxxxxxx |
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;
}
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | [PATCH] (4/11) bridge - ioctl cleanup and consolidation, Stephen Hemminger |
|---|---|
| Next by Date: | [PATCH] (7/11) bridge -- expose timer_residue function for use by sysfs, Stephen Hemminger |
| Previous by Thread: | [PATCH] (4/11) bridge - ioctl cleanup and consolidation, Stephen Hemminger |
| Next by Thread: | [PATCH] (7/11) bridge -- expose timer_residue function for use by sysfs, Stephen Hemminger |
| Indexes: | [Date] [Thread] [Top] [All Lists] |