Commit b9245914 authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

net: bonding: Give bond_set_dev_addr() a return value

Before NETDEV_CHANGEADDR, bond driver should emit NETDEV_PRE_CHANGEADDR,
and allow consumers to veto the address change. To propagate further the
return code from NETDEV_PRE_CHANGEADDR, give the function that
implements address change a return value.
Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 61345fab
...@@ -609,14 +609,15 @@ static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active, ...@@ -609,14 +609,15 @@ static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active,
* *
* Should be called with RTNL held. * Should be called with RTNL held.
*/ */
static void bond_set_dev_addr(struct net_device *bond_dev, static int bond_set_dev_addr(struct net_device *bond_dev,
struct net_device *slave_dev) struct net_device *slave_dev)
{ {
netdev_dbg(bond_dev, "bond_dev=%p slave_dev=%p slave_dev->name=%s slave_dev->addr_len=%d\n", netdev_dbg(bond_dev, "bond_dev=%p slave_dev=%p slave_dev->name=%s slave_dev->addr_len=%d\n",
bond_dev, slave_dev, slave_dev->name, slave_dev->addr_len); bond_dev, slave_dev, slave_dev->name, slave_dev->addr_len);
memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len); memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len);
bond_dev->addr_assign_type = NET_ADDR_STOLEN; bond_dev->addr_assign_type = NET_ADDR_STOLEN;
call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev);
return 0;
} }
static struct slave *bond_get_old_active(struct bonding *bond, static struct slave *bond_get_old_active(struct bonding *bond,
...@@ -652,8 +653,12 @@ static void bond_do_fail_over_mac(struct bonding *bond, ...@@ -652,8 +653,12 @@ static void bond_do_fail_over_mac(struct bonding *bond,
switch (bond->params.fail_over_mac) { switch (bond->params.fail_over_mac) {
case BOND_FOM_ACTIVE: case BOND_FOM_ACTIVE:
if (new_active) if (new_active) {
bond_set_dev_addr(bond->dev, new_active->dev); rv = bond_set_dev_addr(bond->dev, new_active->dev);
if (rv)
netdev_err(bond->dev, "Error %d setting MAC of slave %s\n",
-rv, bond->dev->name);
}
break; break;
case BOND_FOM_FOLLOW: case BOND_FOM_FOLLOW:
/* if new_active && old_active, swap them /* if new_active && old_active, swap them
...@@ -1489,8 +1494,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, ...@@ -1489,8 +1494,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
* address to be the same as the slave's. * address to be the same as the slave's.
*/ */
if (!bond_has_slaves(bond) && if (!bond_has_slaves(bond) &&
bond->dev->addr_assign_type == NET_ADDR_RANDOM) bond->dev->addr_assign_type == NET_ADDR_RANDOM) {
bond_set_dev_addr(bond->dev, slave_dev); res = bond_set_dev_addr(bond->dev, slave_dev);
if (res)
goto err_undo_flags;
}
new_slave = bond_alloc_slave(bond); new_slave = bond_alloc_slave(bond);
if (!new_slave) { if (!new_slave) {
...@@ -3545,8 +3553,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd ...@@ -3545,8 +3553,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
break; break;
case BOND_SETHWADDR_OLD: case BOND_SETHWADDR_OLD:
case SIOCBONDSETHWADDR: case SIOCBONDSETHWADDR:
bond_set_dev_addr(bond_dev, slave_dev); res = bond_set_dev_addr(bond_dev, slave_dev);
res = 0;
break; break;
case BOND_CHANGE_ACTIVE_OLD: case BOND_CHANGE_ACTIVE_OLD:
case SIOCBONDCHANGEACTIVE: case SIOCBONDCHANGEACTIVE:
......
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