diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index ab9a16530c36..cf8a95f48cff 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -4809,9 +4809,14 @@ static void netdev_adjacent_sysfs_del(struct net_device *dev, | |||
| 4809 | sysfs_remove_link(&(dev->dev.kobj), linkname); | 4809 | sysfs_remove_link(&(dev->dev.kobj), linkname); |
| 4810 | } | 4810 | } |
| 4811 | 4811 | ||
| 4812 | #define netdev_adjacent_is_neigh_list(dev, dev_list) \ | 4812 | static inline bool netdev_adjacent_is_neigh_list(struct net_device *dev, |
| 4813 | (dev_list == &dev->adj_list.upper || \ | 4813 | struct net_device *adj_dev, |
| 4814 | dev_list == &dev->adj_list.lower) | 4814 | struct list_head *dev_list) |
| 4815 | { | ||
| 4816 | return (dev_list == &dev->adj_list.upper || | ||
| 4817 | dev_list == &dev->adj_list.lower) && | ||
| 4818 | net_eq(dev_net(dev), dev_net(adj_dev)); | ||
| 4819 | } | ||
| 4815 | 4820 | ||
| 4816 | static int __netdev_adjacent_dev_insert(struct net_device *dev, | 4821 | static int __netdev_adjacent_dev_insert(struct net_device *dev, |
| 4817 | struct net_device *adj_dev, | 4822 | struct net_device *adj_dev, |
| @@ -4841,7 +4846,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, | |||
| 4841 | pr_debug("dev_hold for %s, because of link added from %s to %s\n", | 4846 | pr_debug("dev_hold for %s, because of link added from %s to %s\n", |
| 4842 | adj_dev->name, dev->name, adj_dev->name); | 4847 | adj_dev->name, dev->name, adj_dev->name); |
| 4843 | 4848 | ||
| 4844 | if (netdev_adjacent_is_neigh_list(dev, dev_list)) { | 4849 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) { |
| 4845 | ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); | 4850 | ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); |
| 4846 | if (ret) | 4851 | if (ret) |
| 4847 | goto free_adj; | 4852 | goto free_adj; |
| @@ -4862,7 +4867,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, | |||
| 4862 | return 0; | 4867 | return 0; |
| 4863 | 4868 | ||
| 4864 | remove_symlinks: | 4869 | remove_symlinks: |
| 4865 | if (netdev_adjacent_is_neigh_list(dev, dev_list)) | 4870 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) |
| 4866 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); | 4871 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); |
| 4867 | free_adj: | 4872 | free_adj: |
| 4868 | kfree(adj); | 4873 | kfree(adj); |
| @@ -4895,8 +4900,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev, | |||
| 4895 | if (adj->master) | 4900 | if (adj->master) |
| 4896 | sysfs_remove_link(&(dev->dev.kobj), "master"); | 4901 | sysfs_remove_link(&(dev->dev.kobj), "master"); |
| 4897 | 4902 | ||
| 4898 | if (netdev_adjacent_is_neigh_list(dev, dev_list) && | 4903 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) |
| 4899 | net_eq(dev_net(dev),dev_net(adj_dev))) | ||
| 4900 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); | 4904 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); |
| 4901 | 4905 | ||
| 4902 | list_del_rcu(&adj->list); | 4906 | list_del_rcu(&adj->list); |
