vlan: Fix vlan-in-vlan crashes.
As analyzed by Patrick McHardy, vlan needs to reset it's netdev_ops pointer in it's ->init() function but this leaves the compat method pointers stale. Add a netdev_resync_ops() and call it from the vlan code. Any other driver which changes ->netdev_ops after register_netdevice() will need to call this new function after doing so too. With help from Patrick McHardy. Tested-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -553,7 +553,7 @@ static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)
|
||||
int err = 0;
|
||||
|
||||
if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
|
||||
err = ops->ndo_neigh_setup(dev, pa);
|
||||
err = ops->ndo_neigh_setup(real_dev, pa);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -639,6 +639,7 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
|
||||
dev->netdev_ops = &vlan_netdev_ops;
|
||||
}
|
||||
netdev_resync_ops(dev);
|
||||
|
||||
if (is_vlan_dev(real_dev))
|
||||
subclass = 1;
|
||||
|
Reference in New Issue
Block a user