mount-setup: mount all cgroup controllers by default but make it non-fatal

This commit is contained in:
Lennart Poettering 2010-04-16 23:22:32 +02:00
parent 09e80b16f2
commit 2076ca540e
1 changed files with 67 additions and 9 deletions

View File

@ -38,16 +38,17 @@ typedef struct MountPoint {
const char *type;
const char *options;
unsigned long flags;
bool fatal;
} MountPoint;
static const MountPoint mount_table[] = {
{ "proc", "/proc", "proc", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV },
{ "sysfs", "/sys", "sysfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV },
{ "devtmps", "/dev", "devtmpfs", "mode=755", MS_NOSUID },
{ "tmpfs", "/dev/shm", "tmpfs", "mode=1777", MS_NOSUID|MS_NOEXEC|MS_NODEV },
{ "devpts", "/dev/pts", "devpts", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV },
{ "cgroup", "/cgroup/debug", "cgroup", "debug", MS_NOSUID|MS_NOEXEC|MS_NODEV },
{ "debugfs", "/sys/kernel/debug", "debugfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV }
{ "proc", "/proc", "proc", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
{ "sysfs", "/sys", "sysfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
{ "devtmps", "/dev", "devtmpfs", "mode=755", MS_NOSUID, true },
{ "tmpfs", "/dev/shm", "tmpfs", "mode=1777", MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
{ "devpts", "/dev/pts", "devpts", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, false },
{ "cgroup", "/cgroup/debug", "cgroup", "debug", MS_NOSUID|MS_NOEXEC|MS_NODEV, true },
{ "debugfs", "/sys/kernel/debug", "debugfs", NULL, MS_NOSUID|MS_NOEXEC|MS_NODEV, false }
};
bool mount_point_is_api(const char *path) {
@ -115,12 +116,69 @@ static int mount_one(const MountPoint *p) {
p->flags,
p->options) < 0) {
log_error("Failed to mount %s: %s", p->where, strerror(errno));
return -errno;
return p->fatal ? -errno : 0;
}
return 0;
}
static int mount_cgroup_controllers(void) {
int r;
FILE *f;
char buf [256];
/* Mount all available cgroup controllers. */
if (!(f = fopen("/proc/cgroups", "re")))
return -ENOENT;
/* Ignore the header line */
fgets(buf, sizeof(buf), f);
for (;;) {
MountPoint p;
char *controller, *where;
if (fscanf(f, "%ms %*i %*i %*i", &controller) != 1) {
if (feof(f))
break;
log_error("Failed to parse /proc/cgroups.");
r = -EIO;
goto finish;
}
if (asprintf(&where, "/cgroup/%s", controller) < 0) {
free(controller);
r = -ENOMEM;
goto finish;
}
zero(p);
p.what = "cgroup";
p.where = where;
p.type = "cgroup";
p.options = controller;
p.flags = MS_NOSUID|MS_NOEXEC|MS_NODEV;
p.fatal = false;
r = mount_one(&p);
free(controller);
free(where);
if (r < 0)
goto finish;
}
r = 0;
finish:
fclose(f);
return r;
}
int mount_setup(void) {
int r;
unsigned i;
@ -129,5 +187,5 @@ int mount_setup(void) {
if ((r = mount_one(mount_table+i)) < 0)
return r;
return 0;
return mount_cgroup_controllers();
}