summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bridge/br_multicast.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index fcba313f1894..d63868c9b2c0 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1039,22 +1039,25 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
}
#endif
+/*
+ * Add port to rotuer_list
+ * list is maintained ordered by pointer value
+ * and locked by br->multicast_lock and RCU
+ */
static void br_multicast_add_router(struct net_bridge *br,
struct net_bridge_port *port)
{
struct net_bridge_port *p;
- struct hlist_node *n, *last = NULL;
+ struct hlist_node *n, *slot = 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 ((unsigned long) port >= (unsigned long) p)
+ break;
+ slot = n;
}
- if (last)
- hlist_add_after_rcu(last, &port->rlist);
+ if (slot)
+ hlist_add_after_rcu(slot, &port->rlist);
else
hlist_add_head_rcu(&port->rlist, &br->router_list);
}