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;