From: Christian Brauner Date: Sun, 1 Oct 2017 05:27:34 +0000 (+0200) Subject: network: clear ifindeces X-Git-Tag: lxc-2.0.9~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1cdad20e5b2d1727e9a6ae17981d7eadcf3e28df;p=thirdparty%2Flxc.git 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 --- diff --git a/src/lxc/network.c b/src/lxc/network.c index c4aa81f51..9b37e53d2 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -2306,7 +2306,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); @@ -2314,17 +2314,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, @@ -2332,10 +2332,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; @@ -2468,7 +2481,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); @@ -2488,18 +2501,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. @@ -2509,19 +2521,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. */ @@ -2533,7 +2547,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;