]> git.pld-linux.org Git - packages/systemd.git/blob - net-rename-revert.patch
2c41fd5a92a2b5db7506ac536835016ddf13b77d
[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 --- 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 -                return 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 -                return 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) {
This page took 0.073364 seconds and 2 git commands to generate.