aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bridge/br_multicast.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 2048ef0f9be5..fcba313f1894 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1042,21 +1042,21 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
1042static void br_multicast_add_router(struct net_bridge *br, 1042static void br_multicast_add_router(struct net_bridge *br,
1043 struct net_bridge_port *port) 1043 struct net_bridge_port *port)
1044{ 1044{
1045 struct hlist_node *p; 1045 struct net_bridge_port *p;
1046 struct hlist_node **h; 1046 struct hlist_node *n, *last = NULL;
1047 1047
1048 for (h = &br->router_list.first; 1048 hlist_for_each_entry(p, n, &br->router_list, rlist) {
1049 (p = *h) && 1049 if ((unsigned long) port >= (unsigned long) p) {
1050 (unsigned long)container_of(p, struct net_bridge_port, rlist) > 1050 hlist_add_before_rcu(n, &port->rlist);
1051 (unsigned long)port; 1051 return;
1052 h = &p->next) 1052 }
1053 ; 1053 last = n;
1054 1054 }
1055 port->rlist.pprev = h; 1055
1056 port->rlist.next = p; 1056 if (last)
1057 rcu_assign_pointer(*h, &port->rlist); 1057 hlist_add_after_rcu(last, &port->rlist);
1058 if (p) 1058 else
1059 p->pprev = &port->rlist.next; 1059 hlist_add_head_rcu(&port->rlist, &br->router_list);
1060} 1060}
1061 1061
1062static void br_multicast_mark_router(struct net_bridge *br, 1062static void br_multicast_mark_router(struct net_bridge *br,