diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index 65a76be3b7..6ad6b4a0be 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -470,6 +470,18 @@
.
+
+ IgnoreOnSnapshot=
+
+ Takes a boolean
+ argument. If
+ this unit will not be included in
+ snapshots. Defaults to
+ for device and
+ snapshot units,
+ for the others.
+
+
StopWhenUnneeded=
diff --git a/src/dbus-unit.h b/src/dbus-unit.h
index a2a93235ee..df8f6ae2ac 100644
--- a/src/dbus-unit.h
+++ b/src/dbus-unit.h
@@ -105,6 +105,7 @@
" \n" \
" \n" \
" \n" \
+ " \n" \
" \n" \
" \n" \
" \n" \
@@ -162,6 +163,7 @@
{ "org.freedesktop.systemd1.Unit", "DefaultDependencies", bus_property_append_bool, "b", &u->meta.default_dependencies }, \
{ "org.freedesktop.systemd1.Unit", "OnFailureIsolate", bus_property_append_bool, "b", &u->meta.on_failure_isolate }, \
{ "org.freedesktop.systemd1.Unit", "IgnoreOnIsolate", bus_property_append_bool, "b", &u->meta.ignore_on_isolate }, \
+ { "org.freedesktop.systemd1.Unit", "IgnoreOnSnapshot", bus_property_append_bool, "b", &u->meta.ignore_on_snapshot }, \
{ "org.freedesktop.systemd1.Unit", "DefaultControlGroup", bus_unit_append_default_cgroup, "s", u }, \
{ "org.freedesktop.systemd1.Unit", "ControlGroup", bus_unit_append_cgroups, "as", u }, \
{ "org.freedesktop.systemd1.Unit", "NeedDaemonReload", bus_unit_append_need_daemon_reload, "b", u }, \
diff --git a/src/device.c b/src/device.c
index d507b701f1..64b21903ed 100644
--- a/src/device.c
+++ b/src/device.c
@@ -72,6 +72,7 @@ static void device_init(Unit *u) {
d->meta.job_timeout = DEFAULT_TIMEOUT_USEC;
d->meta.ignore_on_isolate = true;
+ d->meta.ignore_on_snapshot = true;
}
static void device_done(Unit *u) {
@@ -584,7 +585,6 @@ const UnitVTable device_vtable = {
.suffix = ".device",
.no_instances = true,
- .no_snapshots = true,
.init = device_init,
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 6ec5090197..f8be4dbaa4 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -1878,6 +1878,7 @@ static int load_from_path(Unit *u, const char *path) {
{ "DefaultDependencies", config_parse_bool, 0, &u->meta.default_dependencies, "Unit" },
{ "OnFailureIsolate", config_parse_bool, 0, &u->meta.on_failure_isolate, "Unit" },
{ "IgnoreOnIsolate", config_parse_bool, 0, &u->meta.ignore_on_isolate, "Unit" },
+ { "IgnoreOnSnapshot", config_parse_bool, 0, &u->meta.ignore_on_snapshot, "Unit" },
{ "JobTimeoutSec", config_parse_usec, 0, &u->meta.job_timeout, "Unit" },
{ "ConditionPathExists", config_parse_condition_path, CONDITION_PATH_EXISTS, u, "Unit" },
{ "ConditionPathIsDirectory", config_parse_condition_path, CONDITION_PATH_IS_DIRECTORY, u, "Unit" },
diff --git a/src/snapshot.c b/src/snapshot.c
index 7cde25d4f6..9825f90521 100644
--- a/src/snapshot.c
+++ b/src/snapshot.c
@@ -32,6 +32,16 @@ static const UnitActiveState state_translation_table[_SNAPSHOT_STATE_MAX] = {
[SNAPSHOT_ACTIVE] = UNIT_ACTIVE
};
+static void snapshot_init(Unit *u) {
+ Snapshot *s = SNAPSHOT(u);
+
+ assert(s);
+ assert(s->meta.load_state == UNIT_STUB);
+
+ s->meta.ignore_on_isolate = true;
+ s->meta.ignore_on_snapshot = true;
+}
+
static void snapshot_set_state(Snapshot *s, SnapshotState state) {
SnapshotState old_state;
assert(s);
@@ -228,7 +238,7 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Sn
HASHMAP_FOREACH_KEY(other, k, m->units, i) {
- if (UNIT_VTABLE(other)->no_snapshots)
+ if (other->meta.ignore_on_snapshot)
continue;
if (k != other->meta.id)
@@ -275,9 +285,10 @@ const UnitVTable snapshot_vtable = {
.no_alias = true,
.no_instances = true,
- .no_snapshots = true,
.no_gc = true,
+ .init = snapshot_init,
+
.load = snapshot_load,
.coldplug = snapshot_coldplug,
diff --git a/src/unit.c b/src/unit.c
index b7ff0c51fe..9bb4e56073 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -667,13 +667,15 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
"%s\tRefuseManualStop: %s\n"
"%s\tDefaultDependencies: %s\n"
"%s\tOnFailureIsolate: %s\n"
- "%s\tIgnoreOnIsolate: %s\n",
+ "%s\tIgnoreOnIsolate: %s\n"
+ "%s\tIgnoreOnSnapshot: %s\n",
prefix, yes_no(u->meta.stop_when_unneeded),
prefix, yes_no(u->meta.refuse_manual_start),
prefix, yes_no(u->meta.refuse_manual_stop),
prefix, yes_no(u->meta.default_dependencies),
prefix, yes_no(u->meta.on_failure_isolate),
- prefix, yes_no(u->meta.ignore_on_isolate));
+ prefix, yes_no(u->meta.ignore_on_isolate),
+ prefix, yes_no(u->meta.ignore_on_snapshot));
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 43bbe67573..717c928075 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -213,6 +213,9 @@ struct Meta {
/* Ignore this unit when isolating */
bool ignore_on_isolate;
+ /* Ignore this unit when snapshotting */
+ bool ignore_on_snapshot;
+
/* Did the last condition check suceed? */
bool condition_result;
@@ -364,9 +367,6 @@ struct UnitVTable {
/* Instances make no sense for this type */
bool no_instances:1;
- /* Exclude this type from snapshots */
- bool no_snapshots:1;
-
/* Exclude from automatic gc */
bool no_gc:1;