diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c index 0fe794d2af..a0b5bff5a7 100644 --- a/src/core/mount-setup.c +++ b/src/core/mount-setup.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "alloc-util.h" @@ -385,6 +386,35 @@ static int nftw_cb( return FTW_CONTINUE; }; + +static int relabel_cgroup_filesystems(void) { + int r; + struct statfs st; + + r = cg_all_unified(); + if (r == 0) { + /* Temporarily remount the root cgroup filesystem to give it a proper label. Do this + only when the filesystem has been already populated by a previous instance of systemd + running from initrd. Otherwise don't remount anything and leave the filesystem read-write + for the cgroup filesystems to be mounted inside. */ + r = statfs("/sys/fs/cgroup", &st); + if (r < 0) { + return log_error_errno(errno, "Failed to determine mount flags for /sys/fs/cgroup: %m"); + } + + if (st.f_flags & ST_RDONLY) + (void) mount(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT, NULL); + + (void) label_fix("/sys/fs/cgroup", 0); + nftw("/sys/fs/cgroup", nftw_cb, 64, FTW_MOUNT|FTW_PHYS|FTW_ACTIONRETVAL); + + if (st.f_flags & ST_RDONLY) + (void) mount(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT|MS_RDONLY, NULL); + } else if (r < 0) + return log_error_errno(r, "Failed to determine whether we are in all unified mode: %m"); + + return 0; +} #endif int mount_setup(bool loaded_policy) { @@ -409,15 +439,9 @@ int mount_setup(bool loaded_policy) { nftw("/dev/shm", nftw_cb, 64, FTW_MOUNT|FTW_PHYS|FTW_ACTIONRETVAL); nftw("/run", nftw_cb, 64, FTW_MOUNT|FTW_PHYS|FTW_ACTIONRETVAL); - /* Temporarily remount the root cgroup filesystem to give it a proper label. */ - r = cg_all_unified(); - if (r == 0) { - (void) mount(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT, NULL); - (void) label_fix("/sys/fs/cgroup", 0); - nftw("/sys/fs/cgroup", nftw_cb, 64, FTW_MOUNT|FTW_PHYS|FTW_ACTIONRETVAL); - (void) mount(NULL, "/sys/fs/cgroup", NULL, MS_REMOUNT|MS_RDONLY, NULL); - } else if (r < 0) - return log_error_errno(r, "Failed to determine whether we are in all unified mode: %m"); + r = relabel_cgroup_filesystems(); + if (r < 0) + return r; after_relabel = now(CLOCK_MONOTONIC);