]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
network: clear ifindeces
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 1 Oct 2017 05:27:34 +0000 (07:27 +0200)
committerStéphane Graber <stgraber@ubuntu.com>
Wed, 4 Oct 2017 22:58:29 +0000 (18:58 -0400)
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 <christian.brauner@ubuntu.com>
src/lxc/network.c

index c4aa81f51fbd6605b1cf11f02f7ba0f9b8545f09..9b37e53d25e9d46634fe0be5f40586dc65ee7caf 100644 (file)
@@ -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;