From 39c79477ace14fd57a77eb629bfed5816c485ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 5 Nov 2020 13:08:02 +0100 Subject: pid1: expose "extrinsic" status of swaps and mounts The only visible change from this is that we show Extrinsic: yes/no in dumps for swap units (this was already done for mount units). --- src/core/mount.c | 13 ++++++------- src/core/swap.c | 59 ++++++++++++++++++++++++++++++++------------------------ src/core/unit.c | 4 ++++ src/core/unit.h | 8 ++++++++ 4 files changed, 52 insertions(+), 32 deletions(-) diff --git a/src/core/mount.c b/src/core/mount.c index dbbb73f3d5..07c038b345 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -412,8 +412,9 @@ static int mount_add_quota_dependencies(Mount *m) { return 0; } -static bool mount_is_extrinsic(Mount *m) { +static bool mount_is_extrinsic(Unit *u) { MountParameters *p; + Mount *m = MOUNT(u); assert(m); /* Returns true for all units that are "magic" and should be excluded from the usual @@ -422,10 +423,7 @@ static bool mount_is_extrinsic(Mount *m) { * ourselves but it's fine if the user operates on them with us. */ /* We only automatically manage mounts if we are in system mode */ - if (!MANAGER_IS_SYSTEM(UNIT(m)->manager)) - return true; - - if (UNIT(m)->perpetual) /* All perpetual units never change state */ + if (MANAGER_IS_USER(u->manager)) return true; p = get_mount_parameters(m); @@ -493,7 +491,7 @@ static int mount_add_default_dependencies(Mount *m) { * guaranteed to stay mounted the whole time, since our system is on it. Also, don't * bother with anything mounted below virtual file systems, it's also going to be virtual, * and hence not worth the effort. */ - if (mount_is_extrinsic(m)) + if (mount_is_extrinsic(UNIT(m))) return 0; p = get_mount_parameters(m); @@ -790,7 +788,7 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) { prefix, p ? strna(p->options) : "n/a", prefix, yes_no(m->from_proc_self_mountinfo), prefix, yes_no(m->from_fragment), - prefix, yes_no(mount_is_extrinsic(m)), + prefix, yes_no(mount_is_extrinsic(u)), prefix, m->directory_mode, prefix, yes_no(m->sloppy_options), prefix, yes_no(m->lazy_unmount), @@ -2161,6 +2159,7 @@ const UnitVTable mount_vtable = { .will_restart = unit_will_restart_default, .may_gc = mount_may_gc, + .is_extrinsic = mount_is_extrinsic, .sigchld_event = mount_sigchld_event, diff --git a/src/core/swap.c b/src/core/swap.c index fa600a9797..2d3d488a7b 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -56,6 +56,35 @@ static bool SWAP_STATE_WITH_PROCESS(SwapState state) { SWAP_CLEANING); } +_pure_ static UnitActiveState swap_active_state(Unit *u) { + assert(u); + + return state_translation_table[SWAP(u)->state]; +} + +_pure_ static const char *swap_sub_state_to_string(Unit *u) { + assert(u); + + return swap_state_to_string(SWAP(u)->state); +} + +_pure_ static bool swap_may_gc(Unit *u) { + Swap *s = SWAP(u); + + assert(s); + + if (s->from_proc_swaps) + return false; + + return true; +} + +_pure_ static bool swap_is_extrinsic(Unit *u) { + assert(SWAP(u)); + + return MANAGER_IS_USER(u->manager); +} + static void swap_unset_proc_swaps(Swap *s) { assert(s); @@ -610,13 +639,15 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) { "%sClean Result: %s\n" "%sWhat: %s\n" "%sFrom /proc/swaps: %s\n" - "%sFrom fragment: %s\n", + "%sFrom fragment: %s\n" + "%sExtrinsic: %s\n", prefix, swap_state_to_string(s->state), prefix, swap_result_to_string(s->result), prefix, swap_result_to_string(s->clean_result), prefix, s->what, prefix, yes_no(s->from_proc_swaps), - prefix, yes_no(s->from_fragment)); + prefix, yes_no(s->from_fragment), + prefix, yes_no(swap_is_extrinsic(u))); if (s->devnode) fprintf(f, "%sDevice Node: %s\n", prefix, s->devnode); @@ -1028,29 +1059,6 @@ static int swap_deserialize_item(Unit *u, const char *key, const char *value, FD return 0; } -_pure_ static UnitActiveState swap_active_state(Unit *u) { - assert(u); - - return state_translation_table[SWAP(u)->state]; -} - -_pure_ static const char *swap_sub_state_to_string(Unit *u) { - assert(u); - - return swap_state_to_string(SWAP(u)->state); -} - -_pure_ static bool swap_may_gc(Unit *u) { - Swap *s = SWAP(u); - - assert(s); - - if (s->from_proc_swaps) - return false; - - return true; -} - static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) { Swap *s = SWAP(u); SwapResult f; @@ -1649,6 +1657,7 @@ const UnitVTable swap_vtable = { .will_restart = unit_will_restart_default, .may_gc = swap_may_gc, + .is_extrinsic = swap_is_extrinsic, .sigchld_event = swap_sigchld_event, diff --git a/src/core/unit.c b/src/core/unit.c index 40578cb3fa..f80d9f4099 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1988,6 +1988,10 @@ int unit_stop(Unit *u) { bool unit_can_stop(Unit *u) { assert(u); + /* Note: if we return true here, it does not mean that the unit may be successfully stopped. + * Extrinsic units follow external state and they may stop following external state changes + * (hence we return true here), but an attempt to do this through the manager will fail. */ + if (!unit_type_supported(u->type)) return false; diff --git a/src/core/unit.h b/src/core/unit.h index 1e6d7ccf6b..991a05bafe 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -531,6 +531,9 @@ typedef struct UnitVTable { * even though nothing references it and it isn't active in any way. */ bool (*may_gc)(Unit *u); + /* Return true when the unit is not controlled by the manager (e.g. extrinsic mounts). */ + bool (*is_extrinsic)(Unit *u); + /* When the unit is not running and no job for it queued we shall release its runtime resources */ void (*release_resources)(Unit *u); @@ -684,6 +687,11 @@ int unit_set_description(Unit *u, const char *description); bool unit_may_gc(Unit *u); +static inline bool unit_is_extrinsic(Unit *u) { + return u->perpetual || + (UNIT_VTABLE(u)->is_extrinsic && UNIT_VTABLE(u)->is_extrinsic(u)); +} + void unit_add_to_load_queue(Unit *u); void unit_add_to_dbus_queue(Unit *u); void unit_add_to_cleanup_queue(Unit *u); -- cgit v1.2.1