Skip to content

Commit

Permalink
net: expose the master link to sysfs, and remove it from bond
Browse files Browse the repository at this point in the history
Currently, we can have only one master upper neighbour, so it would be
useful to create a symlink to it in the sysfs device directory, the way
that bonding now does it, for every device. Lower devices from
bridge/team/etc will automagically get it, so we could rely on it.

Also, remove the same functionality from bonding.

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: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Veaceslav Falico authored and David S. Miller committed Sep 26, 2013
1 parent 47701a3 commit 842d67a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 19 deletions.
20 changes: 3 additions & 17 deletions drivers/net/bonding/bond_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,32 +172,18 @@ int bond_create_slave_symlinks(struct net_device *master,
struct net_device *slave)
{
char linkname[IFNAMSIZ+7];
int ret = 0;

/* first, create a link from the slave back to the master */
ret = sysfs_create_link(&(slave->dev.kobj), &(master->dev.kobj),
"master");
if (ret)
return ret;
/* next, create a link from the master to the slave */
/* create a link from the master to the slave */
sprintf(linkname, "slave_%s", slave->name);
ret = sysfs_create_link(&(master->dev.kobj), &(slave->dev.kobj),
linkname);

/* free the master link created earlier in case of error */
if (ret)
sysfs_remove_link(&(slave->dev.kobj), "master");

return ret;

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];

sysfs_remove_link(&(slave->dev.kobj), "master");
sprintf(linkname, "slave_%s", slave->name);
sysfs_remove_link(&(master->dev.kobj), linkname);
}
Expand Down
19 changes: 17 additions & 2 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -4584,6 +4584,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
void *private, bool master)
{
struct netdev_adjacent *adj;
int ret;

adj = __netdev_find_adj(dev, adj_dev, dev_list);

Expand All @@ -4606,12 +4607,23 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
adj_dev->name, dev->name, adj_dev->name);

/* Ensure that master link is always the first item in list. */
if (master)
if (master) {
ret = sysfs_create_link(&(dev->dev.kobj),
&(adj_dev->dev.kobj), "master");
if (ret)
goto free_adj;

list_add_rcu(&adj->list, dev_list);
else
} else {
list_add_tail_rcu(&adj->list, dev_list);
}

return 0;

free_adj:
kfree(adj);

return ret;
}

void __netdev_adjacent_dev_remove(struct net_device *dev,
Expand All @@ -4635,6 +4647,9 @@ void __netdev_adjacent_dev_remove(struct net_device *dev,
return;
}

if (adj->master)
sysfs_remove_link(&(dev->dev.kobj), "master");

list_del_rcu(&adj->list);
pr_debug("dev_put for %s, because link removed from %s to %s\n",
adj_dev->name, dev->name, adj_dev->name);
Expand Down

0 comments on commit 842d67a

Please sign in to comment.