Commit 5831d66e authored by Veaceslav Falico's avatar Veaceslav Falico Committed by David S. Miller

net: create sysfs symlinks for neighbour devices

Also, remove the same functionality from bonding - it will be already done
for any device that links to its lower/upper neighbour.

The links will be created for dev's kobject, and will look like
lower_eth0 for lower device eth0 and upper_bridge0 for upper device
bridge0.

CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: "David S. Miller" <davem@davemloft.net>
CC: Eric Dumazet <edumazet@google.com>
CC: Jiri Pirko <jiri@resnulli.us>
CC: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarVeaceslav Falico <vfalico@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 842d67a7
...@@ -1612,15 +1612,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) ...@@ -1612,15 +1612,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
read_unlock(&bond->lock); read_unlock(&bond->lock);
res = bond_create_slave_symlinks(bond_dev, slave_dev);
if (res)
goto err_detach;
res = netdev_rx_handler_register(slave_dev, bond_handle_frame, res = netdev_rx_handler_register(slave_dev, bond_handle_frame,
new_slave); new_slave);
if (res) { if (res) {
pr_debug("Error %d calling netdev_rx_handler_register\n", res); pr_debug("Error %d calling netdev_rx_handler_register\n", res);
goto err_dest_symlinks; goto err_detach;
} }
res = bond_master_upper_dev_link(bond_dev, slave_dev, new_slave); res = bond_master_upper_dev_link(bond_dev, slave_dev, new_slave);
...@@ -1642,9 +1638,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) ...@@ -1642,9 +1638,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
err_unregister: err_unregister:
netdev_rx_handler_unregister(slave_dev); netdev_rx_handler_unregister(slave_dev);
err_dest_symlinks:
bond_destroy_slave_symlinks(bond_dev, slave_dev);
err_detach: err_detach:
if (!USES_PRIMARY(bond->params.mode)) if (!USES_PRIMARY(bond->params.mode))
bond_hw_addr_flush(bond_dev, slave_dev); bond_hw_addr_flush(bond_dev, slave_dev);
...@@ -1842,8 +1835,6 @@ static int __bond_release_one(struct net_device *bond_dev, ...@@ -1842,8 +1835,6 @@ static int __bond_release_one(struct net_device *bond_dev,
bond_dev->name, slave_dev->name, bond_dev->name); bond_dev->name, slave_dev->name, bond_dev->name);
/* must do this from outside any spinlocks */ /* must do this from outside any spinlocks */
bond_destroy_slave_symlinks(bond_dev, slave_dev);
vlan_vids_del_by_dev(slave_dev, bond_dev); vlan_vids_del_by_dev(slave_dev, bond_dev);
/* If the mode USES_PRIMARY, then this cases was handled above by /* If the mode USES_PRIMARY, then this cases was handled above by
......
...@@ -168,27 +168,6 @@ static const struct class_attribute class_attr_bonding_masters = { ...@@ -168,27 +168,6 @@ static const struct class_attribute class_attr_bonding_masters = {
.namespace = bonding_namespace, .namespace = bonding_namespace,
}; };
int bond_create_slave_symlinks(struct net_device *master,
struct net_device *slave)
{
char linkname[IFNAMSIZ+7];
/* create a link from the master to the slave */
sprintf(linkname, "slave_%s", slave->name);
return sysfs_create_link(&(master->dev.kobj), &(slave->dev.kobj),
linkname);
}
void bond_destroy_slave_symlinks(struct net_device *master,
struct net_device *slave)
{
char linkname[IFNAMSIZ+7];
sprintf(linkname, "slave_%s", slave->name);
sysfs_remove_link(&(master->dev.kobj), linkname);
}
/* /*
* Show the slaves in the current bond. * Show the slaves in the current bond.
*/ */
......
...@@ -436,8 +436,6 @@ int bond_create(struct net *net, const char *name); ...@@ -436,8 +436,6 @@ int bond_create(struct net *net, const char *name);
int bond_create_sysfs(struct bond_net *net); int bond_create_sysfs(struct bond_net *net);
void bond_destroy_sysfs(struct bond_net *net); void bond_destroy_sysfs(struct bond_net *net);
void bond_prepare_sysfs_group(struct bonding *bond); void bond_prepare_sysfs_group(struct bonding *bond);
int bond_create_slave_symlinks(struct net_device *master, struct net_device *slave);
void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave);
int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
void bond_mii_monitor(struct work_struct *); void bond_mii_monitor(struct work_struct *);
......
...@@ -4584,6 +4584,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, ...@@ -4584,6 +4584,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
void *private, bool master) void *private, bool master)
{ {
struct netdev_adjacent *adj; struct netdev_adjacent *adj;
char linkname[IFNAMSIZ+7];
int ret; int ret;
adj = __netdev_find_adj(dev, adj_dev, dev_list); adj = __netdev_find_adj(dev, adj_dev, dev_list);
...@@ -4606,12 +4607,26 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, ...@@ -4606,12 +4607,26 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
pr_debug("dev_hold for %s, because of link added from %s to %s\n", pr_debug("dev_hold for %s, because of link added from %s to %s\n",
adj_dev->name, dev->name, adj_dev->name); adj_dev->name, dev->name, adj_dev->name);
if (dev_list == &dev->adj_list.lower) {
sprintf(linkname, "lower_%s", adj_dev->name);
ret = sysfs_create_link(&(dev->dev.kobj),
&(adj_dev->dev.kobj), linkname);
if (ret)
goto free_adj;
} else if (dev_list == &dev->adj_list.upper) {
sprintf(linkname, "upper_%s", adj_dev->name);
ret = sysfs_create_link(&(dev->dev.kobj),
&(adj_dev->dev.kobj), linkname);
if (ret)
goto free_adj;
}
/* Ensure that master link is always the first item in list. */ /* Ensure that master link is always the first item in list. */
if (master) { if (master) {
ret = sysfs_create_link(&(dev->dev.kobj), ret = sysfs_create_link(&(dev->dev.kobj),
&(adj_dev->dev.kobj), "master"); &(adj_dev->dev.kobj), "master");
if (ret) if (ret)
goto free_adj; goto remove_symlinks;
list_add_rcu(&adj->list, dev_list); list_add_rcu(&adj->list, dev_list);
} else { } else {
...@@ -4620,6 +4635,15 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, ...@@ -4620,6 +4635,15 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
return 0; return 0;
remove_symlinks:
if (dev_list == &dev->adj_list.lower) {
sprintf(linkname, "lower_%s", adj_dev->name);
sysfs_remove_link(&(dev->dev.kobj), linkname);
} else if (dev_list == &dev->adj_list.upper) {
sprintf(linkname, "upper_%s", adj_dev->name);
sysfs_remove_link(&(dev->dev.kobj), linkname);
}
free_adj: free_adj:
kfree(adj); kfree(adj);
...@@ -4631,6 +4655,7 @@ void __netdev_adjacent_dev_remove(struct net_device *dev, ...@@ -4631,6 +4655,7 @@ void __netdev_adjacent_dev_remove(struct net_device *dev,
struct list_head *dev_list) struct list_head *dev_list)
{ {
struct netdev_adjacent *adj; struct netdev_adjacent *adj;
char linkname[IFNAMSIZ+7];
adj = __netdev_find_adj(dev, adj_dev, dev_list); adj = __netdev_find_adj(dev, adj_dev, dev_list);
...@@ -4650,6 +4675,14 @@ void __netdev_adjacent_dev_remove(struct net_device *dev, ...@@ -4650,6 +4675,14 @@ void __netdev_adjacent_dev_remove(struct net_device *dev,
if (adj->master) if (adj->master)
sysfs_remove_link(&(dev->dev.kobj), "master"); sysfs_remove_link(&(dev->dev.kobj), "master");
if (dev_list == &dev->adj_list.lower) {
sprintf(linkname, "lower_%s", adj_dev->name);
sysfs_remove_link(&(dev->dev.kobj), linkname);
} else if (dev_list == &dev->adj_list.upper) {
sprintf(linkname, "upper_%s", adj_dev->name);
sysfs_remove_link(&(dev->dev.kobj), linkname);
}
list_del_rcu(&adj->list); list_del_rcu(&adj->list);
pr_debug("dev_put for %s, because link removed from %s to %s\n", pr_debug("dev_put for %s, because link removed from %s to %s\n",
adj_dev->name, dev->name, adj_dev->name); adj_dev->name, dev->name, adj_dev->name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment