[packages/systemd] Revert network device renaming change causing breakage in existing configs

baggins baggins at pld-linux.org
Mon Aug 20 14:31:03 CEST 2012


commit 5112024c1ca5af6ce98628a95a6e3961aefeaa0e
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Mon Aug 20 14:19:17 2012 +0200

    Revert network device renaming change causing breakage in existing configs

 net-rename-revert.patch | 116 ++++++++++++++++++++++++++++++++++++++++++++++++
 systemd.spec            |   2 +
 2 files changed, 118 insertions(+)
---
diff --git a/systemd.spec b/systemd.spec
index 0017d75..402f933 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -79,6 +79,7 @@ Patch6:		udev-so.patch
 Patch7:		udev-uClibc.patch
 Patch8:		udev-ploop-rules.patch
 Patch9:		udevadm-in-sbin.patch
+Patch10:	net-rename-revert.patch
 # hack set to allow static udev build
 Patch100:	static-udev.patch
 URL:		http://www.freedesktop.org/wiki/Software/systemd
@@ -564,6 +565,7 @@ initrd.
 %endif
 %patch8 -p1
 %patch9 -p1
+%patch10 -p1
 cp -p %{SOURCE2} src/systemd_booted.c
 
 %build
diff --git a/net-rename-revert.patch b/net-rename-revert.patch
new file mode 100644
index 0000000..1c62171
--- /dev/null
+++ b/net-rename-revert.patch
@@ -0,0 +1,116 @@
+https://bugs.freedesktop.org/show_bug.cgi?id=53837
+
+Kay Sievers <kay at vrfy.org> changed:
+
+           What    |Removed                     |Added
+----------------------------------------------------------------------------
+             Status|NEW                         |RESOLVED
+         Resolution|                            |WONTFIX
+
+--- Comment #1 from Kay Sievers <kay at vrfy.org> 2012-08-20 12:12:56 UTC ---
+Please use biosdevname or name the devices other than ethX.
+
+We do not try to race against the kernel anymore, and therefore do not
+support swapping names around in the kernel namespace.
+
+In short: Devices can no longer be renamed to ethX.
+
+============================================================================
+
+Revert 97595710b77aa162ca5e20da57d0a1ed7355eaad
+
+From: Kay Sievers <kay at vrfy.org>
+Date: Thu, 05 Jul 2012 15:40:50 +0000
+Subject: udev: network device renaming - immediately give up if the target name isn't available
+
+diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
+index 2b9fdf6..aff1487 100644
+--- a/src/udev/udev-event.c
++++ b/src/udev/udev-event.c
+@@ -745,11 +745,32 @@ out:
+         return err;
+ }
+ 
++static void rename_netif_kernel_log(struct ifreq ifr)
++{
++        int klog;
++        FILE *f;
++
++        klog = open("/dev/kmsg", O_WRONLY|O_CLOEXEC);
++        if (klog < 0)
++                return;
++
++        f = fdopen(klog, "w");
++        if (f == NULL) {
++                close(klog);
++                return;
++        }
++
++        fprintf(f, "<30>udevd[%u]: renamed network interface %s to %s\n",
++                getpid(), ifr.ifr_name, ifr.ifr_newname);
++        fclose(f);
++}
++
+ static int rename_netif(struct udev_event *event)
+ {
+         struct udev_device *dev = event->dev;
+         int sk;
+         struct ifreq ifr;
++        int loop;
+         int err;
+ 
+         log_debug("changing net interface name from '%s' to '%s'\n",
+@@ -766,12 +787,49 @@ static int rename_netif(struct udev_event *event)
+         util_strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev));
+         util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
+         err = ioctl(sk, SIOCSIFNAME, &ifr);
+-        if (err >= 0) {
+-                print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
+-        } else {
++        if (err == 0) {
++                rename_netif_kernel_log(ifr);
++                goto out;
++        }
++
++        /* keep trying if the destination interface name already exists */
++        err = -errno;
++        if (err != -EEXIST)
++                goto out;
++
++        /* free our own name, another process may wait for us */
++        snprintf(ifr.ifr_newname, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev));
++        err = ioctl(sk, SIOCSIFNAME, &ifr);
++        if (err < 0) {
+                 err = -errno;
+-                log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
++                goto out;
++        }
++
++        /* log temporary name */
++        rename_netif_kernel_log(ifr);
++
++        /* wait a maximum of 90 seconds for our target to become available */
++        util_strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname);
++        util_strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
++        loop = 90 * 20;
++        while (loop--) {
++                const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 };
++
++                nanosleep(&duration, NULL);
++
++                err = ioctl(sk, SIOCSIFNAME, &ifr);
++                if (err == 0) {
++                        rename_netif_kernel_log(ifr);
++                        break;
++                }
++                err = -errno;
++                if (err != -EEXIST)
++                        break;
+         }
++
++out:
++        if (err < 0)
++                log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
+         close(sk);
+         return err;
+ }


More information about the pld-cvs-commit mailing list