chiark / gitweb /
mount: trivial typo fix
[elogind.git] / src / mount-setup.c
index fe99f58b6688daa7fb967265e2fca19a5301bf78..4adb86f15731acd4a912fae0fe1793b1a4e12fba 100644 (file)
@@ -27,6 +27,7 @@
 #include <libgen.h>
 #include <assert.h>
 #include <unistd.h>
+#include <ftw.h>
 
 #include "mount-setup.h"
 #include "log.h"
@@ -54,7 +55,7 @@ static const MountPoint mount_table[] = {
 };
 
 /* These are API file systems that might be mounted by other software,
- * we just list them here so that we know that we should igore them */
+ * we just list them here so that we know that we should ignore them */
 
 static const char * const ignore_paths[] = {
         "/selinux",
@@ -73,11 +74,17 @@ bool mount_point_is_api(const char *path) {
                 if (path_equal(path, mount_table[i].where))
                         return true;
 
+        return path_startswith(path, "/sys/fs/cgroup/");
+}
+
+bool mount_point_ignore(const char *path) {
+        unsigned i;
+
         for (i = 0; i < ELEMENTSOF(ignore_paths); i++)
                 if (path_equal(path, ignore_paths[i]))
                         return true;
 
-        return path_startswith(path, "/sys/fs/cgroup/");
+        return false;
 }
 
 static int mount_one(const MountPoint *p) {
@@ -131,8 +138,9 @@ static int mount_cgroup_controllers(void) {
         for (;;) {
                 MountPoint p;
                 char *controller, *where;
+                int enabled = false;
 
-                if (fscanf(f, "%ms %*i %*i %*i", &controller) != 1) {
+                if (fscanf(f, "%ms %*i %*i %i", &controller, &enabled) != 2) {
 
                         if (feof(f))
                                 break;
@@ -142,6 +150,11 @@ static int mount_cgroup_controllers(void) {
                         goto finish;
                 }
 
+                if (!enabled) {
+                        free(controller);
+                        continue;
+                }
+
                 if (asprintf(&where, "/sys/fs/cgroup/%s", controller) < 0) {
                         free(controller);
                         r = -ENOMEM;
@@ -189,9 +202,23 @@ static int symlink_and_label(const char *old_path, const char *new_path) {
         return r;
 }
 
+static int nftw_cb(
+                const char *fpath,
+                const struct stat *sb,
+                int tflag,
+                struct FTW *ftwbuf) {
+
+        /* No need to label /dev twice in a row... */
+        if (ftwbuf->level == 0)
+                return 0;
+
+        label_fix(fpath);
+        return 0;
+};
+
 int mount_setup(void) {
 
-        const char *symlinks =
+        const char symlinks[] =
                 "/proc/kcore\0"      "/dev/core\0"
                 "/proc/self/fd\0"    "/dev/fd\0"
                 "/proc/self/fd/0\0"  "/dev/stdin\0"
@@ -207,6 +234,13 @@ int mount_setup(void) {
                 if ((r = mount_one(mount_table+i)) < 0)
                         return r;
 
+        /* Nodes in devtmpfs need to be manually updated for the
+         * appropriate labels, after mounting. The other virtual API
+         * file systems do not need. */
+
+        if (unlink("/dev/.systemd/relabel-devtmpfs") >= 0)
+                nftw("/dev", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
+
         /* Create a few default symlinks, which are normally created
          * bei udevd, but some scripts might need them before we start
          * udevd. */