Skip to content

Commit 03910cd

Browse files
committed
Merge branch 'bond-fix-2-link-state-issues'
Hangbin Liu says: ==================== bond: fix 2 link state issues This patch set fixes two bonding link state issues: 1. Broadcast mode incorrectly sets usable_slaves, causing updelay to be ignored 2. BOND_LINK_FAIL and BOND_LINK_BACK are treated as invalid states, generating confusing error messages Here is the reproducer: ``` ip netns add ns ip -n ns link add bond0 type bond mode 3 miimon 100 updelay 200 downdelay 200 ip -n ns link add type veth ip -n ns link add type veth ip -n ns link set veth1 up ip -n ns link set veth3 up ip -n ns link set veth0 master bond0 ip -n ns link set veth2 master bond0 ip -n ns link set bond0 up sleep 1 ip -n ns link set veth3 down sleep 1 ip -n ns link set veth3 up sleep 1 dmesg | tail ``` ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 224a0d2 + 3348be7 commit 03910cd

1 file changed

Lines changed: 16 additions & 5 deletions

File tree

drivers/net/bonding/bond_main.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2801,8 +2801,14 @@ static void bond_miimon_commit(struct bonding *bond)
28012801

28022802
continue;
28032803

2804+
case BOND_LINK_FAIL:
2805+
case BOND_LINK_BACK:
2806+
slave_dbg(bond->dev, slave->dev, "link_new_state %d on slave\n",
2807+
slave->link_new_state);
2808+
continue;
2809+
28042810
default:
2805-
slave_err(bond->dev, slave->dev, "invalid new link %d on slave\n",
2811+
slave_err(bond->dev, slave->dev, "invalid link_new_state %d on slave\n",
28062812
slave->link_new_state);
28072813
bond_propose_link_state(slave, BOND_LINK_NOCHANGE);
28082814

@@ -5069,13 +5075,18 @@ static void bond_set_slave_arr(struct bonding *bond,
50695075
{
50705076
struct bond_up_slave *usable, *all;
50715077

5072-
usable = rtnl_dereference(bond->usable_slaves);
5073-
rcu_assign_pointer(bond->usable_slaves, usable_slaves);
5074-
kfree_rcu(usable, rcu);
5075-
50765078
all = rtnl_dereference(bond->all_slaves);
50775079
rcu_assign_pointer(bond->all_slaves, all_slaves);
50785080
kfree_rcu(all, rcu);
5081+
5082+
if (BOND_MODE(bond) == BOND_MODE_BROADCAST) {
5083+
kfree_rcu(usable_slaves, rcu);
5084+
return;
5085+
}
5086+
5087+
usable = rtnl_dereference(bond->usable_slaves);
5088+
rcu_assign_pointer(bond->usable_slaves, usable_slaves);
5089+
kfree_rcu(usable, rcu);
50795090
}
50805091

50815092
static void bond_reset_slave_arr(struct bonding *bond)

0 commit comments

Comments
 (0)