#include <libgen.h>
#include <assert.h>
#include <unistd.h>
+#include <ftw.h>
#include "mount-setup.h"
#include "log.h"
};
/* 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",
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) {
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;
goto finish;
}
+ if (!enabled) {
+ free(controller);
+ continue;
+ }
+
if (asprintf(&where, "/sys/fs/cgroup/%s", controller) < 0) {
free(controller);
r = -ENOMEM;
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"
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. */