| From b8158b936bde6be3ff59a8261252f1003cb72020 Mon Sep 17 00:00:00 2001 |
| From: stephen hemminger <stephen@networkplumber.org> |
| Date: Thu, 2 May 2013 14:23:28 +0000 |
| Subject: bridge: fix race with topology change timer |
| |
| |
| From: stephen hemminger <stephen@networkplumber.org> |
| |
| [ Upstream commit 83401eb4990ff6af55aeed8f49681558544192e6 ] |
| |
| A bridge should only send topology change notice if it is not |
| the root bridge. It is possible for message age timer to elect itself |
| as a new root bridge, and still have a topology change timer running |
| but waiting for bridge lock on other CPU. |
| |
| Solve the race by checking if we are root bridge before continuing. |
| This was the root cause of the cases where br_send_tcn_bpdu would OOPS. |
| |
| Reported-by: JerryKang <jerry.kang@samsung.com> |
| Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/bridge/br_stp_timer.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/net/bridge/br_stp_timer.c |
| +++ b/net/bridge/br_stp_timer.c |
| @@ -107,7 +107,7 @@ static void br_tcn_timer_expired(unsigne |
| |
| br_debug(br, "tcn timer expired\n"); |
| spin_lock(&br->lock); |
| - if (br->dev->flags & IFF_UP) { |
| + if (!br_is_root_bridge(br) && (br->dev->flags & IFF_UP)) { |
| br_transmit_tcn(br); |
| |
| mod_timer(&br->tcn_timer,jiffies + br->bridge_hello_time); |