From a140eaf16a65558d5ce448bfc4f4ecc99710b29b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2024 14:12:09 +0900 Subject: [PATCH 1/3] network: fix typo Follow-up for baa95d2274179e680c4731a74f514e2651722ad2. --- src/network/networkd-setlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index 38f90969ec..d0cdca6298 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -486,7 +486,7 @@ static int link_is_ready_to_set_link(Link *link, Request *req) { return link->bridge_vlan_set; case REQUEST_TYPE_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... */ @@ -533,7 +533,7 @@ static int link_is_ready_to_set_link(Link *link, Request *req) { return false; m = link->network->bond->ifindex; - /* 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)) { /* link must be down when joining to bond master. */ From c3e12de0a634f15154b8b0826b00c9f0816ef1fb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Feb 2024 11:10:45 +0900 Subject: [PATCH 2/3] network: do not bring down a bonding port interface when it is already joined Follow-up for 9f913d37a01f71e559d099bff280827f8817d8c5. Fixes #31165. --- src/network/networkd-setlink.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index d0cdca6298..4c4e0d1cd9 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -532,15 +532,6 @@ static int link_is_ready_to_set_link(Link *link, Request *req) { if (!netdev_is_ready(link->network->bond)) return false; m = link->network->bond->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 (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; - } } else if (link->network->bridge) { if (ordered_set_contains(link->manager->request_queue, &req_mac)) return false; @@ -559,6 +550,15 @@ static int link_is_ready_to_set_link(Link *link, Request *req) { return -EALREADY; /* indicate to cancel the request. */ } + /* 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; } From 2bb1d3c1083f8562b00e297dae4268a38de3d99c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Feb 2024 11:20:25 +0900 Subject: [PATCH 3/3] test-network: add test case for issue #31165 --- src/network/networkd-setlink.c | 2 ++ test/test-network/systemd-networkd-tests.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index 4c4e0d1cd9..eb65429a78 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -1046,6 +1046,8 @@ static int link_up_or_down(Link *link, bool up, Request *req) { assert(link->manager->rtnl); assert(req); + /* The log message is checked in the test. Please also update test_bond_active_slave() in + * test/test-network/systemd-networkd-tests.py. when the log message below is modified. */ log_link_debug(link, "Bringing link %s", up_or_down(up)); r = sd_rtnl_message_new_link(link->manager->rtnl, &m, RTM_SETLINK, link->ifindex); diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 1700732e34..11c3839bdb 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -4597,6 +4597,12 @@ class NetworkdBondTests(unittest.TestCase, Utilities): print(output) self.assertIn('active_slave dummy98', output) + # 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_network_unit('23-primary-slave.network', '23-bond199.network', '25-bond-active-backup-slave.netdev', '12-dummy.netdev') start_networkd()