From b171c46e1873845192486d4fdbf98e84e3dd85543aa00720db6e4ddcddb1caef Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Fri, 5 Dec 2014 17:54:19 +0000 Subject: [PATCH] . OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=829 --- ...rfkill-service-is-bount-to-the-actua.patch | 32 +++ ...w-we-generate-file-names-from-rfkill.patch | 116 +++++++++++ ...up-respect-kernel-name-assign-policy.patch | 189 ++++++++++++++++++ systemd-mini.changes | 8 + systemd-mini.spec | 9 + systemd.changes | 8 + systemd.spec | 9 + 7 files changed, 371 insertions(+) create mode 100644 0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch create mode 100644 0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch create mode 100644 1098-udev-link_setup-respect-kernel-name-assign-policy.patch diff --git a/0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch b/0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch new file mode 100644 index 00000000..052eeca6 --- /dev/null +++ b/0001-units-make-sure-rfkill-service-is-bount-to-the-actua.patch @@ -0,0 +1,32 @@ +Based on 812bd1e6ab4c463507557f2bdbb8875fedd92ade Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +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 diff --git a/0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch b/0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch new file mode 100644 index 00000000..67ad0284 --- /dev/null +++ b/0002-rfkill-rework-how-we-generate-file-names-from-rfkill.patch @@ -0,0 +1,116 @@ +Based on 4844262f25a3ff6bd23de05a0a6f84a8e2983d74 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +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); diff --git a/1098-udev-link_setup-respect-kernel-name-assign-policy.patch b/1098-udev-link_setup-respect-kernel-name-assign-policy.patch new file mode 100644 index 00000000..622cf745 --- /dev/null +++ b/1098-udev-link_setup-respect-kernel-name-assign-policy.patch @@ -0,0 +1,189 @@ +Based on 04b67d49254d956d31bcfe80340fb9df7ed332d3 Mon Sep 17 00:00:00 2001 +From: Tom Gundersen +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 ID_NET_NAME, + which is, by default, used by a udev rule to set +- NAME. The available policies are: ++ NAME. If the name has already ++ been set by userspace, no renaming is performed. ++ The available policies are: + + + ++ kernel ++ ++ If the kernel claims that the name it ++ has set for a device is predictable, then ++ no renaming is performed. ++ ++ ++ ++ + database + + 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 +-#include ++#include + + #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, diff --git a/systemd-mini.changes b/systemd-mini.changes index 872f66b3..c5007350 100644 --- a/systemd-mini.changes +++ b/systemd-mini.changes @@ -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 diff --git a/systemd-mini.spec b/systemd-mini.spec index 77920367..1a567741 100644 --- a/systemd-mini.spec +++ b/systemd-mini.spec @@ -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 '{}' \+ diff --git a/systemd.changes b/systemd.changes index 872f66b3..c5007350 100644 --- a/systemd.changes +++ b/systemd.changes @@ -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 diff --git a/systemd.spec b/systemd.spec index 16bb7ba7..4332b4be 100644 --- a/systemd.spec +++ b/systemd.spec @@ -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 '{}' \+