aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bonding
diff options
context:
space:
mode:
authorPetr Machata <petrm@mellanox.com>2018-12-13 06:54:44 -0500
committerDavid S. Miller <davem@davemloft.net>2018-12-13 21:41:39 -0500
commitb9245914282c3ddf86e60ff5dbb3136c2298f842 (patch)
tree7326651339c3a661db4f7064d83c093d9c586808 /drivers/net/bonding
parent61345fab484b97cca47149c90396c74ac76072f5 (diff)
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: Petr Machata <petrm@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bonding')
-rw-r--r--drivers/net/bonding/bond_main.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 06039be63034..66d9a6c7b9c5 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -609,14 +609,15 @@ static void bond_hw_addr_swap(struct bonding *bond, struct slave *new_active,
609 * 609 *
610 * Should be called with RTNL held. 610 * Should be called with RTNL held.
611 */ 611 */
612static void bond_set_dev_addr(struct net_device *bond_dev, 612static int bond_set_dev_addr(struct net_device *bond_dev,
613 struct net_device *slave_dev) 613 struct net_device *slave_dev)
614{ 614{
615 netdev_dbg(bond_dev, "bond_dev=%p slave_dev=%p slave_dev->name=%s slave_dev->addr_len=%d\n", 615 netdev_dbg(bond_dev, "bond_dev=%p slave_dev=%p slave_dev->name=%s slave_dev->addr_len=%d\n",
616 bond_dev, slave_dev, slave_dev->name, slave_dev->addr_len); 616 bond_dev, slave_dev, slave_dev->name, slave_dev->addr_len);
617 memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len); 617 memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len);
618 bond_dev->addr_assign_type = NET_ADDR_STOLEN; 618 bond_dev->addr_assign_type = NET_ADDR_STOLEN;
619 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev); 619 call_netdevice_notifiers(NETDEV_CHANGEADDR, bond_dev);
620 return 0;
620} 621}
621 622
622static struct slave *bond_get_old_active(struct bonding *bond, 623static struct slave *bond_get_old_active(struct bonding *bond,
@@ -652,8 +653,12 @@ static void bond_do_fail_over_mac(struct bonding *bond,
652 653
653 switch (bond->params.fail_over_mac) { 654 switch (bond->params.fail_over_mac) {
654 case BOND_FOM_ACTIVE: 655 case BOND_FOM_ACTIVE:
655 if (new_active) 656 if (new_active) {
656 bond_set_dev_addr(bond->dev, new_active->dev); 657 rv = bond_set_dev_addr(bond->dev, new_active->dev);
658 if (rv)
659 netdev_err(bond->dev, "Error %d setting MAC of slave %s\n",
660 -rv, bond->dev->name);
661 }
657 break; 662 break;
658 case BOND_FOM_FOLLOW: 663 case BOND_FOM_FOLLOW:
659 /* if new_active && old_active, swap them 664 /* 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 * address to be the same as the slave's. 1494 * address to be the same as the slave's.
1490 */ 1495 */
1491 if (!bond_has_slaves(bond) && 1496 if (!bond_has_slaves(bond) &&
1492 bond->dev->addr_assign_type == NET_ADDR_RANDOM) 1497 bond->dev->addr_assign_type == NET_ADDR_RANDOM) {
1493 bond_set_dev_addr(bond->dev, slave_dev); 1498 res = bond_set_dev_addr(bond->dev, slave_dev);
1499 if (res)
1500 goto err_undo_flags;
1501 }
1494 1502
1495 new_slave = bond_alloc_slave(bond); 1503 new_slave = bond_alloc_slave(bond);
1496 if (!new_slave) { 1504 if (!new_slave) {
@@ -3545,8 +3553,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
3545 break; 3553 break;
3546 case BOND_SETHWADDR_OLD: 3554 case BOND_SETHWADDR_OLD:
3547 case SIOCBONDSETHWADDR: 3555 case SIOCBONDSETHWADDR:
3548 bond_set_dev_addr(bond_dev, slave_dev); 3556 res = bond_set_dev_addr(bond_dev, slave_dev);
3549 res = 0;
3550 break; 3557 break;
3551 case BOND_CHANGE_ACTIVE_OLD: 3558 case BOND_CHANGE_ACTIVE_OLD:
3552 case SIOCBONDCHANGEACTIVE: 3559 case SIOCBONDCHANGEACTIVE: