]>
Commit | Line | Data |
---|---|---|
1 | From: Michael Biebl <biebl@debian.org> | |
2 | Date: Thu, 18 Jul 2013 01:04:07 +0200 | |
3 | Subject: Revert "udev: network device renaming - immediately give up if the | |
4 | target name isn't available" | |
5 | ||
6 | This reverts commit 97595710b77aa162ca5e20da57d0a1ed7355eaad. | |
7 | ||
8 | We need to keep supporting systems with 75-persistent-net-generator.rules | |
9 | generated names for a while after switching to net.ifnames. Re-apply this old | |
10 | hack to make the renaming less likely to fail. | |
11 | --- | |
12 | --- systemd-242/src/udev/udev-event.c.orig 2019-04-11 18:28:36.000000000 +0200 | |
13 | +++ systemd-242/src/udev/udev-event.c 2019-04-13 14:19:13.346990771 +0200 | |
14 | @@ -698,6 +698,8 @@ | |
15 | sd_device *dev = event->dev; | |
16 | const char *oldname; | |
17 | int ifindex, r; | |
18 | + char name[IFNAMSIZ]; | |
19 | + int loop; | |
20 | ||
21 | if (!event->name) | |
22 | return 0; /* No new name is requested. */ | |
23 | @@ -719,22 +720,66 @@ | |
24 | return log_device_error_errno(dev, r, "Failed to get ifindex: %m"); | |
25 | ||
26 | r = rtnl_set_link_name(&event->rtnl, ifindex, event->name); | |
27 | + if (r >= 0) { | |
28 | + /* Set ID_RENAMING boolean property here, and drop it in the corresponding move uevent later. */ | |
29 | + r = device_add_property(dev, "ID_RENAMING", "1"); | |
30 | + if (r < 0) | |
31 | + log_device_warning_errno(dev, r, "Failed to add 'ID_RENAMING' property: %m"); | |
32 | + | |
33 | + r = device_rename(dev, event->name); | |
34 | + if (r < 0) | |
35 | + log_device_warning_errno(dev, r, "Failed to update properties with new name '%s': %m", event->name); | |
36 | + | |
37 | + log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, event->name); | |
38 | + return 1; | |
39 | + } | |
40 | + | |
41 | + /* keep trying if the destination interface name already exists */ | |
42 | + if (r != -EEXIST) | |
43 | + goto out; | |
44 | + | |
45 | + /* free our own name, another process may wait for us */ | |
46 | + snprintf(name, IFNAMSIZ, "rename%u", ifindex); | |
47 | + r = rtnl_set_link_name(&event->rtnl, ifindex, name); | |
48 | if (r < 0) | |
49 | - return log_device_error_errno(dev, r, "Failed to rename network interface %i from '%s' to '%s': %m", | |
50 | - ifindex, oldname, event->name); | |
51 | + goto out; | |
52 | + | |
53 | + /* log temporary name */ | |
54 | + log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, event->name); | |
55 | ||
56 | - /* Set ID_RENAMING boolean property here, and drop it in the corresponding move uevent later. */ | |
57 | - r = device_add_property(dev, "ID_RENAMING", "1"); | |
58 | - if (r < 0) | |
59 | - log_device_warning_errno(dev, r, "Failed to add 'ID_RENAMING' property: %m"); | |
60 | + /* wait a maximum of 90 seconds for our target to become available */ | |
61 | + strscpy(name, IFNAMSIZ, event->name); | |
62 | + loop = 90 * 20; | |
63 | + while (loop--) { | |
64 | + const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 }; | |
65 | + | |
66 | + nanosleep(&duration, NULL); | |
67 | + | |
68 | + r = rtnl_set_link_name(&event->rtnl, ifindex, name); | |
69 | + if (r >= 0) { | |
70 | + /* Set ID_RENAMING boolean property here, and drop it in the corresponding move uevent later. */ | |
71 | + r = device_add_property(dev, "ID_RENAMING", "1"); | |
72 | + if (r < 0) | |
73 | + log_device_warning_errno(dev, r, "Failed to add 'ID_RENAMING' property: %m"); | |
74 | + | |
75 | + r = device_rename(dev, event->name); | |
76 | + if (r < 0) | |
77 | + log_device_warning_errno(dev, r, "Failed to update properties with new name '%s': %m", event->name); | |
78 | + | |
79 | + log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, event->name); | |
80 | + return 1; | |
81 | + } | |
82 | + if (r != -EEXIST) | |
83 | + goto out; | |
84 | + } | |
85 | ||
86 | - r = device_rename(dev, event->name); | |
87 | +out: | |
88 | if (r < 0) | |
89 | - log_device_warning_errno(dev, r, "Failed to update properties with new name '%s': %m", event->name); | |
90 | + return log_device_error_errno(dev, r, "Failed to rename network interface %i from '%s' to '%s': %m", | |
91 | + ifindex, oldname, event->name); | |
92 | + return r; | |
93 | ||
94 | - log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, event->name); | |
95 | ||
96 | - return 1; | |
97 | } | |
98 | ||
99 | static int update_devnode(UdevEvent *event) { |