]>
Commit | Line | Data |
---|---|---|
5112024c JR |
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 | |
69f834fc | 27 | index 2ade0ab..aff1487 100644 |
5112024c JR |
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) | |
d31498aa JR |
64 | strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev)); |
65 | strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); | |
5112024c JR |
66 | err = ioctl(sk, SIOCSIFNAME, &ifr); |
67 | - if (err >= 0) { | |
618c1d39 | 68 | - print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); |
5112024c JR |
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 */ | |
d31498aa JR |
93 | + strscpy(ifr.ifr_name, IFNAMSIZ, ifr.ifr_newname); |
94 | + strscpy(ifr.ifr_newname, IFNAMSIZ, event->name); | |
5112024c JR |
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 | } |