diff options
| author | Petr Machata <petrm@mellanox.com> | 2018-12-13 06:54:44 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-12-13 21:41:39 -0500 |
| commit | b9245914282c3ddf86e60ff5dbb3136c2298f842 (patch) | |
| tree | 7326651339c3a661db4f7064d83c093d9c586808 /drivers/net/bonding | |
| parent | 61345fab484b97cca47149c90396c74ac76072f5 (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.c | 23 |
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 | */ |
| 612 | static void bond_set_dev_addr(struct net_device *bond_dev, | 612 | static 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 | ||
| 622 | static struct slave *bond_get_old_active(struct bonding *bond, | 623 | 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 | 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: |
