]>
Commit | Line | Data |
---|---|---|
d3c9da06 JR |
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" | |
5112024c | 5 | |
d3c9da06 | 6 | This reverts commit 97595710b77aa162ca5e20da57d0a1ed7355eaad. |
5112024c | 7 | |
a919bc1d JP |
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. | |
d3c9da06 | 11 | --- |
a919bc1d JP |
12 | src/udev/udev-event.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- |
13 | 1 file changed, 46 insertions(+), 5 deletions(-) | |
5112024c JR |
14 | |
15 | diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c | |
a919bc1d | 16 | index 07b7365..f67b295 100644 |
5112024c JR |
17 | --- a/src/udev/udev-event.c |
18 | +++ b/src/udev/udev-event.c | |
a919bc1d JP |
19 | @@ -680,6 +680,7 @@ static int rename_netif(UdevEvent *event) { |
20 | const char *action, *oldname; | |
d3c9da06 | 21 | char name[IFNAMSIZ]; |
a919bc1d | 22 | int ifindex, r; |
5112024c | 23 | + int loop; |
5112024c | 24 | |
a919bc1d JP |
25 | if (!event->name) |
26 | return 0; /* No new name is requested. */ | |
27 | @@ -705,17 +706,57 @@ static int rename_netif(UdevEvent *event) { | |
28 | return log_device_error_errno(dev, r, "Failed to get ifindex: %m"); | |
d3c9da06 JR |
29 | |
30 | strscpy(name, IFNAMSIZ, event->name); | |
a919bc1d JP |
31 | + |
32 | r = rtnl_set_link_name(&event->rtnl, ifindex, name); | |
33 | - if (r < 0) | |
34 | - return log_device_error_errno(dev, r, "Failed to rename network interface %i from '%s' to '%s': %m", ifindex, oldname, name); | |
d3c9da06 | 35 | + if (r >= 0) { |
a919bc1d JP |
36 | + r = device_rename(dev, event->name); |
37 | + if (r < 0) | |
38 | + return log_warning_errno(r, "Network interface %i is renamed from '%s' to '%s', but could not update sd_device object: %m", ifindex, oldname, name); | |
39 | + | |
40 | + log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, name); | |
41 | + | |
42 | + return 1; | |
5112024c JR |
43 | + } |
44 | + | |
45 | + /* keep trying if the destination interface name already exists */ | |
d3c9da06 | 46 | + if (r != -EEXIST) |
5112024c | 47 | + goto out; |
a919bc1d JP |
48 | |
49 | - r = device_rename(dev, event->name); | |
5112024c | 50 | + /* free our own name, another process may wait for us */ |
a919bc1d JP |
51 | + snprintf(name, IFNAMSIZ, "rename%u", ifindex); |
52 | + r = rtnl_set_link_name(&event->rtnl, ifindex, name); | |
d3c9da06 | 53 | if (r < 0) |
a919bc1d JP |
54 | - return log_warning_errno(r, "Network interface %i is renamed from '%s' to '%s', but could not update sd_device object: %m", ifindex, oldname, name); |
55 | + goto out; | |
d3c9da06 | 56 | |
5112024c | 57 | + /* log temporary name */ |
a919bc1d | 58 | log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, name); |
d3c9da06 | 59 | |
a919bc1d | 60 | - return 1; |
5112024c | 61 | + /* wait a maximum of 90 seconds for our target to become available */ |
d3c9da06 | 62 | + strscpy(name, IFNAMSIZ, event->name); |
5112024c JR |
63 | + loop = 90 * 20; |
64 | + while (loop--) { | |
65 | + const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 }; | |
66 | + | |
67 | + nanosleep(&duration, NULL); | |
68 | + | |
a919bc1d | 69 | + r = rtnl_set_link_name(&event->rtnl, ifindex, name); |
d3c9da06 | 70 | + if (r >= 0) { |
a919bc1d JP |
71 | + r = device_rename(dev, event->name); |
72 | + if (r < 0) | |
73 | + return log_warning_errno(r, "Network interface %i is renamed from '%s' to '%s', but could not update sd_device object: %m", ifindex, oldname, name); | |
74 | + | |
75 | + log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, name); | |
76 | + | |
77 | + return 1; | |
5112024c | 78 | + } |
d3c9da06 | 79 | + if (r != -EEXIST) |
a919bc1d | 80 | + goto out; |
d3c9da06 | 81 | + } |
5112024c JR |
82 | + |
83 | +out: | |
d3c9da06 | 84 | + if (r < 0) |
a919bc1d | 85 | + return log_device_error_errno(dev, r, "Failed to rename network interface %i from '%s' to '%s': %m", ifindex, oldname, name); |
d3c9da06 | 86 | + return r; |
5112024c | 87 | } |
d3c9da06 | 88 | |
a919bc1d | 89 | static int update_devnode(UdevEvent *event) { |