From: Mike Yuan Date: Tue, 14 May 2024 10:47:42 +0000 (+0800) Subject: Revert "core/credential,mount: re-read /proc/self/mountinfo before invoking umount... X-Git-Tag: v257-rc1~1186^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c5087ef51099521450eb3486c606c99d86a1a009;p=thirdparty%2Fsystemd.git Revert "core/credential,mount: re-read /proc/self/mountinfo before invoking umount command" This reverts commit 1e1225614ca1106116dcad9fb37aaeb6106408ab. This was an incomplete workaround of the race. Now that we stop generating mount units for credential mounts, the logic could be dropped. --- diff --git a/src/core/exec-credential.c b/src/core/exec-credential.c index f4cff57848b..d58aa18b556 100644 --- a/src/core/exec-credential.c +++ b/src/core/exec-credential.c @@ -13,7 +13,6 @@ #include "label-util.h" #include "mkdir-label.h" #include "mount-util.h" -#include "mount.h" #include "mountpoint-util.h" #include "process-util.h" #include "random-util.h" @@ -145,21 +144,19 @@ int unit_add_default_credential_dependencies(Unit *u, const ExecContext *c) { return unit_add_dependency_by_name(u, UNIT_AFTER, m, /* add_reference= */ true, UNIT_DEPENDENCY_FILE); } -int exec_context_destroy_credentials(Unit *u) { +int exec_context_destroy_credentials(const ExecContext *c, const char *runtime_prefix, const char *unit) { _cleanup_free_ char *p = NULL; int r; - assert(u); + assert(c); - r = get_credential_directory(u->manager->prefix[EXEC_DIRECTORY_RUNTIME], u->id, &p); + r = get_credential_directory(runtime_prefix, unit, &p); if (r <= 0) return r; /* This is either a tmpfs/ramfs of its own, or a plain directory. Either way, let's first try to * unmount it, and afterwards remove the mount point */ - if (umount2(p, MNT_DETACH|UMOUNT_NOFOLLOW) >= 0) - (void) mount_invalidate_state_by_path(u->manager, p); - + (void) umount2(p, MNT_DETACH|UMOUNT_NOFOLLOW); (void) rm_rf(p, REMOVE_ROOT|REMOVE_CHMOD); return 0; diff --git a/src/core/exec-credential.h b/src/core/exec-credential.h index 70bb46bdde6..f02770cec58 100644 --- a/src/core/exec-credential.h +++ b/src/core/exec-credential.h @@ -47,7 +47,7 @@ int exec_context_get_credential_directory( int unit_add_default_credential_dependencies(Unit *u, const ExecContext *c); -int exec_context_destroy_credentials(Unit *u); +int exec_context_destroy_credentials(const ExecContext *c, const char *runtime_root, const char *unit); int exec_setup_credentials( const ExecContext *context, const ExecParameters *params, diff --git a/src/core/mount.c b/src/core/mount.c index 238e3eab501..a6460287ced 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1333,11 +1333,6 @@ static int mount_start(Unit *u) { static int mount_stop(Unit *u) { Mount *m = ASSERT_PTR(MOUNT(u)); - /* When we directly call umount() for a path, then the state of the corresponding mount unit may be - * outdated. Let's re-read mountinfo now and update the state. */ - if (m->invalidated_state) - (void) mount_process_proc_self_mountinfo(u->manager); - switch (m->state) { case MOUNT_UNMOUNTING: @@ -1372,11 +1367,6 @@ static int mount_stop(Unit *u) { mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS); return 0; - case MOUNT_DEAD: - case MOUNT_FAILED: - /* The mount has just been unmounted by somebody else. */ - return 0; - default: assert_not_reached(); } @@ -2141,8 +2131,6 @@ static int mount_process_proc_self_mountinfo(Manager *m) { LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) { Mount *mount = MOUNT(u); - mount->invalidated_state = false; - if (!mount_is_mounted(mount)) { /* A mount point is not around right now. It might be gone, or might never have @@ -2239,26 +2227,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, return mount_process_proc_self_mountinfo(m); } -int mount_invalidate_state_by_path(Manager *manager, const char *path) { - _cleanup_free_ char *name = NULL; - Unit *u; - int r; - - assert(manager); - assert(path); - - r = unit_name_from_path(path, ".mount", &name); - if (r < 0) - return log_debug_errno(r, "Failed to generate unit name from path \"%s\", ignoring: %m", path); - - u = manager_get_unit(manager, name); - if (!u) - return -ENOENT; - - MOUNT(u)->invalidated_state = true; - return 0; -} - static void mount_reset_failed(Unit *u) { Mount *m = MOUNT(u); diff --git a/src/core/mount.h b/src/core/mount.h index a029dc87aca..9a8b6bb4c0a 100644 --- a/src/core/mount.h +++ b/src/core/mount.h @@ -50,8 +50,6 @@ struct Mount { MountParameters parameters_proc_self_mountinfo; MountParameters parameters_fragment; - bool invalidated_state:1; /* Set when the 'state' of the mount unit may be outdated, and we need to - * re-read /proc/self/mountinfo. */ bool from_proc_self_mountinfo:1; bool from_fragment:1; @@ -96,8 +94,6 @@ extern const UnitVTable mount_vtable; void mount_fd_event(Manager *m, int events); -int mount_invalidate_state_by_path(Manager *manager, const char *path); - char* mount_get_what_escaped(const Mount *m); char* mount_get_options_escaped(const Mount *m); const char* mount_get_fstype(const Mount *m); diff --git a/src/core/unit.c b/src/core/unit.c index 2d40618fcbb..a1e7b62b9af 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -6109,7 +6109,7 @@ void unit_destroy_runtime_data(Unit *u, const ExecContext *context) { if (context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO) exec_context_destroy_runtime_directory(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME]); - exec_context_destroy_credentials(u); + exec_context_destroy_credentials(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME], u->id); exec_context_destroy_mount_ns_dir(u); }