From: Lennart Poettering Date: Fri, 19 May 2023 13:48:12 +0000 (+0200) Subject: switch-root: introduce SwitchRootFlags flags parameter to switch_root() X-Git-Tag: v254-rc1~298^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2932161bf6d9a8c127da00c9032e7e449222c9ea;p=thirdparty%2Fsystemd.git switch-root: introduce SwitchRootFlags flags parameter to switch_root() Let's replace the current boolean param with a proper flags param. With a single flag this doesn't appear to make much sense, though it does already make things more readable I think. However, once we add a second flag, it starts to make more sense. Also, while we are at it, condition the "istmp" determinaton with this flag too, since we only need it when the flag is set. --- diff --git a/src/core/main.c b/src/core/main.c index 28cfca25b3e..f067b13fff8 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1840,7 +1840,7 @@ static int do_reexecute( if (switch_root_dir) { r = switch_root(/* new_root= */ switch_root_dir, /* old_root_after= */ NULL, - /* destroy_old_root= */ objective == MANAGER_SWITCH_ROOT); + /* flags= */ objective == MANAGER_SWITCH_ROOT ? SWITCH_ROOT_DESTROY_OLD_ROOT : 0); if (r < 0) log_error_errno(r, "Failed to switch root, trying to continue: %m"); } diff --git a/src/shared/switch-root.c b/src/shared/switch-root.c index 2ea65eafaf1..333118f75fc 100644 --- a/src/shared/switch-root.c +++ b/src/shared/switch-root.c @@ -28,7 +28,7 @@ int switch_root(const char *new_root, const char *old_root_after, /* path below the new root, where to place the old root after the transition; may be NULL to unmount it */ - bool destroy_old_root) { + SwitchRootFlags flags) { struct { const char *path; @@ -66,11 +66,14 @@ int switch_root(const char *new_root, return 0; } - istmp = fd_is_temporary_fs(old_root_fd); - if (istmp < 0) - return log_error_errno(istmp, "Failed to stat root directory: %m"); - if (istmp > 0) - log_debug("Root directory is on tmpfs, will do cleanup later."); + if (FLAGS_SET(flags, SWITCH_ROOT_DESTROY_OLD_ROOT)) { + istmp = fd_is_temporary_fs(old_root_fd); + if (istmp < 0) + return log_error_errno(istmp, "Failed to stat root directory: %m"); + if (istmp > 0) + log_debug("Root directory is on tmpfs, will do cleanup later."); + } else + istmp = -1; /* don't know */ if (old_root_after) { /* Determine where we shall place the old root after the transition */ @@ -160,7 +163,7 @@ int switch_root(const char *new_root, return log_error_errno(errno, "Failed to change directory: %m"); } - if (istmp && destroy_old_root) { + if (istmp > 0) { struct stat rb; if (fstat(old_root_fd, &rb) < 0) diff --git a/src/shared/switch-root.h b/src/shared/switch-root.h index 9882d2ef91e..059b4603ea5 100644 --- a/src/shared/switch-root.h +++ b/src/shared/switch-root.h @@ -3,4 +3,8 @@ #include -int switch_root(const char *new_root, const char *old_root_after, bool destroy_old_root); +typedef enum SwitchRootFlags { + SWITCH_ROOT_DESTROY_OLD_ROOT = 1 << 0, /* rm -rf old root when switching – under the condition that it is backed by non-persistent tmpfs/ramfs/… */ +} SwitchRootFlags; + +int switch_root(const char *new_root, const char *old_root_after, SwitchRootFlags flags); diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c index bd6ded5529c..be4adb79d57 100644 --- a/src/shutdown/shutdown.c +++ b/src/shutdown/shutdown.c @@ -169,7 +169,7 @@ static int switch_root_initramfs(void) { return switch_root( /* new_root= */ "/run/initramfs", /* old_root_after= */ "/oldroot", - /* destroy_old_root= */ false); + /* flags= */ 0); } /* Read the following fields from /proc/meminfo: