• Tejun Heo's avatar
    cgroup: fix subsystem file accesses on the root cgroup · 0bfb4aa6
    Tejun Heo authored
    105347ba ("cgroup: make cgroup_file_open() rcu_read_lock() around
    cgroup_css() and add cfent->css") added cfent->css to cache the
    associted cgroup_subsys_state across file operations.
    
    A cfent is associated with single css throughout its lifetime and the
    origimal commit initialized the cache pointer during cgroup_add_file()
    and verified that it matches the actual one in cgroup_file_open().
    While this works fine for !root cgroups, it's broken for root cgroups
    as files in a root cgroup are created before the css's are associated
    with the cgroup and thus cgroup_css() call in cgroup_add_file()
    returns NULL associating all cfents in the root cgroup with NULL css.
    This makes cgroup_file_open() trigger WARN and fail with -ENODEV for
    all !core subsystem files in the root cgroups.
    
    There's no reason to initialize cfent->css separately from
    cgroup_add_file().  As the association never changes,
    cgroup_file_open() can set it unconditionally every time and
    containing the logic in cgroup_file_open() makes more sense anyway as
    the only reason it's necessary is file->private_data being already
    occupied.
    
    Fix it by setting cfent->css unconditionally from cgroup_file_open().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    0bfb4aa6
cgroup.c 158 KB