diff options
| -rw-r--r-- | net/core/dev_mcast.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index 99aece1aeccf..20330c572610 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c | |||
| @@ -116,11 +116,13 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl) | |||
| 116 | */ | 116 | */ |
| 117 | int dev_mc_sync(struct net_device *to, struct net_device *from) | 117 | int dev_mc_sync(struct net_device *to, struct net_device *from) |
| 118 | { | 118 | { |
| 119 | struct dev_addr_list *da; | 119 | struct dev_addr_list *da, *next; |
| 120 | int err = 0; | 120 | int err = 0; |
| 121 | 121 | ||
| 122 | netif_tx_lock_bh(to); | 122 | netif_tx_lock_bh(to); |
| 123 | for (da = from->mc_list; da != NULL; da = da->next) { | 123 | da = from->mc_list; |
| 124 | while (da != NULL) { | ||
| 125 | next = da->next; | ||
| 124 | if (!da->da_synced) { | 126 | if (!da->da_synced) { |
| 125 | err = __dev_addr_add(&to->mc_list, &to->mc_count, | 127 | err = __dev_addr_add(&to->mc_list, &to->mc_count, |
| 126 | da->da_addr, da->da_addrlen, 0); | 128 | da->da_addr, da->da_addrlen, 0); |
| @@ -134,6 +136,7 @@ int dev_mc_sync(struct net_device *to, struct net_device *from) | |||
| 134 | __dev_addr_delete(&from->mc_list, &from->mc_count, | 136 | __dev_addr_delete(&from->mc_list, &from->mc_count, |
| 135 | da->da_addr, da->da_addrlen, 0); | 137 | da->da_addr, da->da_addrlen, 0); |
| 136 | } | 138 | } |
| 139 | da = next; | ||
| 137 | } | 140 | } |
| 138 | if (!err) | 141 | if (!err) |
| 139 | __dev_set_rx_mode(to); | 142 | __dev_set_rx_mode(to); |
| @@ -156,12 +159,14 @@ EXPORT_SYMBOL(dev_mc_sync); | |||
| 156 | */ | 159 | */ |
| 157 | void dev_mc_unsync(struct net_device *to, struct net_device *from) | 160 | void dev_mc_unsync(struct net_device *to, struct net_device *from) |
| 158 | { | 161 | { |
| 159 | struct dev_addr_list *da; | 162 | struct dev_addr_list *da, *next; |
| 160 | 163 | ||
| 161 | netif_tx_lock_bh(from); | 164 | netif_tx_lock_bh(from); |
| 162 | netif_tx_lock_bh(to); | 165 | netif_tx_lock_bh(to); |
| 163 | 166 | ||
| 164 | for (da = from->mc_list; da != NULL; da = da->next) { | 167 | da = from->mc_list; |
| 168 | while (da != NULL) { | ||
| 169 | next = da->next; | ||
| 165 | if (!da->da_synced) | 170 | if (!da->da_synced) |
| 166 | continue; | 171 | continue; |
| 167 | __dev_addr_delete(&to->mc_list, &to->mc_count, | 172 | __dev_addr_delete(&to->mc_list, &to->mc_count, |
| @@ -169,6 +174,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from) | |||
| 169 | da->da_synced = 0; | 174 | da->da_synced = 0; |
| 170 | __dev_addr_delete(&from->mc_list, &from->mc_count, | 175 | __dev_addr_delete(&from->mc_list, &from->mc_count, |
| 171 | da->da_addr, da->da_addrlen, 0); | 176 | da->da_addr, da->da_addrlen, 0); |
| 177 | da = next; | ||
| 172 | } | 178 | } |
| 173 | __dev_set_rx_mode(to); | 179 | __dev_set_rx_mode(to); |
| 174 | 180 | ||
