From cd70d42111912a17e7a3331340d451a243519cbd Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 9 Nov 2016 11:18:17 +0100 Subject: [PATCH] conf: merge network namespace move & rename on shutdown This is upstream already and fixes issues with shutting down and restarting containers with a physical network device passed through. --- debian/patches/phynet-rename.patch | 114 +++++++++++++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 115 insertions(+) create mode 100644 debian/patches/phynet-rename.patch diff --git a/debian/patches/phynet-rename.patch b/debian/patches/phynet-rename.patch new file mode 100644 index 0000000..c621697 --- /dev/null +++ b/debian/patches/phynet-rename.patch @@ -0,0 +1,114 @@ +From 5610055a113f46a017bad687c40e7570da2a7035 Mon Sep 17 00:00:00 2001 +From: Wolfgang Bumiller +Date: Wed, 17 Aug 2016 11:36:39 +0200 +Subject: [PATCH] conf: merge network namespace move & rename on shutdown + +On shutdown we move physical network interfaces back to the +host namespace and rename them afterwards as well as in the +later lxc_network_delete() step. However, if the device had +a name which already exists in the host namespace then the +moving fails and so do the subsequent rename attempts. When +the namespace ceases to exist the devices finally end up +in the host namespace named 'dev' by the kernel. + +In order to avoid this, we do the moving and renaming in a +single step (lxc_netdev_move_by_*()'s move & rename happen +in a single netlink transaction). + +Signed-off-by: Wolfgang Bumiller +--- + src/lxc/conf.c | 29 ++++++++--------------------- + src/lxc/conf.h | 2 +- + src/lxc/start.c | 2 +- + 3 files changed, 10 insertions(+), 23 deletions(-) + +diff --git a/src/lxc/conf.c b/src/lxc/conf.c +index f688f94..b2e0fd9 100644 +--- a/src/lxc/conf.c ++++ b/src/lxc/conf.c +@@ -2397,15 +2397,17 @@ static int setup_network(struct lxc_list *network) + } + + /* try to move physical nics to the init netns */ +-void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf) ++void lxc_restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf) + { + int i, ret, oldfd; + char path[MAXPATHLEN]; + char ifname[IFNAMSIZ]; + +- if (netnsfd < 0) ++ if (netnsfd < 0 || conf->num_savednics == 0) + return; + ++ INFO("running to reset %d nic names", conf->num_savednics); ++ + ret = snprintf(path, MAXPATHLEN, "/proc/self/ns/net"); + if (ret < 0 || ret >= MAXPATHLEN) { + WARN("Failed to open monitor netns fd"); +@@ -2427,32 +2429,17 @@ void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf) + WARN("no interface corresponding to index '%d'", s->ifindex); + continue; + } +- if (lxc_netdev_move_by_name(ifname, 1, NULL)) ++ if (lxc_netdev_move_by_name(ifname, 1, s->orig_name)) + WARN("Error moving nic name:%s back to host netns", ifname); ++ free(s->orig_name); + } ++ conf->num_savednics = 0; ++ + if (setns(oldfd, 0) != 0) + SYSERROR("Failed to re-enter monitor's netns"); + close(oldfd); + } + +-void lxc_rename_phys_nics_on_shutdown(int netnsfd, struct lxc_conf *conf) +-{ +- int i; +- +- if (conf->num_savednics == 0) +- return; +- +- INFO("running to reset %d nic names", conf->num_savednics); +- restore_phys_nics_to_netns(netnsfd, conf); +- for (i=0; inum_savednics; i++) { +- struct saved_nic *s = &conf->saved_nics[i]; +- INFO("resetting nic %d to %s", s->ifindex, s->orig_name); +- lxc_netdev_rename_by_index(s->ifindex, s->orig_name); +- free(s->orig_name); +- } +- conf->num_savednics = 0; +-} +- + static char *default_rootfs_mount = LXCROOTFSMOUNT; + + struct lxc_conf *lxc_conf_init(void) +diff --git a/src/lxc/conf.h b/src/lxc/conf.h +index e484667..842e4dc 100644 +--- a/src/lxc/conf.h ++++ b/src/lxc/conf.h +@@ -440,7 +440,7 @@ extern int do_rootfs_setup(struct lxc_conf *conf, const char *name, + struct cgroup_process_info; + extern int lxc_setup(struct lxc_handler *handler); + +-extern void lxc_rename_phys_nics_on_shutdown(int netnsfd, struct lxc_conf *conf); ++extern void lxc_restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf); + + extern int find_unmapped_nsuid(struct lxc_conf *conf, enum idtype idtype); + extern int mapped_hostid(unsigned id, struct lxc_conf *conf, enum idtype idtype); +diff --git a/src/lxc/start.c b/src/lxc/start.c +index ecc7b08..0da7f9f 100644 +--- a/src/lxc/start.c ++++ b/src/lxc/start.c +@@ -1420,7 +1420,7 @@ int __lxc_start(const char *name, struct lxc_conf *conf, + } + + DEBUG("Pushing physical nics back to host namespace"); +- lxc_rename_phys_nics_on_shutdown(netnsfd, handler->conf); ++ lxc_restore_phys_nics_to_netns(netnsfd, handler->conf); + + DEBUG("Tearing down virtual network devices used by container"); + lxc_delete_network(handler); +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index 3d8bf98..d8de190 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -7,3 +7,4 @@ use-var-lib-vz-as-default-dir.patch #do-not-use-config-path-for-rootfs.patch run-lxcnetaddbr.patch deny-rw-mounting-of-sys-and-proc.patch +phynet-rename.patch