Skip to content

Commit

Permalink
[VLAN]: Clean up unregister_vlan_dev
Browse files Browse the repository at this point in the history
Save two levels of indentation by aborting on error conditions,
remove unnecessary initialization to NULL and remove two obvious
comments.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Jan 28, 2008
1 parent 69ab4b7 commit acc5efb
Showing 1 changed file with 32 additions and 40 deletions.
72 changes: 32 additions & 40 deletions 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 acc5efb

Please sign in to comment.