diff options
author | Li RongQing <roy.qing.li@gmail.com> | 2014-06-18 04:07:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-21 18:33:22 -0400 |
commit | a3f5ee71cdec56543e0420a788dc7df335944dd5 (patch) | |
tree | 134c1fbba4689c50eb7c0cdc76961425da67836e /net/bridge | |
parent | 545a112bb3dcf8e4574fc985f07bf7ea03a7f809 (diff) |
bridge: use list_for_each_entry_continue_reverse
use list_for_each_entry_continue_reverse to rollback in fdb_add_hw
when add address failed
Signed-off-by: Li RongQing <roy.qing.li@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
-rw-r--r-- | net/bridge/br_fdb.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index b524c36c1273..7be33667a839 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -93,7 +93,7 @@ static void fdb_rcu_free(struct rcu_head *head) | |||
93 | static void fdb_add_hw(struct net_bridge *br, const unsigned char *addr) | 93 | static void fdb_add_hw(struct net_bridge *br, const unsigned char *addr) |
94 | { | 94 | { |
95 | int err; | 95 | int err; |
96 | struct net_bridge_port *p, *tmp; | 96 | struct net_bridge_port *p; |
97 | 97 | ||
98 | ASSERT_RTNL(); | 98 | ASSERT_RTNL(); |
99 | 99 | ||
@@ -107,11 +107,9 @@ static void fdb_add_hw(struct net_bridge *br, const unsigned char *addr) | |||
107 | 107 | ||
108 | return; | 108 | return; |
109 | undo: | 109 | undo: |
110 | list_for_each_entry(tmp, &br->port_list, list) { | 110 | list_for_each_entry_continue_reverse(p, &br->port_list, list) { |
111 | if (tmp == p) | 111 | if (!br_promisc_port(p)) |
112 | break; | 112 | dev_uc_del(p->dev, addr); |
113 | if (!br_promisc_port(tmp)) | ||
114 | dev_uc_del(tmp->dev, addr); | ||
115 | } | 113 | } |
116 | } | 114 | } |
117 | 115 | ||