diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index 13c4cedd1..523399570 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -520,7 +520,7 @@ static bool link_is_ready_to_call_set_link(Request *req) { return false; break; case SET_LINK_CAN: - /* Do not check link->set_flgas_messages here, as it is ok even if link->flags + /* Do not check link->set_flags_messages here, as it is ok even if link->flags * is outdated, and checking the counter causes a deadlock. */ if (FLAGS_SET(link->flags, IFF_UP)) { /* The CAN interface must be down to configure bitrate, etc... */ @@ -577,6 +577,15 @@ static bool link_is_ready_to_call_set_link(Request *req) { m = link->network->vrf->ifindex; } + /* Do not check link->set_flags_messages here, as it is ok even if link->flags is outdated, + * and checking the counter causes a deadlock. */ + if (link->network->bond && FLAGS_SET(link->flags, IFF_UP)) { + /* link must be down when joining to bond master. */ + r = link_down_now(link); + if (r < 0) + return r; + } + req->userdata = UINT32_TO_PTR(m); break; } diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index aab7b5721..eeb350647 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -3369,6 +3369,12 @@ class NetworkdBondTests(unittest.TestCase, Utilities): print(output) self.assertRegex(output, 'active_slave dummy98') + # test case for issue #31165. + since = datetime.datetime.now() + networkctl_reconfigure('dummy98') + self.wait_online(['dummy98:enslaved', 'bond199:degraded']) + self.assertNotIn('dummy98: Bringing link down', read_networkd_log(since=since)) + def test_bond_primary_slave(self): copy_unit_to_networkd_unit_path('23-primary-slave.network', '23-bond199.network', '25-bond-active-backup-slave.netdev', '12-dummy.netdev') start_networkd()