summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-03-22 16:53:26 +0100
committerSven Eden <yamakuzure@gmx.net>2018-08-24 16:47:08 +0200
commit0c2b96fea853ce7f16a9326c3c98117d75defdf6 (patch)
treeff3d108a1d7f295af840137e3c7f77e9d25692aa /src/core
parent6895c0be1845203e14b776dd8a15a97780ac6942 (diff)
macro: introduce TAKE_PTR() macro
This macro will read a pointer of any type, return it, and set the pointer to NULL. This is useful as an explicit concept of passing ownership of a memory area between pointers. This takes inspiration from Rust: https://doc.rust-lang.org/std/option/enum.Option.html#method.take and was suggested by Alan Jenkins (@sourcejedi). It drops ~160 lines of code from our codebase, which makes me like it. Also, I think it clarifies passing of ownership, and thus helps readability a bit (at least for the initiated who know the new macro)
Diffstat (limited to 'src/core')
-rw-r--r--src/core/cgroup.c5
-rw-r--r--src/core/mount-setup.c48
2 files changed, 13 insertions, 40 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 7c590a661..7b9e29b6f 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -1382,8 +1382,7 @@ int unit_set_cgroup_path(Unit *u, const char *path) {
unit_release_cgroup(u);
- u->cgroup_path = p;
- p = NULL;
+ u->cgroup_path = TAKE_PTR(p);
return 1;
}
@@ -2341,7 +2340,7 @@ void manager_shutdown_cgroup(Manager *m, bool delete) {
#if 0 /// elogind is not init
/* We can't really delete the group, since we are in it. But
* let's trim it. */
- if (delete && m->cgroup_root && m->test_run_flags != MANAGER_TEST_RUN_MINIMAL)
+ if (delete && m->cgroup_root)
(void) cg_trim(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_root, false);
m->cgroup_empty_event_source = sd_event_source_unref(m->cgroup_empty_event_source);
diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c
index d2dac76cf..7073175e1 100644
--- a/src/core/mount-setup.c
+++ b/src/core/mount-setup.c
@@ -22,7 +22,6 @@
#include <ftw.h>
#include <stdlib.h>
#include <sys/mount.h>
-//#include <sys/statvfs.h>
#include <unistd.h>
#include "alloc-util.h"
@@ -331,10 +330,8 @@ int mount_cgroup_controllers(char ***join_controllers) {
options = strv_join(*k, ",");
if (!options)
return log_oom();
- } else {
- options = controller;
- controller = NULL;
- }
+ } else
+ options = TAKE_PTR(controller);
where = strappend("/sys/fs/cgroup/", options);
if (!where)
@@ -403,35 +400,6 @@ 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);
-
- label_fix("/sys/fs/cgroup", false, false);
- 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
#endif // 0
@@ -458,9 +426,15 @@ 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);
- r = relabel_cgroup_filesystems();
- if (r < 0)
- return r;
+ /* 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);
+ label_fix("/sys/fs/cgroup", false, false);
+ 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");
after_relabel = now(CLOCK_MONOTONIC);