[lxc-devel] [PATCH] pass on reboot flag and delete old veth on reboot

Serge Hallyn serge.hallyn at ubuntu.com
Fri Jul 24 15:23:53 UTC 2015


Quoting Wolfgang Bumiller (w.bumiller at proxmox.com):
> When using a fixed interface name the recreation of it after
> a reboot caused an EEXIST.

For ease of future git history reviewers, please point out specifically
that this means setting lxc.network.veth.pair.

Tested that this does fix the issue, so once you handle the error
cases in __lxc_start (easily done with a new label), I'll happily
ack - thanks much.

> -) The reboot flag is now kept till after lxc_spawn instead
> of just before lxc_start in order to know whether to delete
> the old interface.
> -) If the reboot flag is set within instantiate_veth and a
> fixed name is used, the interface is now deleted before
> being recreated.
> 
> Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
> ---
>  src/lxc/conf.c         | 6 ++++--
>  src/lxc/lxccontainer.c | 3 +--
>  src/lxc/start.c        | 2 ++
>  3 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/src/lxc/conf.c b/src/lxc/conf.c
> index 9870455..ed2ad66 100644
> --- a/src/lxc/conf.c
> +++ b/src/lxc/conf.c
> @@ -2613,9 +2613,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 1c103e8..b483dd8 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;
> @@ -774,7 +774,6 @@ reboot:
>  
>  	if (conf->reboot) {
>  		INFO("container requested reboot");
> -		conf->reboot = 0;
>  		goto reboot;
>  	}
>  
> diff --git a/src/lxc/start.c b/src/lxc/start.c
> index 6eded61..2fc026e 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.1.4
> 
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list