From 3400d77a7f23630367a753c31f975352fa1e885d Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sun, 1 Oct 2017 07:27:34 +0200 Subject: [PATCH] network: clear ifindeces We need to clear any ifindeces we recorded so liblxc won't have cached stale data which would cause it to fail on reboot we're we don't re-read the on-disk config file. Signed-off-by: Christian Brauner --- src/lxc/network.c | 51 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/lxc/network.c b/src/lxc/network.c index 7349a4c1c2..909b7e58b3 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -2334,7 +2334,7 @@ bool lxc_delete_network_unpriv(struct lxc_handler *handler) TRACE("Renamed interface with index %d to its " "initial name \"%s\"", netdev->ifindex, netdev->link); - continue; + goto clear_ifindices; } ret = netdev_deconf[netdev->type](handler, netdev); @@ -2342,17 +2342,17 @@ bool lxc_delete_network_unpriv(struct lxc_handler *handler) WARN("Failed to deconfigure network device"); if (netdev->type != LXC_NET_VETH) - continue; + goto clear_ifindices; if (netdev->link[0] == '\0' || !is_ovs_bridge(netdev->link)) - continue; + goto clear_ifindices; if (netdev->priv.veth_attr.pair[0] != '\0') hostveth = netdev->priv.veth_attr.pair; else hostveth = netdev->priv.veth_attr.veth1; if (hostveth[0] == '\0') - continue; + goto clear_ifindices; ret = lxc_delete_network_unpriv_exec(handler->lxcpath, handler->name, netdev, @@ -2360,10 +2360,23 @@ bool lxc_delete_network_unpriv(struct lxc_handler *handler) if (ret < 0) { WARN("Failed to remove port \"%s\" from openvswitch " "bridge \"%s\"", hostveth, netdev->link); - continue; + goto clear_ifindices; } INFO("Removed interface \"%s\" from \"%s\"", hostveth, netdev->link); + +clear_ifindices: + /* We need to clear any ifindeces we recorded so liblxc won't + * have cached stale data which would cause it to fail on reboot + * we're we don't re-read the on-disk config file. + */ + netdev->ifindex = 0; + if (netdev->type == LXC_NET_PHYS) { + netdev->priv.phys_attr.ifindex = 0; + } else if (netdev->type == LXC_NET_VETH) { + netdev->priv.veth_attr.veth1[0] = '\0'; + netdev->priv.veth_attr.ifindex = 0; + } } return true; @@ -2496,7 +2509,7 @@ bool lxc_delete_network_priv(struct lxc_handler *handler) "\"%s\" to its initial name \"%s\"", netdev->ifindex, netdev->name, netdev->link); - continue; + goto clear_ifindices; } ret = netdev_deconf[netdev->type](handler, netdev); @@ -2516,18 +2529,17 @@ bool lxc_delete_network_priv(struct lxc_handler *handler) netdev->ifindex); } else if (ret < 0) { WARN("Failed to remove interface \"%s\" with " - continue; "index %d: %s", netdev->name[0] != '\0' ? netdev->name : "(null)", netdev->ifindex, strerror(-ret)); - continue; + goto clear_ifindices; } INFO("Removed interface \"%s\" with index %d", netdev->name[0] != '\0' ? netdev->name : "(null)", netdev->ifindex); if (netdev->type != LXC_NET_VETH) - continue; + goto clear_ifindices; /* Explicitly delete host veth device to prevent lingering * devices. We had issues in LXD around this. @@ -2537,19 +2549,21 @@ bool lxc_delete_network_priv(struct lxc_handler *handler) else hostveth = netdev->priv.veth_attr.veth1; if (hostveth[0] == '\0') - continue; + goto clear_ifindices; ret = lxc_netdev_delete_by_name(hostveth); if (ret < 0) { WARN("Failed to remove interface \"%s\" from \"%s\": %s", hostveth, netdev->link, strerror(-ret)); - continue; + goto clear_ifindices; } INFO("Removed interface \"%s\" from \"%s\"", hostveth, netdev->link); if (netdev->link[0] == '\0' || !is_ovs_bridge(netdev->link)) { netdev->priv.veth_attr.veth1[0] = '\0'; - continue; + netdev->ifindex = 0; + netdev->priv.veth_attr.ifindex = 0; + goto clear_ifindices; } /* Delete the openvswitch port. */ @@ -2561,7 +2575,18 @@ bool lxc_delete_network_priv(struct lxc_handler *handler) INFO("Removed port \"%s\" from openvswitch bridge \"%s\"", hostveth, netdev->link); - netdev->priv.veth_attr.veth1[0] = '\0'; +clear_ifindices: + /* We need to clear any ifindeces we recorded so liblxc won't + * have cached stale data which would cause it to fail on reboot + * we're we don't re-read the on-disk config file. + */ + netdev->ifindex = 0; + if (netdev->type == LXC_NET_PHYS) { + netdev->priv.phys_attr.ifindex = 0; + } else if (netdev->type == LXC_NET_VETH) { + netdev->priv.veth_attr.veth1[0] = '\0'; + netdev->priv.veth_attr.ifindex = 0; + } } return true;