|
@@ -431,6 +431,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
|
|
struct vlan_group *grp;
|
|
|
int i, flgs;
|
|
|
struct net_device *vlandev;
|
|
|
+ struct vlan_dev_info *vlan;
|
|
|
LIST_HEAD(list);
|
|
|
|
|
|
if (is_vlan_dev(dev))
|
|
@@ -507,7 +508,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
|
|
if (!(flgs & IFF_UP))
|
|
|
continue;
|
|
|
|
|
|
- dev_change_flags(vlandev, flgs & ~IFF_UP);
|
|
|
+ vlan = vlan_dev_info(vlandev);
|
|
|
+ if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
|
|
|
+ dev_change_flags(vlandev, flgs & ~IFF_UP);
|
|
|
vlan_transfer_operstate(dev, vlandev);
|
|
|
}
|
|
|
break;
|
|
@@ -523,7 +526,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
|
|
if (flgs & IFF_UP)
|
|
|
continue;
|
|
|
|
|
|
- dev_change_flags(vlandev, flgs | IFF_UP);
|
|
|
+ vlan = vlan_dev_info(vlandev);
|
|
|
+ if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
|
|
|
+ dev_change_flags(vlandev, flgs | IFF_UP);
|
|
|
vlan_transfer_operstate(dev, vlandev);
|
|
|
}
|
|
|
break;
|