Skip to content

Commit

Permalink
bridge: multicast router list manipulation
Browse files Browse the repository at this point in the history
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: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
stephen hemminger authored and David S. Miller committed Apr 27, 2010
1 parent 7180f77 commit dcdca2c
Showing 1 changed file with 15 additions and 15 deletions.
30 changes: 15 additions & 15 deletions net/bridge/br_multicast.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
struct net_bridge_port *port)
{
struct hlist_node *p;
struct hlist_node **h;

for (h = &br->router_list.first;
(p = *h) &&
(unsigned long)container_of(p, struct net_bridge_port, rlist) >
(unsigned long)port;
h = &p->next)
;

port->rlist.pprev = h;
port->rlist.next = p;
rcu_assign_pointer(*h, &port->rlist);
if (p)
p->pprev = &port->rlist.next;
struct net_bridge_port *p;
struct hlist_node *n, *last = NULL;

hlist_for_each_entry(p, n, &br->router_list, rlist) {
if ((unsigned long) port >= (unsigned long) p) {
hlist_add_before_rcu(n, &port->rlist);
return;
}
last = n;
}

if (last)
hlist_add_after_rcu(last, &port->rlist);
else
hlist_add_head_rcu(&port->rlist, &br->router_list);
}

static void br_multicast_mark_router(struct net_bridge *br,
Expand Down

0 comments on commit dcdca2c

Please sign in to comment.