]>
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 | |
d3c9da06 JR |
8 | Since we are keeping the old persistent network interface naming for |
9 | now, and make the new naming scheme [1] explictly opt-in [2], re-apply | |
10 | this old hack to make the renaming less likely to fail. | |
5112024c | 11 | |
d3c9da06 JR |
12 | [1] http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ |
13 | [2] d5051f7666e25ecf2b32c7076ce18c1de969d01b | |
14 | --- | |
15 | src/udev/udev-event.c | 41 ++++++++++++++++++++++++++++++++++++++--- | |
16 | 1 file changed, 38 insertions(+), 3 deletions(-) | |
5112024c JR |
17 | |
18 | diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c | |
d3c9da06 | 19 | index bc115f1..a673f51 100644 |
5112024c JR |
20 | --- a/src/udev/udev-event.c |
21 | +++ b/src/udev/udev-event.c | |
d3c9da06 JR |
22 | @@ -769,18 +769,53 @@ static int rename_netif(struct udev_event *event) { |
23 | char name[IFNAMSIZ]; | |
24 | const char *oldname; | |
25 | int r; | |
5112024c | 26 | + int loop; |
5112024c | 27 | |
d3c9da06 JR |
28 | oldname = udev_device_get_sysname(dev); |
29 | ||
30 | strscpy(name, IFNAMSIZ, event->name); | |
31 | ||
32 | r = rtnl_set_link_name(&event->rtnl, udev_device_get_ifindex(dev), name); | |
33 | + if (r >= 0) { | |
34 | + log_debug("renamed network interface %s to %s\n", oldname, name); | |
5112024c JR |
35 | + goto out; |
36 | + } | |
37 | + | |
38 | + /* keep trying if the destination interface name already exists */ | |
d3c9da06 | 39 | + if (r != -EEXIST) |
5112024c JR |
40 | + goto out; |
41 | + | |
42 | + /* free our own name, another process may wait for us */ | |
d3c9da06 JR |
43 | + snprintf(name, IFNAMSIZ, "rename%u", udev_device_get_ifindex(dev)); |
44 | + r = rtnl_set_link_name(&event->rtnl, udev_device_get_ifindex(dev), name); | |
45 | if (r < 0) | |
46 | - return log_error_errno(r, "Error changing net interface name '%s' to '%s': %m", oldname, name); | |
47 | + goto out; | |
48 | ||
49 | - log_debug("renamed network interface '%s' to '%s'", oldname, name); | |
5112024c | 50 | + /* log temporary name */ |
d3c9da06 JR |
51 | + log_debug("renamed network interface %s to %s\n", oldname, name); |
52 | ||
53 | - return 0; | |
5112024c | 54 | + /* wait a maximum of 90 seconds for our target to become available */ |
d3c9da06 | 55 | + strscpy(name, IFNAMSIZ, event->name); |
5112024c JR |
56 | + loop = 90 * 20; |
57 | + while (loop--) { | |
58 | + const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 }; | |
59 | + | |
60 | + nanosleep(&duration, NULL); | |
61 | + | |
d3c9da06 JR |
62 | + r = rtnl_set_link_name(&event->rtnl, udev_device_get_ifindex(dev), name); |
63 | + if (r >= 0) { | |
64 | + log_debug("renamed network interface %s to %s\n", oldname, name); | |
5112024c JR |
65 | + break; |
66 | + } | |
d3c9da06 | 67 | + if (r != -EEXIST) |
5112024c | 68 | + break; |
d3c9da06 | 69 | + } |
5112024c JR |
70 | + |
71 | +out: | |
d3c9da06 JR |
72 | + if (r < 0) |
73 | + log_error("error changing net interface name '%s' to '%s': %s", | |
74 | + oldname, name, strerror(-r)); | |
75 | + return r; | |
5112024c | 76 | } |
d3c9da06 JR |
77 | |
78 | void udev_event_execute_rules(struct udev_event *event, |