Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 79308
b: refs/heads/master
c: acc5efb
h: refs/heads/master
v: v3
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Jan 28, 2008
1 parent e96a98c commit d1a457d
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 41 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: 69ab4b7d6db68396dbfa827daa8d6f30f9b546a8
refs/heads/master: acc5efbcd2a023c8801f2bba39971cf93812ce7c
72 changes: 32 additions & 40 deletions trunk/net/8021q/vlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,63 +142,55 @@ static void vlan_rcu_free(struct rcu_head *rcu)
static int unregister_vlan_dev(struct net_device *real_dev,
unsigned short vlan_id)
{
struct net_device *dev = NULL;
struct net_device *dev;
int real_dev_ifindex = real_dev->ifindex;
struct vlan_group *grp;
int i, ret;
unsigned int i;
int ret;

/* sanity check */
if (vlan_id >= VLAN_VID_MASK)
return -EINVAL;

ASSERT_RTNL();
grp = __vlan_find_group(real_dev_ifindex);
if (!grp)
return -ENOENT;

ret = 0;

if (grp) {
dev = vlan_group_get_device(grp, vlan_id);
if (dev) {
/* Remove proc entry */
vlan_proc_rem_dev(dev);

/* Take it out of our own structures, but be sure to
* interlock with HW accelerating devices or SW vlan
* input packet processing.
*/
if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
real_dev->vlan_rx_kill_vid(real_dev, vlan_id);
dev = vlan_group_get_device(grp, vlan_id);
if (!dev)
return -ENOENT;

vlan_group_set_device(grp, vlan_id, NULL);
synchronize_net();
vlan_proc_rem_dev(dev);

/* Take it out of our own structures, but be sure to interlock with
* HW accelerating devices or SW vlan input packet processing.
*/
if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
real_dev->vlan_rx_kill_vid(real_dev, vlan_id);

/* Caller unregisters (and if necessary, puts)
* VLAN device, but we get rid of the reference to
* real_dev here.
*/
dev_put(real_dev);
vlan_group_set_device(grp, vlan_id, NULL);
synchronize_net();

/* If the group is now empty, kill off the
* group.
*/
for (i = 0; i < VLAN_VID_MASK; i++)
if (vlan_group_get_device(grp, i))
break;
/* Caller unregisters (and if necessary, puts) VLAN device, but we
* get rid of the reference to real_dev here.
*/
dev_put(real_dev);

if (i == VLAN_VID_MASK) {
if (real_dev->features & NETIF_F_HW_VLAN_RX)
real_dev->vlan_rx_register(real_dev, NULL);
/* If the group is now empty, kill off the group. */
ret = 0;
for (i = 0; i < VLAN_VID_MASK; i++)
if (vlan_group_get_device(grp, i))
break;

hlist_del_rcu(&grp->hlist);
if (i == VLAN_VID_MASK) {
if (real_dev->features & NETIF_F_HW_VLAN_RX)
real_dev->vlan_rx_register(real_dev, NULL);

/* Free the group, after all cpu's are done. */
call_rcu(&grp->rcu, vlan_rcu_free);
hlist_del_rcu(&grp->hlist);

grp = NULL;
ret = 1;
}
}
/* Free the group, after all cpu's are done. */
call_rcu(&grp->rcu, vlan_rcu_free);
ret = 1;
}

return ret;
Expand Down

0 comments on commit d1a457d

Please sign in to comment.