diff options
-rw-r--r-- | src/core/automount.c | 1 | ||||
-rw-r--r-- | src/core/manager.c | 6 | ||||
-rw-r--r-- | src/core/mount.c | 1 | ||||
-rw-r--r-- | src/core/unit-serialize.c | 16 | ||||
-rw-r--r-- | src/core/unit.h | 3 |
5 files changed, 20 insertions, 7 deletions
diff --git a/src/core/automount.c b/src/core/automount.c index f0fa5c8ca9..c74af3c182 100644 --- a/src/core/automount.c +++ b/src/core/automount.c @@ -1087,6 +1087,7 @@ const UnitVTable automount_vtable = { .can_transient = true, .can_fail = true, .can_trigger = true, + .exclude_from_switch_root_serialization = true, .init = automount_init, .load = automount_load, diff --git a/src/core/manager.c b/src/core/manager.c index 688e6881c3..a5f31230b0 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -3306,11 +3306,7 @@ int manager_serialize( if (u->id != t) continue; - /* Start marker */ - fputs(u->id, f); - fputc('\n', f); - - r = unit_serialize(u, f, fds, !switching_root); + r = unit_serialize(u, f, fds, switching_root); if (r < 0) return r; } diff --git a/src/core/mount.c b/src/core/mount.c index 5a757c4b1d..5c48eadb96 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -2153,6 +2153,7 @@ const UnitVTable mount_vtable = { .can_transient = true, .can_fail = true, + .exclude_from_switch_root_serialization = true, .init = mount_init, .load = mount_load, diff --git a/src/core/unit-serialize.c b/src/core/unit-serialize.c index 3f099248ce..28d585d6fa 100644 --- a/src/core/unit-serialize.c +++ b/src/core/unit-serialize.c @@ -88,13 +88,25 @@ static const char *const io_accounting_metric_field_last[_CGROUP_IO_ACCOUNTING_M [CGROUP_IO_WRITE_OPERATIONS] = "io-accounting-write-operations-last", }; -int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) { +int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool switching_root) { int r; assert(u); assert(f); assert(fds); + if (switching_root && UNIT_VTABLE(u)->exclude_from_switch_root_serialization) { + /* In the new root, paths for mounts and automounts will be different, so it doesn't make + * much sense to serialize things. API file systems will be moved to the new root, but we + * don't have mount units for those. */ + log_unit_debug(u, "not serializing before switch-root"); + return 0; + } + + /* Start marker */ + fputs(u->id, f); + fputc('\n', f); + if (unit_can_serialize(u)) { r = UNIT_VTABLE(u)->serialize(u, f, fds); if (r < 0) @@ -172,7 +184,7 @@ int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) { (void) serialize_item_format(f, ip_accounting_metric_field[m], "%" PRIu64, v); } - if (serialize_jobs) { + if (!switching_root) { if (u->job) { fputs("job\n", f); job_serialize(u->job, f); diff --git a/src/core/unit.h b/src/core/unit.h index 264431d04d..a34d260943 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -636,6 +636,9 @@ typedef struct UnitVTable { /* True if units of this type shall be startable only once and then never again */ bool once_only:1; + /* Do not serialize this unit when preparing for root switch */ + bool exclude_from_switch_root_serialization; + /* True if queued jobs of this type should be GC'ed if no other job needs them anymore */ bool gc_jobs:1; |