Commit 8bee8851 by Wolfgang Bumiller Committed by Stéphane Graber

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: 's avatarWolfgang Bumiller <w.bumiller@proxmox.com> Acked-by: 's avatarSerge E. Hallyn <serge.hallyn@ubuntu.com>
parent 8bea9fae
...@@ -2611,9 +2611,11 @@ static int instantiate_veth(struct lxc_handler *handler, struct lxc_netdev *netd ...@@ -2611,9 +2611,11 @@ static int instantiate_veth(struct lxc_handler *handler, struct lxc_netdev *netd
char veth2buf[IFNAMSIZ], *veth2; char veth2buf[IFNAMSIZ], *veth2;
int err; int err;
if (netdev->priv.veth_attr.pair) if (netdev->priv.veth_attr.pair) {
veth1 = 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"); err = snprintf(veth1buf, sizeof(veth1buf), "vethXXXXXX");
if (err >= sizeof(veth1buf)) { /* can't *really* happen, but... */ if (err >= sizeof(veth1buf)) { /* can't *really* happen, but... */
ERROR("veth1 name too long"); ERROR("veth1 name too long");
......
...@@ -760,9 +760,9 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a ...@@ -760,9 +760,9 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
pid_fp = NULL; pid_fp = NULL;
} }
reboot:
conf->reboot = 0; conf->reboot = 0;
reboot:
if (lxc_check_inherited(conf, daemonize, -1)) { if (lxc_check_inherited(conf, daemonize, -1)) {
ERROR("Inherited fds found"); ERROR("Inherited fds found");
ret = 1; ret = 1;
...@@ -772,9 +772,9 @@ reboot: ...@@ -772,9 +772,9 @@ reboot:
ret = lxc_start(c->name, argv, conf, c->config_path, daemonize); ret = lxc_start(c->name, argv, conf, c->config_path, daemonize);
c->error_num = ret; c->error_num = ret;
if (conf->reboot) { if (conf->reboot == 1) {
INFO("container requested reboot"); INFO("container requested reboot");
conf->reboot = 0; conf->reboot = 2;
goto reboot; goto reboot;
} }
......
...@@ -1173,6 +1173,8 @@ int __lxc_start(const char *name, struct lxc_conf *conf, ...@@ -1173,6 +1173,8 @@ int __lxc_start(const char *name, struct lxc_conf *conf,
goto out_detach_blockdev; goto out_detach_blockdev;
} }
handler->conf->reboot = 0;
netnsfd = get_netns_fd(handler->pid); netnsfd = get_netns_fd(handler->pid);
err = lxc_poll(name, handler); err = lxc_poll(name, handler);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment