mirror of
https://github.com/systemd/systemd.git
synced 2024-11-23 18:23:32 +08:00
Merge pull request #1869 from poettering/kill-overridable
Remove support for RequiresOverridable= and RequisiteOverridable=
This commit is contained in:
commit
7152869f0a
21
TODO
21
TODO
@ -36,12 +36,6 @@ Features:
|
||||
* PID1: find a way how we can reload unit file configuration for
|
||||
specific units only, without reloading the whole of systemd
|
||||
|
||||
* For services: replace the default Requires=basic.target with After=basic.target + Requires=sysinit.target.
|
||||
|
||||
* drop "Overridable" dependency types
|
||||
|
||||
* document precise effect of DefaultDependencies=yes
|
||||
|
||||
* add an explicit parser for LimitNICE= and LimitRTPRIO= that verifies
|
||||
the specified range and generates sane error messages for incorrect
|
||||
specifications. Also, for LimitNICE= maybe introduce a syntax such
|
||||
@ -52,7 +46,7 @@ Features:
|
||||
|
||||
* when we detect that there are waiting jobs but no running jobs, do something
|
||||
|
||||
* push CPUAffinity also into the "cpuset" cgroup controller (only after the cpuset controller got ported to the unified hierarchy)
|
||||
* push CPUAffinity= also into the "cpuset" cgroup controller (only after the cpuset controller got ported to the unified hierarchy)
|
||||
|
||||
* add a concept of RemainAfterExit= to scope units
|
||||
|
||||
@ -673,8 +667,6 @@ Features:
|
||||
- add new command to systemctl: "systemctl system-reexec" which reexecs as many daemons as virtually possible
|
||||
- systemctl enable: fail if target to alias into does not exist? maybe show how many units are enabled afterwards?
|
||||
- systemctl: "Journal has been rotated since unit was started." message is misleading
|
||||
- support "systemctl stop foobar@.service" to stop all units matching a certain template
|
||||
- Something is wrong with symlink handling of "autovt@.service" in "systemctl list-unit-files"
|
||||
- better error message if you run systemctl without systemd running
|
||||
- systemctl status output should should include list of triggering units and their status
|
||||
|
||||
@ -689,7 +681,6 @@ Features:
|
||||
o DST changes
|
||||
- Support 2012-02~4 as syntax for specifying the fourth to last day of the month.
|
||||
- calendarspec: support value ranges with ".." notation. Example: 2013-4..8-1
|
||||
- when parsing calendar timestamps support the UTC timezone (even if we will not support arbitrary timezone specs, support UTC itself certainly makes sense), also support syntaxes such as +0200
|
||||
- Modulate timer frequency based on battery state
|
||||
|
||||
* add libsystemd-password or so to query passwords during boot using the password agent logic
|
||||
@ -749,8 +740,6 @@ Features:
|
||||
|
||||
* introduce Type=pid-file
|
||||
|
||||
* change Requires=basic.target to RequisiteOverride=basic.target
|
||||
|
||||
* when breaking cycles drop sysv services first, then services from /run, then from /etc, then from /usr
|
||||
|
||||
* ExecOnFailure=/usr/bin/foo
|
||||
@ -769,8 +758,6 @@ Features:
|
||||
|
||||
* add option to sockets to avoid activation. Instead just drop packets/connections, see http://cyberelk.net/tim/2012/02/15/portreserve-systemd-solution/
|
||||
|
||||
* default unix qlen is too small (10). bump sysctl? add sockopt?
|
||||
|
||||
* save coredump in Windows/Mozilla minidump format
|
||||
|
||||
* support crash reporting operation modes (https://live.gnome.org/GnomeOS/Design/Whiteboards/ProblemReporting)
|
||||
@ -918,8 +905,6 @@ External:
|
||||
|
||||
* drop accountsservice's StandardOutput=syslog and Type=dbus fields
|
||||
|
||||
* dbus upstream still refers to dbus.target and should not
|
||||
|
||||
* dbus: in fedora, make /var/lib/dbus/machine-id a symlink to /etc/machine-id
|
||||
|
||||
* /usr/bin/service should actually show the new command line
|
||||
@ -954,7 +939,3 @@ Regularly:
|
||||
* use secure_getenv() instead of getenv() where appropriate
|
||||
|
||||
* link up selected blog stories from man pages and unit files Documentation= fields
|
||||
|
||||
Scheduled for removal or fixing:
|
||||
|
||||
* xxxOverridable dependencies (probably: fix)
|
||||
|
@ -179,7 +179,6 @@
|
||||
<command>list-dependencies</command>, i.e. follow
|
||||
dependencies of type <varname>WantedBy=</varname>,
|
||||
<varname>RequiredBy=</varname>,
|
||||
<varname>RequiredByOverridable=</varname>,
|
||||
<varname>PartOf=</varname>, <varname>BoundBy=</varname>,
|
||||
instead of <varname>Wants=</varname> and similar.
|
||||
</para>
|
||||
@ -932,9 +931,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
|
||||
<para>Shows units required and wanted by the specified
|
||||
unit. This recursively lists units following the
|
||||
<varname>Requires=</varname>,
|
||||
<varname>RequiresOverridable=</varname>,
|
||||
<varname>Requisite=</varname>,
|
||||
<varname>RequisiteOverridable=</varname>,
|
||||
<varname>ConsistsOf=</varname>,
|
||||
<varname>Wants=</varname>, <varname>BindsTo=</varname>
|
||||
dependencies. If no unit is specified,
|
||||
|
@ -226,9 +226,7 @@
|
||||
<varname>After=</varname> or <varname>Before=</varname> are
|
||||
shown. If <option>--require</option> is passed, only
|
||||
dependencies of type <varname>Requires=</varname>,
|
||||
<varname>RequiresOverridable=</varname>,
|
||||
<varname>Requisite=</varname>,
|
||||
<varname>RequisiteOverridable=</varname>,
|
||||
<varname>Wants=</varname> and <varname>Conflicts=</varname>
|
||||
are shown. If neither is passed, this shows dependencies of
|
||||
all these types.</para></listitem>
|
||||
|
@ -85,8 +85,7 @@
|
||||
<para>Unless <varname>DefaultDependencies=</varname> is set to
|
||||
<option>no</option>, target units will implicitly complement all
|
||||
configured dependencies of type <varname>Wants=</varname>,
|
||||
<varname>Requires=</varname>,
|
||||
<varname>RequiresOverridable=</varname> with dependencies of type
|
||||
<varname>Requires=</varname> with dependencies of type
|
||||
<varname>After=</varname>, unless an ordering dependency of any
|
||||
kind between the target and the respective other unit is already
|
||||
in place. Note that this behaviour is disabled if either unit has
|
||||
|
@ -452,27 +452,9 @@
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>RequiresOverridable=</varname></term>
|
||||
<term><varname>Requisite=</varname></term>
|
||||
|
||||
<listitem><para>Similar to <varname>Requires=</varname>.
|
||||
Dependencies listed in <varname>RequiresOverridable=</varname>
|
||||
which cannot be fulfilled or fail to start are ignored if the
|
||||
startup was explicitly requested by the user. If the start-up
|
||||
was pulled in indirectly by some dependency or automatic
|
||||
start-up of units that is not requested by the user, this
|
||||
dependency must be fulfilled and otherwise the transaction
|
||||
fails. Hence, this option may be used to configure
|
||||
dependencies that are normally honored unless the user
|
||||
explicitly starts up the unit, in which case whether they
|
||||
failed or not is irrelevant.</para></listitem>
|
||||
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>Requisite=</varname></term>
|
||||
<term><varname>RequisiteOverridable=</varname></term>
|
||||
|
||||
<listitem><para>Similar to <varname>Requires=</varname> and
|
||||
<varname>RequiresOverridable=</varname>, respectively.
|
||||
However, if the units listed here are not started already,
|
||||
they will not be started and the transaction will fail
|
||||
immediately. </para></listitem>
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "analyze-verify.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-util.h"
|
||||
#include "log.h"
|
||||
#include "manager.h"
|
||||
@ -164,7 +165,6 @@ static int verify_documentation(Unit *u, bool check_man) {
|
||||
|
||||
static int verify_unit(Unit *u, bool check_man) {
|
||||
_cleanup_bus_error_free_ sd_bus_error err = SD_BUS_ERROR_NULL;
|
||||
Job *j;
|
||||
int r, k;
|
||||
|
||||
assert(u);
|
||||
@ -173,11 +173,9 @@ static int verify_unit(Unit *u, bool check_man) {
|
||||
unit_dump(u, stdout, "\t");
|
||||
|
||||
log_unit_debug(u, "Creating %s/start job", u->id);
|
||||
r = manager_add_job(u->manager, JOB_START, u, JOB_REPLACE, false, &err, &j);
|
||||
if (sd_bus_error_is_set(&err))
|
||||
log_unit_error(u, "Error: %s: %s", err.name, err.message);
|
||||
r = manager_add_job(u->manager, JOB_START, u, JOB_REPLACE, &err, NULL);
|
||||
if (r < 0)
|
||||
log_unit_error_errno(u, r, "Failed to create %s/start: %m", u->id);
|
||||
log_unit_error_errno(u, r, "Failed to create %s/start: %s", u->id, bus_error_message(&err, r));
|
||||
|
||||
k = verify_socket(u);
|
||||
if (k < 0 && r == 0)
|
||||
|
@ -1074,12 +1074,6 @@ static int graph_one(sd_bus *bus, const UnitInfo *u, char *patterns[], char *fro
|
||||
|
||||
if (arg_dot == DEP_REQUIRE ||arg_dot == DEP_ALL) {
|
||||
r = graph_one_property(bus, u, "Requires", "black", patterns, from_patterns, to_patterns);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = graph_one_property(bus, u, "RequiresOverridable", "black", patterns, from_patterns, to_patterns);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = graph_one_property(bus, u, "RequisiteOverridable", "darkblue", patterns, from_patterns, to_patterns);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = graph_one_property(bus, u, "Wants", "grey66", patterns, from_patterns, to_patterns);
|
||||
|
@ -1000,16 +1000,12 @@ DEFINE_STRING_TABLE_LOOKUP(timer_state, TimerState);
|
||||
|
||||
static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
|
||||
[UNIT_REQUIRES] = "Requires",
|
||||
[UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
|
||||
[UNIT_REQUISITE] = "Requisite",
|
||||
[UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
|
||||
[UNIT_WANTS] = "Wants",
|
||||
[UNIT_BINDS_TO] = "BindsTo",
|
||||
[UNIT_PART_OF] = "PartOf",
|
||||
[UNIT_REQUIRED_BY] = "RequiredBy",
|
||||
[UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
|
||||
[UNIT_REQUISITE_OF] = "RequisiteOf",
|
||||
[UNIT_REQUISITE_OF_OVERRIDABLE] = "RequisiteOfOverridable",
|
||||
[UNIT_WANTED_BY] = "WantedBy",
|
||||
[UNIT_BOUND_BY] = "BoundBy",
|
||||
[UNIT_CONSISTS_OF] = "ConsistsOf",
|
||||
|
@ -218,18 +218,14 @@ typedef enum TimerState {
|
||||
typedef enum UnitDependency {
|
||||
/* Positive dependencies */
|
||||
UNIT_REQUIRES,
|
||||
UNIT_REQUIRES_OVERRIDABLE,
|
||||
UNIT_REQUISITE,
|
||||
UNIT_REQUISITE_OVERRIDABLE,
|
||||
UNIT_WANTS,
|
||||
UNIT_BINDS_TO,
|
||||
UNIT_PART_OF,
|
||||
|
||||
/* Inverse of the above */
|
||||
UNIT_REQUIRED_BY, /* inverse of 'requires' is 'required_by' */
|
||||
UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' is 'required_by_overridable' */
|
||||
UNIT_REQUISITE_OF, /* inverse of 'requisite' is 'requisite_of' */
|
||||
UNIT_REQUISITE_OF_OVERRIDABLE,/* inverse of 'requisite_overridable' is 'requisite_of_overridable' */
|
||||
UNIT_WANTED_BY, /* inverse of 'wants' */
|
||||
UNIT_BOUND_BY, /* inverse of 'binds_to' */
|
||||
UNIT_CONSISTS_OF, /* inverse of 'part_of' */
|
||||
|
@ -728,8 +728,7 @@ static void automount_enter_runnning(Automount *a) {
|
||||
if (!S_ISDIR(st.st_mode) || st.st_dev != a->dev_id)
|
||||
log_unit_info(UNIT(a), "Automount point already active?");
|
||||
else {
|
||||
r = manager_add_job(UNIT(a)->manager, JOB_START, UNIT_TRIGGER(UNIT(a)),
|
||||
JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(a)->manager, JOB_START, UNIT_TRIGGER(UNIT(a)), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0) {
|
||||
log_unit_warning(UNIT(a), "Failed to queue mount startup job: %s", bus_error_message(&error, r));
|
||||
goto fail;
|
||||
@ -974,7 +973,7 @@ static int automount_dispatch_io(sd_event_source *s, int fd, uint32_t events, vo
|
||||
break;
|
||||
}
|
||||
|
||||
r = manager_add_job(UNIT(a)->manager, JOB_STOP, UNIT_TRIGGER(UNIT(a)), JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(a)->manager, JOB_STOP, UNIT_TRIGGER(UNIT(a)), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0) {
|
||||
log_unit_warning(UNIT(a), "Failed to queue umount startup job: %s", bus_error_message(&error, r));
|
||||
goto fail;
|
||||
|
@ -596,7 +596,7 @@ static void busname_enter_running(BusName *n) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
r = manager_add_job(UNIT(n)->manager, JOB_START, UNIT_DEREF(n->service), JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(n)->manager, JOB_START, UNIT_DEREF(n->service), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
@ -118,6 +118,22 @@ static int property_get_dependencies(
|
||||
return sd_bus_message_close_container(reply);
|
||||
}
|
||||
|
||||
static int property_get_obsolete_dependencies(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
assert(bus);
|
||||
assert(reply);
|
||||
|
||||
/* For dependency types we don't support anymore always return an empty array */
|
||||
return sd_bus_message_append(reply, "as", 0);
|
||||
}
|
||||
|
||||
static int property_get_description(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
@ -621,16 +637,12 @@ const sd_bus_vtable bus_unit_vtable[] = {
|
||||
SD_BUS_PROPERTY("Names", "as", property_get_names, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Following", "s", property_get_following, 0, 0),
|
||||
SD_BUS_PROPERTY("Requires", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRES]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequiresOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRES_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Requisite", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequisiteOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Wants", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_WANTS]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("BindsTo", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_BINDS_TO]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("PartOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_PART_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequiredBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRED_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequiredByOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUIRED_BY_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequisiteOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequisiteOfOverridable", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_REQUISITE_OF_OVERRIDABLE]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("WantedBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_WANTED_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("BoundBy", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_BOUND_BY]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("ConsistsOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_CONSISTS_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
@ -644,6 +656,10 @@ const sd_bus_vtable bus_unit_vtable[] = {
|
||||
SD_BUS_PROPERTY("PropagatesReloadTo", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_PROPAGATES_RELOAD_TO]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("ReloadPropagatedFrom", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_RELOAD_PROPAGATED_FROM]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("JoinsNamespaceOf", "as", property_get_dependencies, offsetof(Unit, dependencies[UNIT_JOINS_NAMESPACE_OF]), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("RequiresOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
|
||||
SD_BUS_PROPERTY("RequisiteOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
|
||||
SD_BUS_PROPERTY("RequiredByOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
|
||||
SD_BUS_PROPERTY("RequisiteOfOverridable", "as", property_get_obsolete_dependencies, 0, SD_BUS_VTABLE_HIDDEN),
|
||||
SD_BUS_PROPERTY("RequiresMountsFor", "as", NULL, offsetof(Unit, requires_mounts_for), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Documentation", "as", NULL, offsetof(Unit, documentation), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Description", "s", property_get_description, 0, SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
@ -992,7 +1008,7 @@ int bus_unit_queue_job(
|
||||
(type == JOB_RELOAD_OR_START && job_type_collapse(type, u) == JOB_START && u->refuse_manual_start))
|
||||
return sd_bus_error_setf(error, BUS_ERROR_ONLY_BY_DEPENDENCY, "Operation refused, unit %s may be requested by dependency only.", u->id);
|
||||
|
||||
r = manager_add_job(u->manager, type, u, mode, true, error, &j);
|
||||
r = manager_add_job(u->manager, type, u, mode, error, &j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -1108,9 +1124,15 @@ static int bus_unit_set_transient_property(
|
||||
UnitDependency d;
|
||||
const char *other;
|
||||
|
||||
d = unit_dependency_from_string(name);
|
||||
if (d < 0)
|
||||
return -EINVAL;
|
||||
if (streq(name, "RequiresOverridable"))
|
||||
d = UNIT_REQUIRES; /* redirect for obsolete unit dependency type */
|
||||
else if (streq(name, "RequisiteOverridable"))
|
||||
d = UNIT_REQUISITE; /* same here */
|
||||
else {
|
||||
d = unit_dependency_from_string(name);
|
||||
if (d < 0)
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid unit dependency: %s", name);
|
||||
}
|
||||
|
||||
r = sd_bus_message_enter_container(message, 'a', "s");
|
||||
if (r < 0)
|
||||
|
@ -177,7 +177,7 @@ static int signal_activation_request(sd_bus_message *message, void *userdata, sd
|
||||
goto failed;
|
||||
}
|
||||
|
||||
r = manager_add_job(m, JOB_START, u, JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(m, JOB_START, u, JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto failed;
|
||||
|
||||
|
@ -42,8 +42,6 @@ int failure_action(
|
||||
FailureAction action,
|
||||
const char *reboot_arg) {
|
||||
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(action >= 0);
|
||||
assert(action < _FAILURE_ACTION_MAX);
|
||||
@ -62,18 +60,13 @@ int failure_action(
|
||||
|
||||
switch (action) {
|
||||
|
||||
case FAILURE_ACTION_REBOOT: {
|
||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
case FAILURE_ACTION_REBOOT:
|
||||
log_and_status(m, "Rebooting as result of failure.");
|
||||
|
||||
update_reboot_param_file(reboot_arg);
|
||||
r = manager_add_job_by_name(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE, true, &error, NULL);
|
||||
if (r < 0)
|
||||
log_error("Failed to reboot: %s.", bus_error_message(&error, r));
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE, NULL);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case FAILURE_ACTION_REBOOT_FORCE:
|
||||
log_and_status(m, "Forcibly rebooting as result of failure.");
|
||||
@ -96,17 +89,10 @@ int failure_action(
|
||||
reboot(RB_AUTOBOOT);
|
||||
break;
|
||||
|
||||
case FAILURE_ACTION_POWEROFF: {
|
||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
case FAILURE_ACTION_POWEROFF:
|
||||
log_and_status(m, "Powering off as result of failure.");
|
||||
|
||||
r = manager_add_job_by_name(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE, true, &error, NULL);
|
||||
if (r < 0)
|
||||
log_error("Failed to poweroff: %s.", bus_error_message(&error, r));
|
||||
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case FAILURE_ACTION_POWEROFF_FORCE:
|
||||
log_and_status(m, "Forcibly powering off as result of failure.");
|
||||
|
@ -175,7 +175,6 @@ static void job_merge_into_installed(Job *j, Job *other) {
|
||||
else
|
||||
assert(other->type == JOB_NOP);
|
||||
|
||||
j->override = j->override || other->override;
|
||||
j->irreversible = j->irreversible || other->irreversible;
|
||||
j->ignore_order = j->ignore_order || other->ignore_order;
|
||||
}
|
||||
@ -307,12 +306,10 @@ void job_dump(Job *j, FILE*f, const char *prefix) {
|
||||
"%s-> Job %u:\n"
|
||||
"%s\tAction: %s -> %s\n"
|
||||
"%s\tState: %s\n"
|
||||
"%s\tForced: %s\n"
|
||||
"%s\tIrreversible: %s\n",
|
||||
prefix, j->id,
|
||||
prefix, j->unit->id, job_type_to_string(j->type),
|
||||
prefix, job_state_to_string(j->state),
|
||||
prefix, yes_no(j->override),
|
||||
prefix, yes_no(j->irreversible));
|
||||
}
|
||||
|
||||
@ -841,8 +838,6 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
|
||||
job_fail_dependencies(u, UNIT_REQUIRED_BY);
|
||||
job_fail_dependencies(u, UNIT_REQUISITE_OF);
|
||||
job_fail_dependencies(u, UNIT_BOUND_BY);
|
||||
job_fail_dependencies(u, UNIT_REQUIRED_BY_OVERRIDABLE);
|
||||
job_fail_dependencies(u, UNIT_REQUISITE_OF_OVERRIDABLE);
|
||||
} else if (t == JOB_STOP)
|
||||
job_fail_dependencies(u, UNIT_CONFLICTED_BY);
|
||||
}
|
||||
@ -967,7 +962,6 @@ int job_serialize(Job *j, FILE *f, FDSet *fds) {
|
||||
fprintf(f, "job-id=%u\n", j->id);
|
||||
fprintf(f, "job-type=%s\n", job_type_to_string(j->type));
|
||||
fprintf(f, "job-state=%s\n", job_state_to_string(j->state));
|
||||
fprintf(f, "job-override=%s\n", yes_no(j->override));
|
||||
fprintf(f, "job-irreversible=%s\n", yes_no(j->irreversible));
|
||||
fprintf(f, "job-sent-dbus-new-signal=%s\n", yes_no(j->sent_dbus_new_signal));
|
||||
fprintf(f, "job-ignore-order=%s\n", yes_no(j->ignore_order));
|
||||
@ -1035,15 +1029,6 @@ int job_deserialize(Job *j, FILE *f, FDSet *fds) {
|
||||
else
|
||||
job_set_state(j, s);
|
||||
|
||||
} else if (streq(l, "job-override")) {
|
||||
int b;
|
||||
|
||||
b = parse_boolean(v);
|
||||
if (b < 0)
|
||||
log_debug("Failed to parse job override flag %s", v);
|
||||
else
|
||||
j->override = j->override || b;
|
||||
|
||||
} else if (streq(l, "job-irreversible")) {
|
||||
int b;
|
||||
|
||||
|
@ -162,7 +162,6 @@ struct Job {
|
||||
bool installed:1;
|
||||
bool in_run_queue:1;
|
||||
bool matters_to_anchor:1;
|
||||
bool override:1;
|
||||
bool in_dbus_queue:1;
|
||||
bool sent_dbus_new_signal:1;
|
||||
bool ignore_order:1;
|
||||
|
@ -134,9 +134,7 @@ Unit.Description, config_parse_unit_string_printf, 0,
|
||||
Unit.Documentation, config_parse_documentation, 0, offsetof(Unit, documentation)
|
||||
Unit.SourcePath, config_parse_path, 0, offsetof(Unit, source_path)
|
||||
Unit.Requires, config_parse_unit_deps, UNIT_REQUIRES, 0
|
||||
Unit.RequiresOverridable, config_parse_unit_deps, UNIT_REQUIRES_OVERRIDABLE, 0
|
||||
Unit.Requisite, config_parse_unit_deps, UNIT_REQUISITE, 0
|
||||
Unit.RequisiteOverridable, config_parse_unit_deps, UNIT_REQUISITE_OVERRIDABLE, 0
|
||||
Unit.Wants, config_parse_unit_deps, UNIT_WANTS, 0
|
||||
Unit.BindsTo, config_parse_unit_deps, UNIT_BINDS_TO, 0
|
||||
Unit.BindTo, config_parse_unit_deps, UNIT_BINDS_TO, 0
|
||||
@ -150,6 +148,8 @@ Unit.ReloadPropagatedFrom, config_parse_unit_deps, UNIT_RELOAD
|
||||
Unit.PropagateReloadFrom, config_parse_unit_deps, UNIT_RELOAD_PROPAGATED_FROM, 0
|
||||
Unit.PartOf, config_parse_unit_deps, UNIT_PART_OF, 0
|
||||
Unit.JoinsNamespaceOf, config_parse_unit_deps, UNIT_JOINS_NAMESPACE_OF, 0
|
||||
Unit.RequiresOverridable, config_parse_obsolete_unit_deps, UNIT_REQUIRES, 0
|
||||
Unit.RequisiteOverridable, config_parse_obsolete_unit_deps, UNIT_REQUISITE, 0
|
||||
Unit.RequiresMountsFor, config_parse_unit_requires_mounts_for, 0, 0
|
||||
Unit.StopWhenUnneeded, config_parse_bool, 0, offsetof(Unit, stop_when_unneeded)
|
||||
Unit.RefuseManualStart, config_parse_bool, 0, offsetof(Unit, refuse_manual_start)
|
||||
|
@ -98,16 +98,17 @@ int config_parse_warn_compat(
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_unit_deps(const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
int config_parse_unit_deps(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
|
||||
UnitDependency d = ltype;
|
||||
Unit *u = userdata;
|
||||
@ -146,6 +147,24 @@ int config_parse_unit_deps(const char *unit,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_obsolete_unit_deps(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"Unit dependency type %s= is obsolete, replacing by %s=, please update your unit file", lvalue, unit_dependency_to_string(ltype));
|
||||
|
||||
return config_parse_unit_deps(unit, filename, line, section, section_line, lvalue, ltype, rvalue, data, userdata);
|
||||
}
|
||||
|
||||
int config_parse_unit_string_printf(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
|
@ -31,6 +31,7 @@ void unit_dump_config_items(FILE *f);
|
||||
|
||||
int config_parse_warn_compat(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
int config_parse_unit_deps(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
int config_parse_obsolete_unit_deps(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
int config_parse_unit_string_printf(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
int config_parse_unit_strv_printf(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
int config_parse_unit_path_printf(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||
|
@ -1744,11 +1744,13 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
}
|
||||
|
||||
r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, false, &error, &default_unit_job);
|
||||
r = manager_add_job(m, JOB_START, target, JOB_ISOLATE, &error, &default_unit_job);
|
||||
if (r == -EPERM) {
|
||||
log_debug("Default target could not be isolated, starting instead: %s", bus_error_message(&error, r));
|
||||
|
||||
r = manager_add_job(m, JOB_START, target, JOB_REPLACE, false, &error, &default_unit_job);
|
||||
sd_bus_error_free(&error);
|
||||
|
||||
r = manager_add_job(m, JOB_START, target, JOB_REPLACE, &error, &default_unit_job);
|
||||
if (r < 0) {
|
||||
log_emergency("Failed to start default target: %s", bus_error_message(&error, r));
|
||||
error_message = "Failed to start default target";
|
||||
|
@ -1183,7 +1183,7 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
|
||||
return r;
|
||||
}
|
||||
|
||||
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
|
||||
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, sd_bus_error *e, Job **_ret) {
|
||||
int r;
|
||||
Transaction *tr;
|
||||
|
||||
@ -1206,7 +1206,7 @@ int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool ove
|
||||
if (!tr)
|
||||
return -ENOMEM;
|
||||
|
||||
r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
|
||||
r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, false,
|
||||
mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
|
||||
mode == JOB_IGNORE_DEPENDENCIES, e);
|
||||
if (r < 0)
|
||||
@ -1238,7 +1238,7 @@ tr_abort:
|
||||
return r;
|
||||
}
|
||||
|
||||
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
|
||||
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **ret) {
|
||||
Unit *unit;
|
||||
int r;
|
||||
|
||||
@ -1251,7 +1251,23 @@ int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return manager_add_job(m, type, unit, mode, override, e, _ret);
|
||||
return manager_add_job(m, type, unit, mode, e, ret);
|
||||
}
|
||||
|
||||
int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Job **ret) {
|
||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(type < _JOB_TYPE_MAX);
|
||||
assert(name);
|
||||
assert(mode < _JOB_MODE_MAX);
|
||||
|
||||
r = manager_add_job_by_name(m, type, name, mode, &error, ret);
|
||||
if (r < 0)
|
||||
return log_warning_errno(r, "Failed to enqueue %s job for %s: %s", job_mode_to_string(mode), name, bus_error_message(&error, r));
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
Job *manager_get_job(Manager *m, uint32_t id) {
|
||||
@ -1687,7 +1703,7 @@ static int manager_start_target(Manager *m, const char *name, JobMode mode) {
|
||||
|
||||
log_debug("Activating special unit %s", name);
|
||||
|
||||
r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
|
||||
r = manager_add_job_by_name(m, JOB_START, name, mode, &error, NULL);
|
||||
if (r < 0)
|
||||
log_error("Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
|
||||
|
||||
|
@ -326,8 +326,9 @@ int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd
|
||||
int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
|
||||
int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
|
||||
|
||||
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
|
||||
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool force, sd_bus_error *e, Job **_ret);
|
||||
int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, sd_bus_error *e, Job **_ret);
|
||||
int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **_ret);
|
||||
int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Job **ret);
|
||||
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
|
||||
|
@ -474,8 +474,7 @@ static void path_enter_running(Path *p) {
|
||||
if (unit_stop_pending(UNIT(p)))
|
||||
return;
|
||||
|
||||
r = manager_add_job(UNIT(p)->manager, JOB_START, UNIT_TRIGGER(UNIT(p)),
|
||||
JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(p)->manager, JOB_START, UNIT_TRIGGER(UNIT(p)), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
|
@ -1849,7 +1849,7 @@ static void service_enter_restart(Service *s) {
|
||||
* restarted. We use JOB_RESTART (instead of the more obvious
|
||||
* JOB_START) here so that those dependency jobs will be added
|
||||
* as well. */
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_RESTART, UNIT(s), JOB_FAIL, false, &error, NULL);
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_RESTART, UNIT(s), JOB_FAIL, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
|
@ -1921,7 +1921,7 @@ static void socket_enter_running(Socket *s, int cfd) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT_DEREF(s->service), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
@ -1979,7 +1979,7 @@ static void socket_enter_running(Socket *s, int cfd) {
|
||||
cfd = -1;
|
||||
s->n_connections ++;
|
||||
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
|
@ -52,9 +52,7 @@ static int target_add_default_dependencies(Target *t) {
|
||||
|
||||
static const UnitDependency deps[] = {
|
||||
UNIT_REQUIRES,
|
||||
UNIT_REQUIRES_OVERRIDABLE,
|
||||
UNIT_REQUISITE,
|
||||
UNIT_REQUISITE_OVERRIDABLE,
|
||||
UNIT_WANTS,
|
||||
UNIT_BINDS_TO,
|
||||
UNIT_PART_OF
|
||||
|
@ -511,8 +511,7 @@ static void timer_enter_running(Timer *t) {
|
||||
if (unit_stop_pending(UNIT(t)))
|
||||
return;
|
||||
|
||||
r = manager_add_job(UNIT(t)->manager, JOB_START, UNIT_TRIGGER(UNIT(t)),
|
||||
JOB_REPLACE, true, &error, NULL);
|
||||
r = manager_add_job(UNIT(t)->manager, JOB_START, UNIT_TRIGGER(UNIT(t)), JOB_REPLACE, &error, NULL);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
|
@ -99,9 +99,7 @@ static void transaction_merge_and_delete_job(Transaction *tr, Job *j, Job *other
|
||||
|
||||
j->type = t;
|
||||
j->state = JOB_WAITING;
|
||||
j->override = j->override || other->override;
|
||||
j->irreversible = j->irreversible || other->irreversible;
|
||||
|
||||
j->matters_to_anchor = j->matters_to_anchor || other->matters_to_anchor;
|
||||
|
||||
/* Patch us in as new owner of the JobDependency objects */
|
||||
@ -745,7 +743,7 @@ int transaction_activate(Transaction *tr, Manager *m, JobMode mode, sd_bus_error
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Job* transaction_add_one_job(Transaction *tr, JobType type, Unit *unit, bool override, bool *is_new) {
|
||||
static Job* transaction_add_one_job(Transaction *tr, JobType type, Unit *unit, bool *is_new) {
|
||||
Job *j, *f;
|
||||
|
||||
assert(tr);
|
||||
@ -774,7 +772,6 @@ static Job* transaction_add_one_job(Transaction *tr, JobType type, Unit *unit, b
|
||||
j->generation = 0;
|
||||
j->marker = NULL;
|
||||
j->matters_to_anchor = false;
|
||||
j->override = override;
|
||||
j->irreversible = tr->irreversible;
|
||||
|
||||
LIST_PREPEND(transaction, f, j);
|
||||
@ -833,7 +830,6 @@ int transaction_add_job_and_dependencies(
|
||||
Unit *unit,
|
||||
Job *by,
|
||||
bool matters,
|
||||
bool override,
|
||||
bool conflicts,
|
||||
bool ignore_requirements,
|
||||
bool ignore_order,
|
||||
@ -895,7 +891,7 @@ int transaction_add_job_and_dependencies(
|
||||
|
||||
|
||||
/* First add the job. */
|
||||
ret = transaction_add_one_job(tr, type, unit, override, &is_new);
|
||||
ret = transaction_add_one_job(tr, type, unit, &is_new);
|
||||
if (!ret)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -918,7 +914,7 @@ int transaction_add_job_and_dependencies(
|
||||
* add all dependencies of everybody following. */
|
||||
if (unit_following_set(ret->unit, &following) > 0) {
|
||||
SET_FOREACH(dep, following, i) {
|
||||
r = transaction_add_job_and_dependencies(tr, type, dep, ret, false, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, type, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_warning(dep, "Cannot add dependency job for, ignoring: %s", bus_error_message(e, r));
|
||||
sd_bus_error_free(e);
|
||||
@ -931,7 +927,7 @@ int transaction_add_job_and_dependencies(
|
||||
/* Finally, recursively add in all dependencies. */
|
||||
if (type == JOB_START || type == JOB_RESTART) {
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -941,7 +937,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_BINDS_TO], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -950,19 +946,8 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES_OVERRIDABLE], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, !override, override, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_full(dep,
|
||||
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
|
||||
"Cannot add dependency job, ignoring: %s",
|
||||
bus_error_message(e, r));
|
||||
sd_bus_error_free(e);
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_WANTS], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, false, false, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_START, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_full(dep,
|
||||
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
|
||||
@ -973,7 +958,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_VERIFY_ACTIVE, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -982,19 +967,8 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE_OVERRIDABLE], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_full(dep,
|
||||
r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, r,
|
||||
"Cannot add dependency job, ignoring: %s",
|
||||
bus_error_message(e, r));
|
||||
sd_bus_error_free(e);
|
||||
}
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTS], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, true, override, true, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, true, true, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1004,7 +978,7 @@ int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTED_BY], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, false, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_warning(dep,
|
||||
"Cannot add dependency job, ignoring: %s",
|
||||
@ -1039,7 +1013,7 @@ int transaction_add_job_and_dependencies(
|
||||
if (nt == JOB_NOP)
|
||||
continue;
|
||||
|
||||
r = transaction_add_job_and_dependencies(tr, nt, dep, ret, true, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, nt, dep, ret, true, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1052,7 +1026,7 @@ int transaction_add_job_and_dependencies(
|
||||
if (type == JOB_RELOAD) {
|
||||
|
||||
SET_FOREACH(dep, ret->unit->dependencies[UNIT_PROPAGATES_RELOAD_TO], i) {
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_RELOAD, dep, ret, false, override, false, false, ignore_order, e);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_RELOAD, dep, ret, false, false, false, ignore_order, e);
|
||||
if (r < 0) {
|
||||
log_unit_warning(dep,
|
||||
"Cannot add dependency reload job, ignoring: %s",
|
||||
@ -1097,7 +1071,7 @@ int transaction_add_isolate_jobs(Transaction *tr, Manager *m) {
|
||||
if (hashmap_get(tr->jobs, u))
|
||||
continue;
|
||||
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, u, tr->anchor_job, true, false, false, false, false, NULL);
|
||||
r = transaction_add_job_and_dependencies(tr, JOB_STOP, u, tr->anchor_job, true, false, false, false, NULL);
|
||||
if (r < 0)
|
||||
log_unit_warning_errno(u, r, "Cannot add isolate job, ignoring: %m");
|
||||
}
|
||||
|
@ -44,7 +44,6 @@ int transaction_add_job_and_dependencies(
|
||||
Unit *unit,
|
||||
Job *by,
|
||||
bool matters,
|
||||
bool override,
|
||||
bool conflicts,
|
||||
bool ignore_requirements,
|
||||
bool ignore_order,
|
||||
|
@ -1101,9 +1101,7 @@ static int unit_add_target_dependencies(Unit *u) {
|
||||
|
||||
static const UnitDependency deps[] = {
|
||||
UNIT_REQUIRED_BY,
|
||||
UNIT_REQUIRED_BY_OVERRIDABLE,
|
||||
UNIT_REQUISITE_OF,
|
||||
UNIT_REQUISITE_OF_OVERRIDABLE,
|
||||
UNIT_WANTED_BY,
|
||||
UNIT_BOUND_BY
|
||||
};
|
||||
@ -1605,11 +1603,11 @@ bool unit_can_reload(Unit *u) {
|
||||
|
||||
static void unit_check_unneeded(Unit *u) {
|
||||
|
||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
static const UnitDependency needed_dependencies[] = {
|
||||
UNIT_REQUIRED_BY,
|
||||
UNIT_REQUIRED_BY_OVERRIDABLE,
|
||||
UNIT_REQUISITE_OF,
|
||||
UNIT_REQUISITE_OF_OVERRIDABLE,
|
||||
UNIT_WANTED_BY,
|
||||
UNIT_BOUND_BY,
|
||||
};
|
||||
@ -1646,12 +1644,13 @@ static void unit_check_unneeded(Unit *u) {
|
||||
log_unit_info(u, "Unit not needed anymore. Stopping.");
|
||||
|
||||
/* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
|
||||
r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
|
||||
r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
|
||||
if (r < 0)
|
||||
log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %m");
|
||||
log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
|
||||
}
|
||||
|
||||
static void unit_check_binds_to(Unit *u) {
|
||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
bool stop = false;
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
@ -1691,9 +1690,9 @@ static void unit_check_binds_to(Unit *u) {
|
||||
log_unit_info(u, "Unit is bound to inactive unit %s. Stopping, too.", other->id);
|
||||
|
||||
/* A unit we need to run is gone. Sniff. Let's stop this. */
|
||||
r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
|
||||
r = manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, &error, NULL);
|
||||
if (r < 0)
|
||||
log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %m");
|
||||
log_unit_warning_errno(u, r, "Failed to enqueue stop job, ignoring: %s", bus_error_message(&error, r));
|
||||
}
|
||||
|
||||
static void retroactively_start_dependencies(Unit *u) {
|
||||
@ -1706,30 +1705,25 @@ static void retroactively_start_dependencies(Unit *u) {
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
|
||||
if (!set_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
|
||||
|
||||
SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
|
||||
if (!set_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
|
||||
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
|
||||
if (!set_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, NULL, NULL);
|
||||
|
||||
SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
|
||||
if (!set_get(u->dependencies[UNIT_AFTER], other) &&
|
||||
!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_START, other, JOB_FAIL, NULL, NULL);
|
||||
|
||||
SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
|
||||
|
||||
SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
|
||||
}
|
||||
|
||||
static void retroactively_stop_dependencies(Unit *u) {
|
||||
@ -1742,7 +1736,7 @@ static void retroactively_stop_dependencies(Unit *u) {
|
||||
/* Pull down units which are bound to us recursively if enabled */
|
||||
SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
|
||||
manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, NULL, NULL);
|
||||
}
|
||||
|
||||
static void check_unneeded_dependencies(Unit *u) {
|
||||
@ -1756,18 +1750,12 @@ static void check_unneeded_dependencies(Unit *u) {
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
|
||||
if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
|
||||
unit_check_unneeded(other);
|
||||
@ -1787,7 +1775,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_job_mode, true, NULL, NULL);
|
||||
r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
|
||||
if (r < 0)
|
||||
log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
|
||||
}
|
||||
@ -2135,16 +2123,12 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen
|
||||
|
||||
static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
|
||||
[UNIT_REQUIRES] = UNIT_REQUIRED_BY,
|
||||
[UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
|
||||
[UNIT_WANTS] = UNIT_WANTED_BY,
|
||||
[UNIT_REQUISITE] = UNIT_REQUISITE_OF,
|
||||
[UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUISITE_OF_OVERRIDABLE,
|
||||
[UNIT_BINDS_TO] = UNIT_BOUND_BY,
|
||||
[UNIT_PART_OF] = UNIT_CONSISTS_OF,
|
||||
[UNIT_REQUIRED_BY] = UNIT_REQUIRES,
|
||||
[UNIT_REQUIRED_BY_OVERRIDABLE] = UNIT_REQUIRES_OVERRIDABLE,
|
||||
[UNIT_REQUISITE_OF] = UNIT_REQUISITE,
|
||||
[UNIT_REQUISITE_OF_OVERRIDABLE] = UNIT_REQUISITE_OVERRIDABLE,
|
||||
[UNIT_WANTED_BY] = UNIT_WANTS,
|
||||
[UNIT_BOUND_BY] = UNIT_BINDS_TO,
|
||||
[UNIT_CONSISTS_OF] = UNIT_PART_OF,
|
||||
|
@ -142,7 +142,7 @@ int generator_write_fsck_deps(
|
||||
}
|
||||
|
||||
fprintf(f,
|
||||
"RequiresOverridable=%1$s\n"
|
||||
"Requires=%1$s\n"
|
||||
"After=%1$s\n",
|
||||
fsck);
|
||||
}
|
||||
|
@ -1503,16 +1503,12 @@ static int list_dependencies_get_dependencies(sd_bus *bus, const char *name, cha
|
||||
|
||||
static const char *dependencies[_DEPENDENCY_MAX] = {
|
||||
[DEPENDENCY_FORWARD] = "Requires\0"
|
||||
"RequiresOverridable\0"
|
||||
"Requisite\0"
|
||||
"RequisiteOverridable\0"
|
||||
"Wants\0"
|
||||
"ConsistsOf\0"
|
||||
"BindsTo\0",
|
||||
[DEPENDENCY_REVERSE] = "RequiredBy\0"
|
||||
"RequiredByOverridable\0"
|
||||
"RequisiteOf\0"
|
||||
"RequisiteOfOverridable\0"
|
||||
"WantedBy\0"
|
||||
"PartOf\0"
|
||||
"BoundBy\0",
|
||||
|
@ -52,7 +52,7 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test1: (Trivial)\n");
|
||||
r = manager_add_job(m, JOB_START, c, JOB_REPLACE, false, &err, &j);
|
||||
r = manager_add_job(m, JOB_START, c, JOB_REPLACE, &err, &j);
|
||||
if (sd_bus_error_is_set(&err))
|
||||
log_error("error: %s: %s", err.name, err.message);
|
||||
assert_se(r == 0);
|
||||
@ -65,15 +65,15 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test2: (Cyclic Order, Unfixable)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, d, JOB_REPLACE, false, NULL, &j) == -EDEADLK);
|
||||
assert_se(manager_add_job(m, JOB_START, d, JOB_REPLACE, NULL, &j) == -EDEADLK);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test3: (Cyclic Order, Fixable, Garbage Collector)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_REPLACE, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_REPLACE, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test4: (Identical transaction)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_FAIL, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_FAIL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Load3:\n");
|
||||
@ -81,21 +81,21 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test5: (Colliding transaction, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_FAIL, false, NULL, &j) == -EDEADLK);
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_FAIL, NULL, &j) == -EDEADLK);
|
||||
|
||||
printf("Test6: (Colliding transaction, replace)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_REPLACE, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_REPLACE, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test7: (Unmergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_FAIL, false, NULL, &j) == -EDEADLK);
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_FAIL, NULL, &j) == -EDEADLK);
|
||||
|
||||
printf("Test8: (Mergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_RESTART, g, JOB_FAIL, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_RESTART, g, JOB_FAIL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Test9: (Unmergeable job type, replace)\n");
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_REPLACE, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_REPLACE, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
printf("Load4:\n");
|
||||
@ -103,7 +103,7 @@ int main(int argc, char *argv[]) {
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("Test10: (Unmergeable job type of auxiliary job, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, h, JOB_FAIL, false, NULL, &j) == 0);
|
||||
assert_se(manager_add_job(m, JOB_START, h, JOB_FAIL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
|
||||
manager_free(m);
|
||||
|
Loading…
Reference in New Issue
Block a user