Dr. Werner Fink 2014-12-05 17:54:19 +00:00 committed by Git OBS Bridge
parent dfb277d2c3
commit cc852857fb
7 changed files with 371 additions and 0 deletions

View File

@ -0,0 +1,32 @@
Based on 812bd1e6ab4c463507557f2bdbb8875fedd92ade Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 21 Nov 2014 01:20:57 +0100
Subject: [PATCH] units: make sure rfkill service is bount to the actual
hardware
---
rules/99-systemd.rules.in | 2 +-
units/systemd-rfkill@.service.in | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
--- rules/99-systemd.rules.in
+++ rules/99-systemd.rules.in
@@ -62,7 +62,7 @@ SUBSYSTEM=="leds", KERNEL=="*kbd_backlight", TAG+="systemd", IMPORT{builtin}="pa
# Pull in rfkill save/restore for all rfkill devices
-SUBSYSTEM=="rfkill", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-rfkill@$name.service"
+SUBSYSTEM=="rfkill", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/rfkill/devices/%k", ENV{SYSTEMD_WANTS}+="systemd-rfkill@$name.service"
# Asynchronously mount file systems implemented by these modules as
# soon as they are loaded.
--- units/systemd-rfkill@.service.in
+++ units/systemd-rfkill@.service.in 2014-12-05 11:52:59.433518948 +0000
@@ -9,6 +9,7 @@
Description=Load/Save RF Kill Switch Status of %I
Documentation=man:systemd-rfkill@.service(8)
DefaultDependencies=no
+BindsTo=sys-subsystem-rfkill-devices-%i.device
RequiresMountsFor=/var/lib/systemd/rfkill
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service systemd-remount-fs.service

View File

