mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-31 21:06:17 +00:00
commit
aaae118e7e
@ -433,6 +433,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
|
|||||||
struct cgroup_mount_point *mount_point;
|
struct cgroup_mount_point *mount_point;
|
||||||
struct cgroup_hierarchy *h;
|
struct cgroup_hierarchy *h;
|
||||||
char **subsystems;
|
char **subsystems;
|
||||||
|
bool is_lxcfs = false;
|
||||||
|
|
||||||
if (line[0] && line[strlen(line) - 1] == '\n')
|
if (line[0] && line[strlen(line) - 1] == '\n')
|
||||||
line[strlen(line) - 1] = '\0';
|
line[strlen(line) - 1] = '\0';
|
||||||
@ -471,10 +472,18 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* not a cgroup filesystem */
|
/* not a cgroup filesystem */
|
||||||
if (strcmp(tokens[j + 1], "cgroup") != 0)
|
if (strcmp(tokens[j + 1], "cgroup") != 0) {
|
||||||
continue;
|
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)
|
if (!subsystems)
|
||||||
goto out;
|
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;
|
meta_data->mount_points[mount_point_count++] = mount_point;
|
||||||
|
|
||||||
mount_point->hierarchy = h;
|
mount_point->hierarchy = h;
|
||||||
|
if (is_lxcfs)
|
||||||
|
mount_point->mount_prefix = strdup("/");
|
||||||
|
else
|
||||||
|
mount_point->mount_prefix = strdup(tokens[3]);
|
||||||
mount_point->mount_point = strdup(tokens[4]);
|
mount_point->mount_point = strdup(tokens[4]);
|
||||||
mount_point->mount_prefix = strdup(tokens[3]);
|
|
||||||
if (!mount_point->mount_point || !mount_point->mount_prefix)
|
if (!mount_point->mount_point || !mount_point->mount_prefix)
|
||||||
goto out;
|
goto out;
|
||||||
mount_point->read_only = !lxc_string_in_list("rw", tokens[5], ',');
|
mount_point->read_only = !lxc_string_in_list("rw", tokens[5], ',');
|
||||||
@ -1704,16 +1716,20 @@ static char **subsystems_from_mount_options(const char *mount_options,
|
|||||||
* subsystems provided by the kernel OR if it starts
|
* subsystems provided by the kernel OR if it starts
|
||||||
* with name= for named hierarchies
|
* 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);
|
||||||
r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 12);
|
if (r < 0)
|
||||||
if (r < 0)
|
goto out_free;
|
||||||
goto out_free;
|
result[result_count + 1] = NULL;
|
||||||
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);
|
result[result_count] = strdup(token);
|
||||||
if (!result[result_count])
|
if (!result[result_count])
|
||||||
goto out_free;
|
goto out_free;
|
||||||
result_count++;
|
result_count++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
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))
|
cgroup_devices_has_allow_or_deny(d, cg->value, true))
|
||||||
continue;
|
continue;
|
||||||
if (lxc_cgroup_set_data(cg->subsystem, cg->value, d)) {
|
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",
|
WARN("Error setting %s to %s for %s",
|
||||||
cg->subsystem, cg->value, d->name);
|
cg->subsystem, cg->value, d->name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ERROR("Error setting %s to %s for %s",
|
SYSERROR("Error setting %s to %s for %s",
|
||||||
cg->subsystem, cg->value, d->name);
|
cg->subsystem, cg->value, d->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user