]> git.pld-linux.org Git - packages/systemd.git/blob - net-rename-revert.patch
adjust target-pld.patch for new parse_env_file() interface
[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 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  src/udev/udev-event.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-----
13  1 file changed, 46 insertions(+), 5 deletions(-)
14
15 diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
16 index 07b7365..f67b295 100644
17 --- a/src/udev/udev-event.c
18 +++ b/src/udev/udev-event.c
19 @@ -680,6 +680,7 @@ static int rename_netif(UdevEvent *event) {
20          const char *action, *oldname;
21          char name[IFNAMSIZ];
22          int ifindex, r;
23 +        int loop;
24  
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");
29  
30          strscpy(name, IFNAMSIZ, event->name);
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);
35 +        if (r >= 0) {
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;
43 +        }
44 +
45 +        /* keep trying if the destination interface name already exists */
46 +        if (r != -EEXIST)
47 +                goto out;
48  
49 -        r = device_rename(dev, event->name);
50 +        /* free our own name, another process may wait for us */
51 +        snprintf(name, IFNAMSIZ, "rename%u", ifindex);
52 +        r = rtnl_set_link_name(&event->rtnl, ifindex, name);
53          if (r < 0)
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;
56  
57 +        /* log temporary name */
58          log_device_debug(dev, "Network interface %i is renamed from '%s' to '%s'", ifindex, oldname, name);
59  
60 -        return 1;
61 +        /* wait a maximum of 90 seconds for our target to become available */
62 +        strscpy(name, IFNAMSIZ, event->name);
63 +        loop = 90 * 20;
64 +        while (loop--) {
65 +                const struct timespec duration = { 0, 1000 * 1000 * 1000 / 20 };
66 +
67 +                nanosleep(&duration, NULL);
68 +
69 +                r = rtnl_set_link_name(&event->rtnl, ifindex, name);
70 +                if (r >= 0) {
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;
78 +                }
79 +                if (r != -EEXIST)
80 +                        goto out;
81 +        }
82 +
83 +out:
84 +        if (r < 0)
85 +                return log_device_error_errno(dev, r, "Failed to rename network interface %i from '%s' to '%s': %m", ifindex, oldname, name);
86 +        return r;
87  }
88  
89  static int update_devnode(UdevEvent *event) {
This page took 0.035552 seconds and 3 git commands to generate.