From: Yu Watanabe Date: Thu, 26 Apr 2018 19:05:32 +0000 (+0900) Subject: network: recreate link if its interface name is changed (#8795) X-Git-Tag: v239~349 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=587c45866555b10d1fde7458ee83708a0cb08a07;p=thirdparty%2Fsystemd.git network: recreate link if its interface name is changed (#8795) If an interface name is changed, then the link state, especially managed or not, may need to be updated, as its corresponding .link or .network files may be different. So, let's once drop the link and recreate a new link object. Fixes #8794. --- diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index fae750be203..97c6d21c07f 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -3215,15 +3215,18 @@ int link_update(Link *link, sd_netlink_message *m) { if (r >= 0 && !streq(ifname, link->ifname)) { log_link_info(link, "Interface name change detected, %s has been renamed to %s.", link->ifname, ifname); - link_free_carrier_maps(link); - - r = free_and_strdup(&link->ifname, ifname); - if (r < 0) - return r; + if (link->state == LINK_STATE_PENDING) { + r = free_and_strdup(&link->ifname, ifname); + if (r < 0) + return r; + } else { + Manager *manager = link->manager; - r = link_new_carrier_maps(link); - if (r < 0) - return r; + link_drop(link); + r = link_add(manager, m, &link); + if (r < 0) + return r; + } } r = sd_netlink_message_read_u32(m, IFLA_MTU, &mtu);