Merge pull request #831 from hallyn/2016-02-19/cgfs

2016 02 19/cgfs
This commit is contained in:
Stéphane Graber 2016-02-19 22:13:36 -05:00
commit aaae118e7e

View File

@ -433,6 +433,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
struct cgroup_mount_point *mount_point;
struct cgroup_hierarchy *h;
char **subsystems;
bool is_lxcfs = false;
if (line[0] && line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
@ -471,10 +472,18 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
continue;
/* not a cgroup filesystem */
if (strcmp(tokens[j + 1], "cgroup") != 0)
if (strcmp(tokens[j + 1], "cgroup") != 0) {
if (strcmp(tokens[j + 1], "fuse.lxcfs") != 0)
continue;
subsystems = subsystems_from_mount_options(tokens[j + 3], kernel_subsystems);
if (strncmp(tokens[4], "/sys/fs/cgroup/", 15) != 0)
continue;
is_lxcfs = true;
char *curtok = tokens[4] + 15;
subsystems = subsystems_from_mount_options(curtok,
kernel_subsystems);
} else
subsystems = subsystems_from_mount_options(tokens[j + 3],
kernel_subsystems);
if (!subsystems)
goto out;
@ -503,8 +512,11 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
meta_data->mount_points[mount_point_count++] = mount_point;
mount_point->hierarchy = h;
mount_point->mount_point = strdup(tokens[4]);
if (is_lxcfs)
mount_point->mount_prefix = strdup("/");
else
mount_point->mount_prefix = strdup(tokens[3]);
mount_point->mount_point = strdup(tokens[4]);
if (!mount_point->mount_point || !mount_point->mount_prefix)
goto out;
mount_point->read_only = !lxc_string_in_list("rw", tokens[5], ',');
@ -1704,17 +1716,21 @@ static char **subsystems_from_mount_options(const char *mount_options,
* subsystems provided by the kernel OR if it starts
* with name= for named hierarchies
*/
if (!strncmp(token, "name=", 5) || lxc_string_in_array(token, (const char **)kernel_list)) {
r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 12);
if (r < 0)
goto out_free;
result[result_count + 1] = NULL;
if (strncmp(token, "name=", 5) && !lxc_string_in_array(token, (const char **)kernel_list)) {
// this is eg 'systemd' but the mount will be 'name=systemd'
result[result_count] = malloc(strlen(token) + 6);
if (result[result_count])
sprintf(result[result_count], "name=%s", token);
} else
result[result_count] = strdup(token);
if (!result[result_count])
goto out_free;
result_count++;
}
}
return result;
@ -1918,12 +1934,12 @@ static int do_setup_cgroup_limits(struct cgfs_data *d,
cgroup_devices_has_allow_or_deny(d, cg->value, true))
continue;
if (lxc_cgroup_set_data(cg->subsystem, cg->value, d)) {
if (do_devices && errno == EPERM) {
if (do_devices && (errno == EACCES || errno == EPERM)) {
WARN("Error setting %s to %s for %s",
cg->subsystem, cg->value, d->name);
continue;
}
ERROR("Error setting %s to %s for %s",
SYSERROR("Error setting %s to %s for %s",
cg->subsystem, cg->value, d->name);
goto out;
}