Commit dcdca2c4 authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller

bridge: multicast router list manipulation

I prefer that the hlist be only accessed through the hlist macro
objects. Explicit twiddling of links (especially with RCU) exposes
the code to future bugs.

Compile tested only.
Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7180f775
...@@ -1042,21 +1042,21 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, ...@@ -1042,21 +1042,21 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
static void br_multicast_add_router(struct net_bridge *br, static void br_multicast_add_router(struct net_bridge *br,
struct net_bridge_port *port) struct net_bridge_port *port)
{ {
struct hlist_node *p; struct net_bridge_port *p;
struct hlist_node **h; struct hlist_node *n, *last = NULL;
for (h = &br->router_list.first; hlist_for_each_entry(p, n, &br->router_list, rlist) {
(p = *h) && if ((unsigned long) port >= (unsigned long) p) {
(unsigned long)container_of(p, struct net_bridge_port, rlist) > hlist_add_before_rcu(n, &port->rlist);
(unsigned long)port; return;
h = &p->next) }
; last = n;
}
port->rlist.pprev = h;
port->rlist.next = p; if (last)
rcu_assign_pointer(*h, &port->rlist); hlist_add_after_rcu(last, &port->rlist);
if (p) else
p->pprev = &port->rlist.next; hlist_add_head_rcu(&port->rlist, &br->router_list);
} }
static void br_multicast_mark_router(struct net_bridge *br, static void br_multicast_mark_router(struct net_bridge *br,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment