8021q: fix a memory leak for VLAN 0 device
[sfrench/cifs-2.6.git] / net / 8021q / vlan.c
index 4a72ee4e2ae96b41faadb2959c968e0a757f3a0b..bad01b14a4ad6b5d4e61ac5e0ed93022755223ab 100644 (file)
@@ -111,12 +111,7 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
                vlan_gvrp_uninit_applicant(real_dev);
        }
 
-       /* Take it out of our own structures, but be sure to interlock with
-        * HW accelerating devices or SW vlan input packet processing if
-        * VLAN is not 0 (leave it there for 802.1p).
-        */
-       if (vlan_id)
-               vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
+       vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
 
        /* Get rid of the vlan's reference to real_dev */
        dev_put(real_dev);
@@ -138,7 +133,7 @@ int vlan_check_real_dev(struct net_device *real_dev,
        return 0;
 }
 
-int register_vlan_dev(struct net_device *dev)
+int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack)
 {
        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
        struct net_device *real_dev = vlan->real_dev;
@@ -174,7 +169,7 @@ int register_vlan_dev(struct net_device *dev)
        if (err < 0)
                goto out_uninit_mvrp;
 
-       err = netdev_upper_dev_link(real_dev, dev);
+       err = netdev_upper_dev_link(real_dev, dev, extack);
        if (err)
                goto out_unregister_netdev;
 
@@ -270,7 +265,7 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
        vlan->flags = VLAN_FLAG_REORDER_HDR;
 
        new_dev->rtnl_link_ops = &vlan_link_ops;
-       err = register_vlan_dev(new_dev);
+       err = register_vlan_dev(new_dev, NULL);
        if (err < 0)
                goto out_free_newdev;
 
@@ -328,6 +323,9 @@ static void vlan_transfer_features(struct net_device *dev,
        vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid;
 #endif
 
+       vlandev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
+       vlandev->priv_flags |= (vlan->real_dev->priv_flags & IFF_XMIT_DST_RELEASE);
+
        netdev_update_features(vlandev);
 }