Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 171089
b: refs/heads/master
c: 29906f6
h: refs/heads/master
i:
  171087: fd0a191
v: v3
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Oct 30, 2009
1 parent 80226f0 commit 622bd84
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f0816ce39d8de7646301aac52cc7351a2424d97f
refs/heads/master: 29906f6a427d2004a515ebbcdc7b28bae8f6c19c
52 changes: 20 additions & 32 deletions trunk/net/8021q/vlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)

grp->nr_vlans--;

if (!grp->killall) {
vlan_group_set_device(grp, vlan_id, NULL);
vlan_group_set_device(grp, vlan_id, NULL);
if (!grp->killall)
synchronize_net();
}

unregister_netdevice_queue(dev, head);

/* If the group is now empty, kill off the group. */
Expand All @@ -184,34 +184,6 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
dev_put(real_dev);
}

void unregister_vlan_dev_alls(struct vlan_group *grp)
{
LIST_HEAD(list);
int i;
struct net_device *vlandev;
struct vlan_group save;

memcpy(&save, grp, sizeof(save));
memset(&grp->vlan_devices_arrays, 0, sizeof(grp->vlan_devices_arrays));
grp->killall = 1;

synchronize_net();

/* Delete all VLANs for this dev. */
for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
vlandev = vlan_group_get_device(&save, i);
if (!vlandev)
continue;

unregister_vlan_dev(vlandev, &list);
if (grp->nr_vlans == 0)
break;
}
unregister_netdevice_many(&list);
for (i = 0; i < VLAN_GROUP_ARRAY_SPLIT_PARTS; i++)
kfree(save.vlan_devices_arrays[i]);
}

static void vlan_transfer_operstate(const struct net_device *dev,
struct net_device *vlandev)
{
Expand Down Expand Up @@ -456,6 +428,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
struct vlan_group *grp;
int i, flgs;
struct net_device *vlandev;
LIST_HEAD(list);

if (is_vlan_dev(dev))
__vlan_device_event(dev, event);
Expand Down Expand Up @@ -553,7 +526,22 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
break;

case NETDEV_UNREGISTER:
unregister_vlan_dev_alls(grp);
/* Delete all VLANs for this dev. */
grp->killall = 1;

for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
vlandev = vlan_group_get_device(grp, i);
if (!vlandev)
continue;

/* unregistration of last vlan destroys group, abort
* afterwards */
if (grp->nr_vlans == 1)
i = VLAN_GROUP_ARRAY_LEN;

unregister_vlan_dev(vlandev, &list);
}
unregister_netdevice_many(&list);
break;
}

Expand Down

0 comments on commit 622bd84

Please sign in to comment.