diff --git a/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch b/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch new file mode 100644 index 0000000..40479ea --- /dev/null +++ b/0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch @@ -0,0 +1,329 @@ +From d420282b28f50720e233ccb1c02547c562195653 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Tue, 26 Nov 2013 01:39:53 +0100 +Subject: [PATCH] core: replace OnFailureIsolate= setting by a more generic + OnFailureJobMode= setting and make use of it where applicable + +--- + man/systemd.unit.xml | 40 +++++++++++++++++++++++++---------- + src/core/dbus-unit.c | 3 ++- + src/core/job.h | 3 +-- + src/core/load-fragment-gperf.gperf.m4 | 3 ++- + src/core/load-fragment.c | 31 +++++++++++++++++++++++++++ + src/core/load-fragment.h | 2 ++ + src/core/unit.c | 11 +++++----- + src/core/unit.h | 4 ++-- + units/initrd-cleanup.service.in | 1 + + units/initrd-fs.target | 2 +- + units/initrd-parse-etc.service.in | 1 + + units/initrd-root-fs.target | 2 +- + units/initrd-switch-root.service.in | 1 + + units/initrd.target | 2 +- + units/local-fs.target | 2 +- + 15 files changed, 82 insertions(+), 26 deletions(-) + +Index: systemd-208/man/systemd.unit.xml +=================================================================== +--- systemd-208.orig/man/systemd.unit.xml ++++ systemd-208/man/systemd.unit.xml +@@ -669,19 +669,37 @@ + + + +- OnFailureIsolate= ++ OnFailureJobMode= + +- Takes a boolean +- argument. If , the +- unit listed in ++ Takes a value of ++ fail, ++ replace, ++ replace-irreversibly ++ or ++ isolate. Defaults ++ to ++ replace. Specifies ++ how the units listed in + OnFailure= will be +- enqueued in isolation mode, i.e. all +- units that are not its dependency will +- be stopped. If this is set, only a ++ enqueued. If set to ++ fail and ++ contradicting jobs are already queued, ++ cause the activation to fail. If set ++ to replace and ++ contradicting jobs area already ++ queued, replace ++ those. replace-irreversibly ++ is similar to ++ replace, however, ++ creates jobs that cannot be reversed ++ unless they finished or are explicitly ++ canceled. isolate ++ may be used to terminate all other ++ units but the specified one. If ++ this is set to ++ isolate, only a + single unit may be listed in +- OnFailure=. Defaults +- to +- . ++ OnFailure=.. + + + +Index: systemd-208/src/core/dbus-unit.c +=================================================================== +--- systemd-208.orig/src/core/dbus-unit.c ++++ systemd-208/src/core/dbus-unit.c +@@ -133,6 +133,7 @@ static int bus_unit_append_description(D + } + + static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_unit_append_load_state, unit_load_state, UnitLoadState); ++static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_unit_append_job_mode, job_mode, JobMode); + + static int bus_unit_append_active_state(DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; +@@ -1079,7 +1080,7 @@ const BusProperty bus_unit_properties[] + { "RefuseManualStop", bus_property_append_bool, "b", offsetof(Unit, refuse_manual_stop) }, + { "AllowIsolate", bus_property_append_bool, "b", offsetof(Unit, allow_isolate) }, + { "DefaultDependencies", bus_property_append_bool, "b", offsetof(Unit, default_dependencies) }, +- { "OnFailureIsolate", bus_property_append_bool, "b", offsetof(Unit, on_failure_isolate) }, ++ { "OnFailureJobMode", bus_unit_append_job_mode, "s", offsetof(Unit, on_failure_job_mode) }, + { "IgnoreOnIsolate", bus_property_append_bool, "b", offsetof(Unit, ignore_on_isolate) }, + { "IgnoreOnSnapshot", bus_property_append_bool, "b", offsetof(Unit, ignore_on_snapshot) }, + { "NeedDaemonReload", bus_unit_append_need_daemon_reload, "b", 0 }, +Index: systemd-208/src/core/job.h +=================================================================== +--- systemd-208.orig/src/core/job.h ++++ systemd-208/src/core/job.h +@@ -83,7 +83,7 @@ enum JobState { + enum JobMode { + JOB_FAIL, /* Fail if a conflicting job is already queued */ + JOB_REPLACE, /* Replace an existing conflicting job */ +- JOB_REPLACE_IRREVERSIBLY, /* Like JOB_REPLACE + produce irreversible jobs */ ++ JOB_REPLACE_IRREVERSIBLY,/* Like JOB_REPLACE + produce irreversible jobs */ + JOB_ISOLATE, /* Start a unit, and stop all others */ + JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */ + JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */ +Index: systemd-208/src/core/load-fragment-gperf.gperf.m4 +=================================================================== +--- systemd-208.orig/src/core/load-fragment-gperf.gperf.m4 ++++ systemd-208/src/core/load-fragment-gperf.gperf.m4 +@@ -122,7 +122,8 @@ Unit.RefuseManualStart, config_ + Unit.RefuseManualStop, config_parse_bool, 0, offsetof(Unit, refuse_manual_stop) + Unit.AllowIsolate, config_parse_bool, 0, offsetof(Unit, allow_isolate) + Unit.DefaultDependencies, config_parse_bool, 0, offsetof(Unit, default_dependencies) +-Unit.OnFailureIsolate, config_parse_bool, 0, offsetof(Unit, on_failure_isolate) ++Unit.OnFailureJobMode, config_parse_job_mode, 0, offsetof(Unit, on_failure_job_mode) ++Unit.OnFailureIsolate, config_parse_job_mode_isolate, 0, offsetof(Unit, on_failure_job_mode) + Unit.IgnoreOnIsolate, config_parse_bool, 0, offsetof(Unit, ignore_on_isolate) + Unit.IgnoreOnSnapshot, config_parse_bool, 0, offsetof(Unit, ignore_on_snapshot) + Unit.JobTimeoutSec, config_parse_sec, 0, offsetof(Unit, job_timeout) +Index: systemd-208/src/core/load-fragment.c +=================================================================== +--- systemd-208.orig/src/core/load-fragment.c ++++ systemd-208/src/core/load-fragment.c +@@ -2314,6 +2314,36 @@ int config_parse_blockio_bandwidth( + return 0; + } + ++DEFINE_CONFIG_PARSE_ENUM(config_parse_job_mode, job_mode, JobMode, "Failed to parse job mode"); ++ ++int config_parse_job_mode_isolate( ++ const char *unit, ++ const char *filename, ++ unsigned line, ++ const char *section, ++ const char *lvalue, ++ int ltype, ++ const char *rvalue, ++ void *data, ++ void *userdata) { ++ ++ JobMode *m = data; ++ int r; ++ ++ assert(filename); ++ assert(lvalue); ++ assert(rvalue); ++ ++ r = parse_boolean(rvalue); ++ if (r < 0) { ++ log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse boolean, ignoring: %s", rvalue); ++ return 0; ++ } ++ ++ *m = r ? JOB_ISOLATE : JOB_REPLACE; ++ return 0; ++} ++ + #define FOLLOW_MAX 8 + + static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { +Index: systemd-208/src/core/load-fragment.h +=================================================================== +--- systemd-208.orig/src/core/load-fragment.h ++++ systemd-208/src/core/load-fragment.h +@@ -83,6 +83,8 @@ int config_parse_device_allow(const char + int config_parse_blockio_weight(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + int config_parse_blockio_device_weight(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + int config_parse_blockio_bandwidth(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); ++int config_parse_job_mode(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); ++int config_parse_job_mode_isolate(const char *unit, const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + + /* gperf prototypes */ + const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, unsigned length); +Index: systemd-208/src/core/unit.c +=================================================================== +--- systemd-208.orig/src/core/unit.c ++++ systemd-208/src/core/unit.c +@@ -85,6 +85,7 @@ Unit *unit_new(Manager *m, size_t size) + u->deserialized_job = _JOB_TYPE_INVALID; + u->default_dependencies = true; + u->unit_file_state = _UNIT_FILE_STATE_INVALID; ++ u->on_failure_job_mode = JOB_REPLACE; + + return u; + } +@@ -807,14 +808,14 @@ void unit_dump(Unit *u, FILE *f, const c + "%s\tRefuseManualStart: %s\n" + "%s\tRefuseManualStop: %s\n" + "%s\tDefaultDependencies: %s\n" +- "%s\tOnFailureIsolate: %s\n" ++ "%s\tOnFailureJobMode: %s\n" + "%s\tIgnoreOnIsolate: %s\n" + "%s\tIgnoreOnSnapshot: %s\n", + prefix, yes_no(u->stop_when_unneeded), + prefix, yes_no(u->refuse_manual_start), + prefix, yes_no(u->refuse_manual_stop), + prefix, yes_no(u->default_dependencies), +- prefix, yes_no(u->on_failure_isolate), ++ prefix, job_mode_to_string(u->on_failure_job_mode), + prefix, yes_no(u->ignore_on_isolate), + prefix, yes_no(u->ignore_on_snapshot)); + +@@ -985,11 +986,11 @@ int unit_load(Unit *u) { + if (r < 0) + goto fail; + +- if (u->on_failure_isolate && ++ if (u->on_failure_job_mode == JOB_ISOLATE && + set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) { + + log_error_unit(u->id, +- "More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.", u->id); ++ "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id); + + r = -EINVAL; + goto fail; +@@ -1394,7 +1395,7 @@ void unit_start_on_failure(Unit *u) { + SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) { + int r; + +- r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL); ++ r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL); + if (r < 0) + log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r)); + } +Index: systemd-208/src/core/unit.h +=================================================================== +--- systemd-208.orig/src/core/unit.h ++++ systemd-208/src/core/unit.h +@@ -228,8 +228,8 @@ struct Unit { + /* Allow isolation requests */ + bool allow_isolate; + +- /* Isolate OnFailure unit */ +- bool on_failure_isolate; ++ /* How to start OnFailure units */ ++ JobMode on_failure_job_mode; + + /* Ignore this unit when isolating */ + bool ignore_on_isolate; +Index: systemd-208/units/initrd-cleanup.service.in +=================================================================== +--- systemd-208.orig/units/initrd-cleanup.service.in ++++ systemd-208/units/initrd-cleanup.service.in +@@ -10,6 +10,7 @@ Description=Cleaning Up and Shutting Dow + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + After=initrd-root-fs.target initrd-fs.target initrd.target + + [Service] +Index: systemd-208/units/initrd-fs.target +=================================================================== +--- systemd-208.orig/units/initrd-fs.target ++++ systemd-208/units/initrd-fs.target +@@ -9,7 +9,7 @@ + Description=Initrd File Systems + Documentation=man:systemd.special(7) + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + After=initrd-parse-etc.service + DefaultDependencies=no +Index: systemd-208/units/initrd-parse-etc.service.in +=================================================================== +--- systemd-208.orig/units/initrd-parse-etc.service.in ++++ systemd-208/units/initrd-parse-etc.service.in +@@ -11,6 +11,7 @@ DefaultDependencies=no + Requires=initrd-root-fs.target + After=initrd-root-fs.target + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + + [Service] +Index: systemd-208/units/initrd-root-fs.target +=================================================================== +--- systemd-208.orig/units/initrd-root-fs.target ++++ systemd-208/units/initrd-root-fs.target +@@ -10,6 +10,6 @@ Description=Initrd Root File System + Documentation=man:systemd.special(7) + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + DefaultDependencies=no + Conflicts=shutdown.target +Index: systemd-208/units/initrd-switch-root.service.in +=================================================================== +--- systemd-208.orig/units/initrd-switch-root.service.in ++++ systemd-208/units/initrd-switch-root.service.in +@@ -10,6 +10,7 @@ Description=Switch Root + DefaultDependencies=no + ConditionPathExists=/etc/initrd-release + OnFailure=emergency.target ++OnFailureJobMode=replace-irreversibly + AllowIsolate=yes + + [Service] +Index: systemd-208/units/initrd.target +=================================================================== +--- systemd-208.orig/units/initrd.target ++++ systemd-208/units/initrd.target +@@ -9,7 +9,7 @@ + Description=Initrd Default Target + Documentation=man:systemd.special(7) + OnFailure=emergency.target +-OnFailureIsolate=yes ++OnFailureJobMode=replace-irreversibly + ConditionPathExists=/etc/initrd-release + Requires=basic.target + Wants=initrd-root-fs.target initrd-fs.target initrd-parse-etc.service +Index: systemd-208/units/local-fs.target +=================================================================== +--- systemd-208.orig/units/local-fs.target ++++ systemd-208/units/local-fs.target +@@ -12,4 +12,4 @@ After=local-fs-pre.target + DefaultDependencies=no + Conflicts=shutdown.target + OnFailure=emergency.target +-OnFailureIsolate=no ++OnFailureJobMode=replace-irreversibly diff --git a/make-emergency.service-conflict-with-syslog.socket.patch b/make-emergency.service-conflict-with-syslog.socket.patch new file mode 100644 index 0000000..63e513c --- /dev/null +++ b/make-emergency.service-conflict-with-syslog.socket.patch @@ -0,0 +1,22 @@ +If after emergency service had been started there is incoming +traffic on syslog.socket emergency.service gets killed due to +implicit dependencies on basic.target => sysinit.target which in +turn conflict with emergency.target. + +As a workaround explicitly stop syslog.socket when entering +emergency.service. + +Reference: bnc#852232 +Index: systemd-208/units/emergency.service.in +=================================================================== +--- systemd-208/units/emergency.service.in ++++ systemd-208/units/emergency.service.in +@@ -9,7 +9,7 @@ + Description=Emergency Shell + Documentation=man:sulogin(8) + DefaultDependencies=no +-Conflicts=shutdown.target ++Conflicts=shutdown.target syslog.socket + Before=shutdown.target + + [Service] diff --git a/systemd.changes b/systemd.changes index 920ab0f..cf1ad2e 100644 --- a/systemd.changes +++ b/systemd.changes @@ -114,6 +114,19 @@ Fri Dec 6 13:30:19 UTC 2013 - werner@suse.de the systemd-journald (bnc#838475) - Let us build require the package config for libpcre (bnc#853293) +------------------------------------------------------------------- +Sat Nov 30 08:16:02 UTC 2013 - arvidjaar@gmail.com + +- Add patch + 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch + Make sure emergency shell is not killed by attempt to start another unit + (bnc#852021). Backported from d420282b28f50720e233ccb1c02547c562195653. +- Add patch + make-emergency.service-conflict-with-syslog.socket.patch + Previous patch did not fix problem if syslog connection request came + after emergency shell was already started. So forcibly stop syslog.socket + when starting emergency.service. (bnc#852232) + ------------------------------------------------------------------- Thu Nov 28 10:25:58 UTC 2013 - lbsousajr@gmail.com diff --git a/systemd.spec b/systemd.spec index 625998a..1b4aa07 100644 --- a/systemd.spec +++ b/systemd.spec @@ -252,6 +252,10 @@ Patch80: 0001-analyze-set-text-on-side-with-most-space.patch Patch81: 0001-logind-garbage-collect-stale-users.patch # PATCH-FIX-UPSTREAM analyze-fix-crash-in-command-line-parsing.patch fcrozat@suse.com bnc#859365 -- Fix crash in systemd-analyze Patch82: analyze-fix-crash-in-command-line-parsing.patch +# PATCH-FIX-UPSTREAM 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch -- Prevent accidental kill of emergency shell (bnc#852021) +Patch83: 0001-core-replace-OnFailureIsolate-setting-by-a-more-gene.patch +# PATCH-FIX-OPENSUSE make-emergency.service-conflict-with-syslog.socket.patch (bnc#852232) +Patch84: make-emergency.service-conflict-with-syslog.socket.patch # udev patches # PATCH-FIX-OPENSUSE 1001-re-enable-by_path-links-for-ata-devices.patch @@ -554,6 +558,8 @@ cp %{SOURCE7} m4/ %patch80 -p1 %patch81 -p1 %patch82 -p1 +%patch83 -p1 +%patch84 -p1 # udev patches %patch1001 -p1