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
* 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);
* 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);
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),
.will_restart = unit_will_restart_default,
.may_gc = mount_may_gc,
+ .is_extrinsic = mount_is_extrinsic,
.sigchld_event = mount_sigchld_event,
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);
"%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);
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;
.will_restart = unit_will_restart_default,
.may_gc = swap_may_gc,
+ .is_extrinsic = swap_is_extrinsic,
.sigchld_event = swap_sigchld_event,
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;
* 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);
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);