|
Zbigniew Jędrzejewski-Szmek |
d743bb |
From e6715ab647230fae7b489a5cc3edcb2d59c98e2f Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
From: Roelf Wichertjes <roelf@roelf.org>
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
Date: Sun, 30 Apr 2017 13:12:32 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
Subject: [PATCH] networkd: Add check to ensure link is down before attempting
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
to enslave (#5853)
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
netdev to bond.
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
There are situations where a link can be in an "UP" state when
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
systemd-networkd attempts to add the link to a bond device.
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
This is a problem because the bonding driver will refuse to
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
enslave a link if it is in the "UP" state.
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
This check ensures systemd-networkd sets the link to "DOWN"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
before attempting to add the link to the bond.
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
Fixes #5838.
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
(cherry picked from commit 14b6bb776287e72887071dafae3d4c2c65ee926d)
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
---
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
src/network/netdev/netdev.c | 8 ++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
src/network/networkd-link.c | 4 ++--
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
src/network/networkd-link.h | 3 +++
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
3 files changed, 13 insertions(+), 2 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
index 9b9e83d9db..f70117e6f9 100644
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
--- a/src/network/netdev/netdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+++ b/src/network/netdev/netdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
@@ -28,6 +28,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "network-internal.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "netdev/netdev.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "networkd-manager.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+#include "networkd-link.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "siphash24.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "stat-util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
#include "string-table.h"
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
@@ -218,6 +219,13 @@ static int netdev_enslave_ready(NetDev *netdev, Link* link, sd_netlink_message_h
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
assert(link);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
assert(callback);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ if (link->flags & IFF_UP) {
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ log_netdev_debug(netdev, "Link '%s' was up when attempting to enslave it. Bringing link down.", link->ifname);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ r = link_down(link);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ return log_netdev_error_errno(netdev, r, "Could not bring link down: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
r = sd_rtnl_message_new_link(netdev->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
return log_netdev_error_errno(netdev, r, "Could not allocate RTM_SETLINK message: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
index 0c1229336b..c37bc7f602 100644
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
--- a/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+++ b/src/network/networkd-link.c
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
@@ -1598,7 +1598,7 @@ static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userda
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
-static int link_up(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+int link_up(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
uint8_t ipv6ll_mode;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
@@ -1719,7 +1719,7 @@ static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, void *user
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
return 1;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
}
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
-static int link_down(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+int link_down(Link *link) {
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
index e6190fbe57..be5c4f3284 100644
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
--- a/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+++ b/src/network/networkd-link.h
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
@@ -138,6 +138,9 @@ int link_get(Manager *m, int ifindex, Link **ret);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
void link_drop(Link *link);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+int link_up(Link *link);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+int link_down(Link *link);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
+
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
int link_address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
int link_route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata);
|
|
Zbigniew Jędrzejewski-Szmek |
d743bb |
|