mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
core/mount: properly handle REMOUNTING_* states in mount_stop() (#39269)
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user