]> git.pld-linux.org Git - packages/systemd.git/blob - net-rename-revert.patch
- Obsoletes elogind
[packages/systemd.git] / net-rename-revert.patch
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 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.
11
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(-)
17
18 diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
19 index bc115f1..a673f51 100644
20 --- a/src/udev/udev-event.c
21 +++ b/src/udev/udev-event.c
22 @@ -769,18 +769,53 @@ static int rename_netif(struct udev_event *event) {
23          char name[IFNAMSIZ];
24          const char *oldname;
25          int r;
26 +        int loop;
27  
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);
35 +                goto out;
36 +        }
37 +
38 +        /* keep trying if the destination interface name already exists */
39 +        if (r != -EEXIST)
40 +                goto out;
41 +
42 +        /* free our own name, another process may wait for us */
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);
50 +        /* log temporary name */
51 +        log_debug("renamed network interface %s to %s\n", oldname, name);
52  
53 -        return 0;
54 +        /* wait a maximum of 90 seconds for our target to become available */
55 +        strscpy(name, IFNAMSIZ, event->name);
56 +        loop = 90 * 20;
57 +        while (loop--) {
58 +                const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 };
59 +
60 +                nanosleep(&duration, NULL);
61 +
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);
65 +                        break;
66 +                }
67 +                if (r != -EEXIST)
68 +                        break;
69 +        }
70 +
71 +out:
72 +        if (r < 0)
73 +                log_error("error changing net interface name '%s' to '%s': %s",
74 +                          oldname, name, strerror(-r));
75 +        return r;
76  }
77  
78  void udev_event_execute_rules(struct udev_event *event,
This page took 0.025298 seconds and 3 git commands to generate.