diff --git a/fixme b/fixme
index 7f34510e22f..2c61cff2ee3 100644
--- a/fixme
+++ b/fixme
@@ -37,10 +37,10 @@
* systemctl status $PID, systemctl stop $PID!
-* make shutdown go on even if conflicting units fail to shut down.
-
* sulogin in den single user mode, mit plymouth --hide davor
+* replace remaining libcgroup use
+
External:
* patch /etc/init.d/functions with:
diff --git a/man/systemd.special.xml.in b/man/systemd.special.xml.in
index ac9f0f5a6ab..64e37d1149e 100644
--- a/man/systemd.special.xml.in
+++ b/man/systemd.special.xml.in
@@ -84,7 +84,8 @@
systemd-initctl.service,
systemd-initctl.socket,
systemd-logger.service,
- systemd-logger.socket
+ systemd-logger.socket,
+ umount.target
@@ -499,8 +500,10 @@
terminated on system shutdown
shall add Conflicts
dependencies to this unit for
- their service unit during
- installation.
+ their service unit, which is
+ implicitly done when
+ DefaultDependencies=yes
+ is set (the default).
systemd automatically
adds dependencies of type
@@ -653,6 +656,24 @@
kernel log buffer.
+
+ umount.target
+
+ A special target unit
+ that umounts all mount and
+ automount points on system
+ shutdown.
+
+ Mounts that shall be
+ unmounted on system shutdown
+ shall add Conflicts
+ dependencies to this unit for
+ their mount unit, which is
+ implicitly done when
+ DefaultDependencies=yes
+ is set (the default).
+
+
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 554130448fe..a03df65dcb5 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -482,6 +482,19 @@
ones.
+
+ IgnoreDependencyFailure=
+
+ Takes a boolean
+ argument. If and
+ a requirement dependency of this unit
+ fails to start up this unit will be
+ started nonetheless, ignoring that
+ failure. If
+ (the default) and a dependency unit
+ fails the unit will immediately fail
+ too and the job is removed.
+ Unit file may include a [Install] section, which
diff --git a/src/job.c b/src/job.c
index 7cbde80b380..8cc9d742ede 100644
--- a/src/job.c
+++ b/src/job.c
@@ -495,14 +495,16 @@ int job_finish_and_invalidate(Job *j, bool success) {
t == JOB_RELOAD_OR_START) {
SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY], i)
- if (other->meta.job &&
+ if (!other->meta.ignore_dependency_failure &&
+ other->meta.job &&
(other->meta.job->type == JOB_START ||
other->meta.job->type == JOB_VERIFY_ACTIVE ||
other->meta.job->type == JOB_RELOAD_OR_START))
job_finish_and_invalidate(other->meta.job, false);
SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
- if (other->meta.job &&
+ if (!other->meta.ignore_dependency_failure &&
+ other->meta.job &&
!other->meta.job->override &&
(other->meta.job->type == JOB_START ||
other->meta.job->type == JOB_VERIFY_ACTIVE ||
@@ -512,7 +514,8 @@ int job_finish_and_invalidate(Job *j, bool success) {
} else if (t == JOB_STOP) {
SET_FOREACH(other, u->meta.dependencies[UNIT_CONFLICTS], i)
- if (other->meta.job &&
+ if (!other->meta.ignore_dependency_failure &&
+ other->meta.job &&
(other->meta.job->type == JOB_START ||
other->meta.job->type == JOB_VERIFY_ACTIVE ||
other->meta.job->type == JOB_RELOAD_OR_START))
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 1d40b69c98a..8e4ec74b073 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -1562,6 +1562,7 @@ static int load_from_path(Unit *u, const char *path) {
{ "StopWhenUnneeded", config_parse_bool, &u->meta.stop_when_unneeded, "Unit" },
{ "OnlyByDependency", config_parse_bool, &u->meta.only_by_dependency, "Unit" },
{ "DefaultDependencies", config_parse_bool, &u->meta.default_dependencies, "Unit" },
+ { "IgnoreDependencyFailure",config_parse_bool, &u->meta.ignore_dependency_failure, "Unit" },
{ "PIDFile", config_parse_path, &u->service.pid_file, "Service" },
{ "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" },
diff --git a/src/unit.c b/src/unit.c
index b362fd3b419..66372f2a92a 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -626,11 +626,13 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
"%s\tRecursive Stop: %s\n"
"%s\tStopWhenUnneeded: %s\n"
"%s\tOnlyByDependency: %s\n"
- "%s\tDefaultDependencies: %s\n",
+ "%s\tDefaultDependencies: %s\n"
+ "%s\tIgnoreDependencyFailure: %s\n",
prefix, yes_no(u->meta.recursive_stop),
prefix, yes_no(u->meta.stop_when_unneeded),
prefix, yes_no(u->meta.only_by_dependency),
- prefix, yes_no(u->meta.default_dependencies));
+ prefix, yes_no(u->meta.default_dependencies),
+ prefix, yes_no(u->meta.ignore_dependency_failure));
LIST_FOREACH(by_unit, b, u->meta.cgroup_bondings)
fprintf(f, "%s\tControlGroup: %s:%s\n",
diff --git a/src/unit.h b/src/unit.h
index c9fd4a538cb..3f4bbd9ed7d 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -184,6 +184,9 @@ struct Meta {
/* Create default depedencies */
bool default_dependencies;
+ /* Bring up this unit even if a dependency fails to start */
+ bool ignore_dependency_failure;
+
/* When deserializing, temporarily store the job type for this
* unit here, if there was a job scheduled */
int deserialized_job; /* This is actually of type JobType */
diff --git a/units/shutdown.target b/units/shutdown.target
index c05b8b93e3c..586ca4a7583 100644
--- a/units/shutdown.target
+++ b/units/shutdown.target
@@ -10,3 +10,4 @@
[Unit]
Description=Shutdown
OnlyByDependency=yes
+IgnoreDependencyFailure=yes
diff --git a/units/umount.target b/units/umount.target
index a5f31e04cb2..6a00c313282 100644
--- a/units/umount.target
+++ b/units/umount.target
@@ -10,3 +10,4 @@
[Unit]
Description=Unmount All Filesystems
OnlyByDependency=yes
+IgnoreDependencyFailure=yes