snapshot: ensure that snapshots cannot be created unless with create_snapshot
This commit is contained in:
parent
032ff4afc9
commit
6ec1117a74
|
@ -47,6 +47,21 @@ static void snapshot_set_state(Snapshot *s, SnapshotState state) {
|
||||||
unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);
|
unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int snapshot_load(Unit *u) {
|
||||||
|
Snapshot *s = SNAPSHOT(u);
|
||||||
|
|
||||||
|
assert(u);
|
||||||
|
assert(u->meta.load_state == UNIT_STUB);
|
||||||
|
|
||||||
|
/* Make sure that only snapshots created via snapshot_create()
|
||||||
|
* can be loaded */
|
||||||
|
if (!s->by_snapshot_create)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
u->meta.load_state = UNIT_LOADED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int snapshot_coldplug(Unit *u) {
|
static int snapshot_coldplug(Unit *u) {
|
||||||
Snapshot *s = SNAPSHOT(u);
|
Snapshot *s = SNAPSHOT(u);
|
||||||
|
|
||||||
|
@ -197,12 +212,16 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, Snapshot **_s) {
|
||||||
name = n;
|
name = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = manager_load_unit(m, name, NULL, &u);
|
r = manager_load_unit_prepare(m, name, NULL, &u);
|
||||||
free(n);
|
free(n);
|
||||||
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
SNAPSHOT(u)->by_snapshot_create = true;
|
||||||
|
manager_dispatch_load_queue(m);
|
||||||
|
assert(u->meta.load_state == UNIT_LOADED);
|
||||||
|
|
||||||
HASHMAP_FOREACH_KEY(other, k, m->units, i) {
|
HASHMAP_FOREACH_KEY(other, k, m->units, i) {
|
||||||
|
|
||||||
if (UNIT_VTABLE(other)->no_snapshots)
|
if (UNIT_VTABLE(other)->no_snapshots)
|
||||||
|
@ -258,7 +277,7 @@ const UnitVTable snapshot_vtable = {
|
||||||
.no_snapshots = true,
|
.no_snapshots = true,
|
||||||
.no_gc = true,
|
.no_gc = true,
|
||||||
|
|
||||||
.load = unit_load_nop,
|
.load = snapshot_load,
|
||||||
.coldplug = snapshot_coldplug,
|
.coldplug = snapshot_coldplug,
|
||||||
|
|
||||||
.dump = snapshot_dump,
|
.dump = snapshot_dump,
|
||||||
|
|
|
@ -39,6 +39,7 @@ struct Snapshot {
|
||||||
SnapshotState state, deserialized_state;
|
SnapshotState state, deserialized_state;
|
||||||
|
|
||||||
bool cleanup;
|
bool cleanup;
|
||||||
|
bool by_snapshot_create:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const UnitVTable snapshot_vtable;
|
extern const UnitVTable snapshot_vtable;
|
||||||
|
|
Loading…
Reference in New Issue