]> git.pld-linux.org Git - packages/systemd.git/blob - net-rename-revert.patch
- x32 rebuild
[packages/systemd.git] / net-rename-revert.patch
1 https://bugs.freedesktop.org/show_bug.cgi?id=53837
2
3 Kay Sievers <kay@vrfy.org> changed:
4
5            What    |Removed                     |Added
6 ----------------------------------------------------------------------------
7              Status|NEW                         |RESOLVED
8          Resolution|                            |WONTFIX
9
10 --- Comment #1 from Kay Sievers <kay@vrfy.org> 2012-08-20 12:12:56 UTC ---
11 Please use biosdevname or name the devices other than ethX.
12
13 We do not try to race against the kernel anymore, and therefore do not
14 support swapping names around in the kernel namespace.
15
16 In short: Devices can no longer be renamed to ethX.
17
18 ============================================================================
19
20 Revert 97595710b77aa162ca5e20da57d0a1ed7355eaad
21
22 From: Kay Sievers <kay@vrfy.org>
23 Date: Thu, 05 Jul 2012 15:40:50 +0000
24 Subject: udev: network device renaming - immediately give up if the target name isn't available
25
26 diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
27 index 2ade0ab..aff1487 100644
28 --- a/src/udev/udev-event.c
29 +++ b/src/udev/udev-event.c
30 @@ -745,11 +745,32 @@ out:
31          return err;
32  }
33  
34 +static void rename_netif_kernel_log(struct ifreq ifr)
35 +{
36 +        int klog;
37 +        FILE *f;
38 +
39 +        klog = open("/dev/kmsg", O_WRONLY|O_CLOEXEC);
40 +        if (klog < 0)
41 +                return;
42 +
43 +        f = fdopen(klog, "w");
44 +        if (f == NULL) {
45 +                close(klog);
46 +                return;
47 +        }
48 +
49 +        fprintf(f, "<30>udevd[%u]: renamed network interface %s to %s\n",
50 +                getpid(), ifr.ifr_name, ifr.ifr_newname);
51 +        fclose(f);
52 +}
53 +
54  static int rename_netif(struct udev_event *event)
55  {
56          struct udev_device *dev = event->dev;
57          int sk;
58          struct ifreq ifr;
59 +        int loop;
60          int err;
61  
62          log_debug("changing net interface name from '%s' to '%s'\n",
63 @@ -766,12 +787,49 @@ static int rename_netif(struct udev_event *event)
64          strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev));
65          strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
66          err = ioctl(sk, SIOCSIFNAME, &ifr);
67 -        if (err >= 0) {
68 -                print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
69 -        } else {
70 +        if (err == 0) {
71 +                rename_netif_kernel_log(ifr);
72 +                goto out;
73 +        }
74 +
75 +        /* keep trying if the destination interface name already exists */
76 +        err = -errno;
77 +        if (err != -EEXIST)
78 +                goto out;
79 +
80 +        /* free our own name, another process may wait for us */
81 +        snprintf(ifr.ifr_newname, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev));
82 +        err = ioctl(sk, SIOCSIFNAME, &ifr);
83 +        if (err < 0) {
84                  err = -errno;
85 -                log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
86 +                goto out;
87 +        }
88 +
89 +        /* log temporary name */
90 +        rename_netif_kernel_log(ifr);
91 +
92 +        /* wait a maximum of 90 seconds for our target to become available */
93 +        strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname);
94 +        strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
95 +        loop = 90 * 20;
96 +        while (loop--) {
97 +                const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 };
98 +
99 +                nanosleep(&duration, NULL);
100 +
101 +                err = ioctl(sk, SIOCSIFNAME, &ifr);
102 +                if (err == 0) {
103 +                        rename_netif_kernel_log(ifr);
104 +                        break;
105 +                }
106 +                err = -errno;
107 +                if (err != -EEXIST)
108 +                        break;
109          }
110 +
111 +out:
112 +        if (err < 0)
113 +                log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
114          close(sk);
115          return err;
116  }
This page took 0.040507 seconds and 3 git commands to generate.