From 8bee8851308142a428134cc53a6c1d7db14bfac4 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Mon, 27 Jul 2015 07:33:08 +0200 Subject: [PATCH] pass on reboot flag and delete old veth on reboot When setting lxc.network.veth.pair to get a fixed interface name the recreation of it after a reboot caused an EEXIST. -) The reboot flag is now a three-state value. It's set to 1 to request a reboot, and 2 during a reboot until after lxc_spawn where it is reset to 0. -) If the reboot is set (!= 0) within instantiate_veth and a fixed name is used, the interface is now deleted before being recreated. Signed-off-by: Wolfgang Bumiller Acked-by: Serge E. Hallyn --- src/lxc/conf.c | 6 ++++-- src/lxc/lxccontainer.c | 6 +++--- src/lxc/start.c | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index e6e2a4a2a..309ceea40 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2611,9 +2611,11 @@ static int instantiate_veth(struct lxc_handler *handler, struct lxc_netdev *netd char veth2buf[IFNAMSIZ], *veth2; int err; - if (netdev->priv.veth_attr.pair) + if (netdev->priv.veth_attr.pair) { veth1 = netdev->priv.veth_attr.pair; - else { + if (handler->conf->reboot) + lxc_netdev_delete_by_name(veth1); + } else { err = snprintf(veth1buf, sizeof(veth1buf), "vethXXXXXX"); if (err >= sizeof(veth1buf)) { /* can't *really* happen, but... */ ERROR("veth1 name too long"); diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 1c103e828..223e78e09 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -760,9 +760,9 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a pid_fp = NULL; } -reboot: conf->reboot = 0; +reboot: if (lxc_check_inherited(conf, daemonize, -1)) { ERROR("Inherited fds found"); ret = 1; @@ -772,9 +772,9 @@ reboot: ret = lxc_start(c->name, argv, conf, c->config_path, daemonize); c->error_num = ret; - if (conf->reboot) { + if (conf->reboot == 1) { INFO("container requested reboot"); - conf->reboot = 0; + conf->reboot = 2; goto reboot; } diff --git a/src/lxc/start.c b/src/lxc/start.c index 6eded6155..2fc026ef3 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -1173,6 +1173,8 @@ int __lxc_start(const char *name, struct lxc_conf *conf, goto out_detach_blockdev; } + handler->conf->reboot = 0; + netnsfd = get_netns_fd(handler->pid); err = lxc_poll(name, handler); -- 2.39.2