]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/service: preserve RuntimeDirectory= even if oneshot service exits
authorMike Yuan <me@yhndnzj.com>
Sat, 30 Nov 2024 17:04:52 +0000 (18:04 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 2 Dec 2024 09:57:45 +0000 (10:57 +0100)
Follow-up for c26948c6dae1d2ca13499b36f193b13a0760834c

We only want to get rid of cred mount here, and RuntimeDirectory=
is documented to be retained for SERVICE_EXITED state.

Fixes #35427

src/core/mount.c
src/core/service.c
src/core/socket.c
src/core/swap.c
src/core/unit.c
src/core/unit.h
test/units/TEST-23-UNIT-FILE.RuntimeDirectory.sh [moved from test/units/TEST-23-UNIT-FILE.RuntimeDirectoryPreserve.sh with 56% similarity]

index 92e0d7737a7a0ab12ce72d6e0985ca3d8affe73e..689ef5672dbf3073dc59f1fea4a9f7c5417f9d53 100644 (file)
@@ -910,7 +910,7 @@ static void mount_enter_dead(Mount *m, MountResult f, bool flush_result) {
 
         m->exec_runtime = exec_runtime_destroy(m->exec_runtime);
 
-        unit_destroy_runtime_data(UNIT(m), &m->exec_context);
+        unit_destroy_runtime_data(UNIT(m), &m->exec_context, /* destroy_runtime_dir = */ true);
 
         unit_unref_uid_gid(UNIT(m), true);
 
index f4919bb2b1b01355122ee3bd26554c492a2fe140..c436650791f5844bd7405b9972d414fce1b009ee 100644 (file)
@@ -1341,7 +1341,7 @@ static void service_set_state(Service *s, ServiceState state) {
                         }
 
                 if (start_only)
-                        unit_destroy_runtime_data(u, &s->exec_context);
+                        unit_destroy_runtime_data(u, &s->exec_context, /* destroy_runtime_dir = */ false);
         }
 
         if (old_state != state)
@@ -2163,7 +2163,7 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
         s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
 
         /* Also, remove the runtime directory */
-        unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
 
         /* Also get rid of the fd store, if that's configured. */
         if (s->fd_store_preserve_mode == EXEC_PRESERVE_NO)
index e4a19285c9264ed465ab7314919e33e247bc2fab..65995275150fbcf1134301fbc453411d05aa1907 100644 (file)
@@ -2070,7 +2070,7 @@ static void socket_enter_dead(Socket *s, SocketResult f) {
 
         s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
 
-        unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
 
         unit_unref_uid_gid(UNIT(s), true);
 }
index 312db05db57caaf635df4eff4c3540fba867ae98..f2d1d5608cdebd3dcb9a36374bffb3cea6204510 100644 (file)
@@ -676,7 +676,7 @@ static void swap_enter_dead(Swap *s, SwapResult f) {
 
         s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
 
-        unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+        unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
 
         unit_unref_uid_gid(UNIT(s), true);
 }
index 71488a4555c5e914a1732c2c2a598dd634720d46..0d88f4f64167ed8a854fd8b30fc1e9b5b2dc1b8e 100644 (file)
@@ -6148,13 +6148,13 @@ int unit_test_trigger_loaded(Unit *u) {
         return 0;
 }
 
-void unit_destroy_runtime_data(Unit *u, const ExecContext *context) {
+void unit_destroy_runtime_data(Unit *u, const ExecContext *context, bool destroy_runtime_dir) {
         assert(u);
         assert(u->manager);
         assert(context);
 
         /* EXEC_PRESERVE_RESTART is handled via unit_release_resources()! */
-        if (context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO)
+        if (destroy_runtime_dir && context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO)
                 exec_context_destroy_runtime_directory(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
 
         exec_context_destroy_credentials(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME], u->id);
index a8eb36633703a02df27f664c09bf3f83c96e60f4..8a3b812a4bfa8ffd3b6b8b6499e3bbcd0b1db72c 100644 (file)
@@ -1036,7 +1036,7 @@ int unit_failure_action_exit_status(Unit *u);
 
 int unit_test_trigger_loaded(Unit *u);
 
-void unit_destroy_runtime_data(Unit *u, const ExecContext *context);
+void unit_destroy_runtime_data(Unit *u, const ExecContext *context, bool destroy_runtime_dir);
 int unit_clean(Unit *u, ExecCleanMask mask);
 int unit_can_clean(Unit *u, ExecCleanMask *ret_mask);
 
similarity index 56%
rename from test/units/TEST-23-UNIT-FILE.RuntimeDirectoryPreserve.sh
rename to test/units/TEST-23-UNIT-FILE.RuntimeDirectory.sh
index ca57702cf1421652b347fce83a8f9fc931a4843f..d29331e99ff4eed096d0856ed8eaba402bc7ddd9 100755 (executable)
@@ -5,8 +5,6 @@
 set -eux
 set -o pipefail
 
-# Test RuntimeDirectoryPreserve=yes
-
 at_exit() {
     set +e
 
@@ -15,6 +13,21 @@ at_exit() {
 
 trap at_exit EXIT
 
+# RuntimeDirectory= should be preserved for oneshot units if RemainAfterExit=yes
+
+systemd-run --service-type=oneshot --remain-after-exit \
+            -u TEST-23-remain-after-exit.service \
+            -p RuntimeDirectory=TEST-23-remain-after-exit \
+            true
+
+[[ -d /run/TEST-23-remain-after-exit ]]
+
+systemctl stop TEST-23-remain-after-exit.service
+
+[[ ! -e /run/TEST-23-remain-after-exit ]]
+
+# Test RuntimeDirectoryPreserve=yes
+
 systemd-mount -p RuntimeDirectory=hoge -p RuntimeDirectoryPreserve=yes -t tmpfs tmpfs /tmp/aaa
 
 touch /run/hoge/foo