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