From 7c6dbf145d891b5994b87f040d91f784ecae982e Mon Sep 17 00:00:00 2001 From: Vitalii Demianets Date: Fri, 25 Nov 2011 00:16:37 +0000 Subject: [PATCH] --- yaml --- r: 276267 b: refs/heads/master c: b03b6dd58cef7d15b7c46a6729b83dd535ef08ab h: refs/heads/master i: 276265: 4be82add2a1aed144205012772c8c47d605c5083 276263: 08d5bb3561158dd2c14879aba655559fd2e88d2a v: v3 --- [refs] | 2 +- trunk/net/bridge/br_netlink.c | 6 ++++++ trunk/net/bridge/br_stp.c | 29 ++++++++++++++--------------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/[refs] b/[refs] index 2f80ae1840b2..58d5756192c7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: efbc368dcc6426d5430b9b8eeda944cf2cb74b8c +refs/heads/master: b03b6dd58cef7d15b7c46a6729b83dd535ef08ab diff --git a/trunk/net/bridge/br_netlink.c b/trunk/net/bridge/br_netlink.c index e5f9ece3c9a0..a1daf8227ed1 100644 --- a/trunk/net/bridge/br_netlink.c +++ b/trunk/net/bridge/br_netlink.c @@ -18,6 +18,7 @@ #include #include "br_private.h" +#include "br_private_stp.h" static inline size_t br_nlmsg_size(void) { @@ -188,6 +189,11 @@ static int br_rtm_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) p->state = new_state; br_log_state(p); + + spin_lock_bh(&p->br->lock); + br_port_state_selection(p->br); + spin_unlock_bh(&p->br->lock); + br_ifinfo_notify(RTM_NEWLINK, p); return 0; diff --git a/trunk/net/bridge/br_stp.c b/trunk/net/bridge/br_stp.c index ad0a3f7cf6cc..dd147d78a588 100644 --- a/trunk/net/bridge/br_stp.c +++ b/trunk/net/bridge/br_stp.c @@ -399,25 +399,24 @@ void br_port_state_selection(struct net_bridge *br) struct net_bridge_port *p; unsigned int liveports = 0; - /* Don't change port states if userspace is handling STP */ - if (br->stp_enabled == BR_USER_STP) - return; - list_for_each_entry(p, &br->port_list, list) { if (p->state == BR_STATE_DISABLED) continue; - if (p->port_no == br->root_port) { - p->config_pending = 0; - p->topology_change_ack = 0; - br_make_forwarding(p); - } else if (br_is_designated_port(p)) { - del_timer(&p->message_age_timer); - br_make_forwarding(p); - } else { - p->config_pending = 0; - p->topology_change_ack = 0; - br_make_blocking(p); + /* Don't change port states if userspace is handling STP */ + if (br->stp_enabled != BR_USER_STP) { + if (p->port_no == br->root_port) { + p->config_pending = 0; + p->topology_change_ack = 0; + br_make_forwarding(p); + } else if (br_is_designated_port(p)) { + del_timer(&p->message_age_timer); + br_make_forwarding(p); + } else { + p->config_pending = 0; + p->topology_change_ack = 0; + br_make_blocking(p); + } } if (p->state == BR_STATE_FORWARDING)