aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index d4362befe7e2..2cedf520cb28 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6396,6 +6396,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
6396 .linking = true, 6396 .linking = true,
6397 .upper_info = upper_info, 6397 .upper_info = upper_info,
6398 }; 6398 };
6399 struct net_device *master_dev;
6399 int ret = 0; 6400 int ret = 0;
6400 6401
6401 ASSERT_RTNL(); 6402 ASSERT_RTNL();
@@ -6407,11 +6408,14 @@ static int __netdev_upper_dev_link(struct net_device *dev,
6407 if (netdev_has_upper_dev(upper_dev, dev)) 6408 if (netdev_has_upper_dev(upper_dev, dev))
6408 return -EBUSY; 6409 return -EBUSY;
6409 6410
6410 if (netdev_has_upper_dev(dev, upper_dev)) 6411 if (!master) {
6411 return -EEXIST; 6412 if (netdev_has_upper_dev(dev, upper_dev))
6412 6413 return -EEXIST;
6413 if (master && netdev_master_upper_dev_get(dev)) 6414 } else {
6414 return -EBUSY; 6415 master_dev = netdev_master_upper_dev_get(dev);
6416 if (master_dev)
6417 return master_dev == upper_dev ? -EEXIST : -EBUSY;
6418 }
6415 6419
6416 ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, 6420 ret = call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
6417 &changeupper_info.info); 6421 &changeupper_info.info);