[pve-devel] [PATCH lxc 1/2] conf: merge network namespace move & rename on shutdown
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Nov 9 11:22:44 CET 2016
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 <w.bumiller at proxmox.com>
+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<ID>' 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 <w.bumiller at proxmox.com>
+---
+ 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; i<conf->num_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
--
2.1.4
More information about the pve-devel
mailing list