diff --git a/src/core/mount.c b/src/core/mount.c index 801d2195b3..6e536ecc6b 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1390,6 +1390,7 @@ static int mount_start(Unit *u) { static int mount_stop(Unit *u) { Mount *m = ASSERT_PTR(MOUNT(u)); + int r; switch (m->state) { @@ -1401,21 +1402,22 @@ static int mount_stop(Unit *u) { case MOUNT_MOUNTING: case MOUNT_MOUNTING_DONE: - case MOUNT_REMOUNTING: /* If we are still waiting for /bin/mount, we go directly into kill mode. */ mount_enter_signal(m, MOUNT_UNMOUNTING_SIGTERM, MOUNT_SUCCESS); return 0; + case MOUNT_REMOUNTING: case MOUNT_REMOUNTING_SIGTERM: - /* If we are already waiting for a hung remount, convert this to the matching unmounting state */ - mount_set_state(m, MOUNT_UNMOUNTING_SIGTERM); - return 0; + assert(pidref_is_set(&m->control_pid)); + r = pidref_kill_and_sigcont(&m->control_pid, SIGKILL); + if (r < 0) + log_unit_debug_errno(u, r, + "Failed to kill remount process " PID_FMT ", ignoring: %m", + m->control_pid.pid); + + _fallthrough_; case MOUNT_REMOUNTING_SIGKILL: - /* as above */ - mount_set_state(m, MOUNT_UNMOUNTING_SIGKILL); - return 0; - case MOUNT_MOUNTED: mount_enter_unmounting(m); return 1; @@ -2415,7 +2417,6 @@ char* mount_get_where_escaped(const Mount *m) { } char* mount_get_what_escaped(const Mount *m) { - _cleanup_free_ char *escaped = NULL; const char *s = NULL; assert(m); @@ -2424,14 +2425,10 @@ char* mount_get_what_escaped(const Mount *m) { s = m->parameters_proc_self_mountinfo.what; else if (m->from_fragment && m->parameters_fragment.what) s = m->parameters_fragment.what; + if (!s) + return strdup(""); - if (s) { - escaped = utf8_escape_invalid(s); - if (!escaped) - return NULL; - } - - return escaped ? TAKE_PTR(escaped) : strdup(""); + return utf8_escape_invalid(s); } char* mount_get_options_escaped(const Mount *m) {