@ -0,0 +1,116 @@
Based on 4844262f25a3ff6bd23de05a0a6f84a8e2983d74 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 3 Dec 2014 02:02:11 +0100
Subject: [PATCH] rfkill: rework how we generate file names from rfkill
devices
Generate the file name from ID_PATH plus the rfkill type (wlan,
bluetooth, ...) and ignore the rfkill device name, since it apparently
is not a stable identifier.
Also, ensure that devices disappearing don't result in broken services,
simply exit cleanly.
---
src/rfkill/rfkill.c | 47 ++++++++++++++++++++++++-----------------------
1 file changed, 24 insertions(+), 23 deletions(-)
--- src/rfkill/rfkill.c
+++ src/rfkill/rfkill.c 2014-12-05 12:05:59.053518122 +0000
@@ -28,8 +28,8 @@
int main(int argc, char *argv[]) {
_cleanup_udev_unref_ struct udev *udev = NULL;
_cleanup_udev_device_unref_ struct udev_device *device = NULL;
- _cleanup_free_ char *saved = NULL, *escaped_name = NULL, *escaped_path_id = NULL;
- const char *name, *path_id;
+ _cleanup_free_ char *saved = NULL, *escaped_type = NULL, *escaped_path_id = NULL;
+ const char *name, *type, *path_id;
int r;
if (argc != 3) {
@@ -55,25 +55,28 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- errno = 0;
device = udev_device_new_from_subsystem_sysname(udev, "rfkill", argv[2]);
if (!device) {
- if (errno != 0)
- log_error("Failed to get rfkill device '%s': %m", argv[2]);
- else
- log_oom();
-
- return EXIT_FAILURE;
+ log_debug("Failed to get rfkill device '%s', ignoring: %m", argv[2]);
+ return EXIT_SUCCESS;
}
name = udev_device_get_sysattr_value(device, "name");
if (!name) {
- log_error("rfkill device has no name?");
- return EXIT_FAILURE;
+ log_error("rfkill device has no name? Ignoring device.");
+ return EXIT_SUCCESS;
+ }
+
+ log_debug("Operating on rfkill device '%s'.", name);
+
+ type = udev_device_get_sysattr_value(device, "type");
+ if (!type) {
+ log_error("rfkill device has no type? Ignoring device.");
+ return EXIT_SUCCESS;
}
- escaped_name = cescape(name);
- if (!escaped_name) {
+ escaped_type = cescape(type);
+ if (!escaped_type) {
log_oom();
return EXIT_FAILURE;
}
@@ -86,9 +89,9 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- saved = strjoin("/var/lib/systemd/rfkill/", escaped_path_id, ":", escaped_name, NULL);
+ saved = strjoin("/var/lib/systemd/rfkill/", escaped_path_id, ":", escaped_type, NULL);
} else
- saved = strjoin("/var/lib/systemd/rfkill/", escaped_name, NULL);
+ saved = strjoin("/var/lib/systemd/rfkill/", escaped_type, NULL);
if (!saved) {
log_oom();
@@ -102,19 +105,17 @@ int main(int argc, char *argv[]) {
return EXIT_SUCCESS;
r = read_one_line_file(saved, &value);
+ if (r == -ENOENT)
+ return EXIT_SUCCESS;
if (r < 0) {
-
- if (r == -ENOENT)
- return EXIT_SUCCESS;
-
log_error("Failed to read %s: %s", saved, strerror(-r));
return EXIT_FAILURE;
}
r = udev_device_set_sysattr_value(device, "soft", value);
if (r < 0) {
- log_error("Failed to write system attribute: %s", strerror(-r));
- return EXIT_FAILURE;
+ log_debug("Failed to write 'soft' attribute on rfkill device, ignoring: %s", strerror(-r));
+ return EXIT_SUCCESS;
}
} else if (streq(argv[1], "save")) {
@@ -122,8 +123,8 @@ int main(int argc, char *argv[]) {
value = udev_device_get_sysattr_value(device, "soft");
if (!value) {
- log_error("Failed to read system attribute: %s", strerror(-r));
- return EXIT_FAILURE;
+ log_debug("Failed to read system attribute, ignoring device: %s", strerror(-r));
+ return EXIT_SUCCESS;
}
r = write_string_file(saved, value);

View File

@ -0,0 +1,189 @@
Based on 04b67d49254d956d31bcfe80340fb9df7ed332d3 Mon Sep 17 00:00:00 2001
From: Tom Gundersen <teg@jklm.no>
Date: Tue, 15 Jul 2014 17:57:43 +0200
Subject: [PATCH] udev: link_setup - respect kernel name assign policy
Newer kernels export meta-information about the origin of an ifname. Respect this
from the ifname rename logic. We do not rename any interfaces that was originally
named by userspace, nor once which have already been renamed from userspace.
Moreover, we optionally do not (the default) rename interfaces which the kernel
claims to have named in a predictable way.
---
man/udev.xml | 13 ++++++++++-
network/99-default.link | 2 -
src/shared/missing.h | 21 +++++++++++++++++
src/udev/net/link-config.c | 53 +++++++++++++++++++++++++++++++++++++--------
src/udev/net/link-config.h | 1
5 files changed, 79 insertions(+), 11 deletions(-)
--- man/udev.xml
+++ man/udev.xml 2014-12-05 11:43:18.670867575 +0000
@@ -914,10 +914,21 @@
successful one is used. The name is not set directly, but
is exported to udev as the property <literal>ID_NET_NAME</literal>,
which is, by default, used by a udev rule to set
- <literal>NAME</literal>. The available policies are:
+ <literal>NAME</literal>. If the name has already
+ been set by userspace, no renaming is performed.
+ The available policies are:
</para>
<variablelist>
<varlistentry>
+ <term><literal>kernel</literal></term>
+ <listitem>
+ <para>If the kernel claims that the name it
+ has set for a device is predictable, then
+ no renaming is performed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><literal>database</literal></term>
<listitem>
<para>The name is set based on entries in the Hardware
--- network/99-default.link
+++ network/99-default.link 2014-12-05 00:00:00.000000000 +0000
@@ -1,3 +1,3 @@
[Link]
-NamePolicy=database onboard slot path
+NamePolicy=kernel database onboard slot path
MACAddressPolicy=persistent
--- src/shared/missing.h
+++ src/shared/missing.h 2014-12-05 11:33:06.120057836 +0000
@@ -362,3 +362,24 @@ static inline int setns(int fd, int nsty
return syscall(__NR_setns, fd, nstype);
}
#endif
+
+#ifndef NET_ADDR_RANDOM
+# define NET_ADDR_RANDOM 1
+#endif
+
+#ifndef NET_NAME_ENUM
+# define NET_NAME_ENUM 1
+#endif
+
+#ifndef NET_NAME_PREDICTABLE
+# define NET_NAME_PREDICTABLE 2
+#endif
+
+#ifndef NET_NAME_USER
+# define NET_NAME_USER 3
+#endif
+
+#ifndef NET_NAME_RENAMED
+# define NET_NAME_RENAMED 4
+#endif
+
--- src/udev/net/link-config.c
+++ src/udev/net/link-config.c 2014-12-05 11:36:51.658018542 +0000
@@ -20,10 +20,11 @@
***/
#include <netinet/ether.h>
-#include <net/if.h>
+#include <linux/netdevice.h>
#include "sd-id128.h"
+#include "missing.h"
#include "link-config.h"
#include "ethtool-util.h"
@@ -297,7 +298,33 @@ static bool mac_is_random(struct udev_de
return false;
/* check for NET_ADDR_RANDOM */
- return type == 1;
+ return type == NET_ADDR_RANDOM;
+}
+
+static bool should_rename(struct udev_device *device, bool respect_predictable) {
+ const char *s;
+ unsigned type;
+ int r;
+
+ s = udev_device_get_sysattr_value(device, "name_assign_type");
+ if (!s)
+ return true; /* if we don't know, assume we should rename */
+ r = safe_atou(s, &type);
+ if (r < 0)
+ return true;
+
+ switch (type) {
+ case NET_NAME_USER:
+ case NET_NAME_RENAMED:
+ return false; /* these were already named by userspace, do not touch again */
+ case NET_NAME_PREDICTABLE:
+ if (respect_predictable)
+ return false; /* the kernel claims to have given a predictable name */
+ /* fall through */
+ case NET_NAME_ENUM:
+ default:
+ return true; /* the name is known to be bad, or of an unknown type */
+ }
}
static bool mac_is_permanent(struct udev_device *device) {
@@ -371,6 +398,7 @@ int link_config_apply(link_config_ctx *c
const char *new_name = NULL;
struct ether_addr generated_mac;
struct ether_addr *mac = NULL;
+ bool respect_predictable = false;
int r, ifindex;
assert(ctx);
@@ -406,8 +434,12 @@ int link_config_apply(link_config_ctx *c
if (ctx->enable_name_policy && config->name_policy) {
NamePolicy *policy;
- for (policy = config->name_policy; !new_name && *policy != _NAMEPOLICY_INVALID; policy++) {
+ for (policy = config->name_policy; !respect_predictable && !new_name &&
+ *policy != _NAMEPOLICY_INVALID; policy++) {
switch (*policy) {
+ case NAMEPOLICY_KERNEL:
+ respect_predictable = true;
+ break;
case NAMEPOLICY_DATABASE:
new_name = udev_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE");
break;
@@ -429,12 +461,14 @@ int link_config_apply(link_config_ctx *c
}
}
- if (new_name)
- *name = new_name; /* a name was set by a policy */
- else if (config->name)
- *name = config->name; /* a name was set manually in the config */
- else
- *name = NULL;
+ if (should_rename(device, respect_predictable)) {
+ if (!new_name)
+ /* if not set by policy, fall back manually set name */
+ new_name = config->name;
+ } else
+ new_name = NULL;
+
+ *name = new_name;
switch (config->mac_policy) {
case MACPOLICY_PERSISTENT:
@@ -500,6 +534,7 @@ DEFINE_STRING_TABLE_LOOKUP(mac_policy, M
DEFINE_CONFIG_PARSE_ENUM(config_parse_mac_policy, mac_policy, MACPolicy, "Failed to parse MAC address policy");
static const char* const name_policy_table[] = {
+ [NAMEPOLICY_KERNEL] = "kernel",
[NAMEPOLICY_DATABASE] = "database",
[NAMEPOLICY_ONBOARD] = "onboard",
[NAMEPOLICY_SLOT] = "slot",
--- src/udev/net/link-config.h
+++ src/udev/net/link-config.h 2014-12-05 00:00:00.000000000 +0000
@@ -39,6 +39,7 @@ typedef enum MACPolicy {
} MACPolicy;
typedef enum NamePolicy {
+ NAMEPOLICY_KERNEL,
NAMEPOLICY_DATABASE,
NAMEPOLICY_ONBOARD,
NAMEPOLICY_SLOT,

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Fri Dec 5 12:13:02 UTC 2014 - werner@suse.de
- Add upstream patches
0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch
0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch
1097-udev-link_setup-respect-kernel-name-assign-policy.patch
-------------------------------------------------------------------
Fri Nov 28 13:26:21 UTC 2014 - rmilasan@suse.com

View File

@ -1044,6 +1044,10 @@ Patch507: 0002-systemctl-obey-state-in-list-unit-files.patch
Patch509: 0002-core-watchdog-bus-properties-cannot-be-both-writable.patch
# PATCH-FIX-UPSTREAM added at 2014/11/20
Patch510: 0003-sd-bus-refuse-properties-that-claim-to-be-both-writa.patch
# PATCH-FIX-UPSTREAM added at 2014/12/05
Patch511: 0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch
# PATCH-FIX-UPSTREAM added at 2014/12/05
Patch512: 0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch
# UDEV PATCHES
# ============
@ -1245,6 +1249,8 @@ Patch1095: 1095-set-ssd-disk-to-use-deadline-scheduler.patch
Patch1096: 1096-new-udev-root-symlink-generator.patch
# PATCH-FIX-SUSE 1097-udevd-increase-maximum-number-of-children.patch
Patch1097: 1097-udevd-increase-maximum-number-of-children.patch
# PATCH-FIX-UPSTREAM 1098-udev-link_setup-respect-kernel-name-assign-policy.patch
Patch1098: 1098-udev-link_setup-respect-kernel-name-assign-policy.patch
%description
Systemd is a system and service manager, compatible with SysV and LSB
@ -1914,6 +1920,8 @@ cp %{SOURCE7} m4/
%patch507 -p0
%patch509 -p0
%patch510 -p0
%patch511 -p0
%patch512 -p0
# udev patches
%patch1001 -p1
@ -2046,6 +2054,7 @@ cp %{SOURCE7} m4/
%patch1095 -p1
%patch1096 -p1
%patch1097 -p1
%patch1098 -p0
# remove patch backups
find -name '*.orig' -exec rm -f '{}' \+

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Fri Dec 5 12:13:02 UTC 2014 - werner@suse.de
- Add upstream patches
0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch
0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch
1097-udev-link_setup-respect-kernel-name-assign-policy.patch
-------------------------------------------------------------------
Fri Nov 28 13:26:21 UTC 2014 - rmilasan@suse.com

View File

@ -1039,6 +1039,10 @@ Patch507: 0002-systemctl-obey-state-in-list-unit-files.patch
Patch509: 0002-core-watchdog-bus-properties-cannot-be-both-writable.patch
# PATCH-FIX-UPSTREAM added at 2014/11/20
Patch510: 0003-sd-bus-refuse-properties-that-claim-to-be-both-writa.patch
# PATCH-FIX-UPSTREAM added at 2014/12/05
Patch511: 0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch
# PATCH-FIX-UPSTREAM added at 2014/12/05
Patch512: 0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch
# UDEV PATCHES
# ============
@ -1240,6 +1244,8 @@ Patch1095: 1095-set-ssd-disk-to-use-deadline-scheduler.patch
Patch1096: 1096-new-udev-root-symlink-generator.patch
# PATCH-FIX-SUSE 1097-udevd-increase-maximum-number-of-children.patch
Patch1097: 1097-udevd-increase-maximum-number-of-children.patch
# PATCH-FIX-UPSTREAM 1098-udev-link_setup-respect-kernel-name-assign-policy.patch
Patch1098: 1098-udev-link_setup-respect-kernel-name-assign-policy.patch
%description
Systemd is a system and service manager, compatible with SysV and LSB
@ -1909,6 +1915,8 @@ cp %{SOURCE7} m4/
%patch507 -p0
%patch509 -p0
%patch510 -p0
%patch511 -p0
%patch512 -p0
# udev patches
%patch1001 -p1
@ -2041,6 +2049,7 @@ cp %{SOURCE7} m4/
%patch1095 -p1
%patch1096 -p1
%patch1097 -p1
%patch1098 -p0
# remove patch backups
find -name '*.orig' -exec rm -f '{}' \+