• T
    cgroup: fix cgroupfs_root early destruction path · 1672d040
    Tejun Heo 提交于
    cgroupfs_root used to have ->actual_subsys_mask in addition to
    ->subsys_mask.  a8a648c4 ("cgroup: remove
    cgroup->actual_subsys_mask") removed it noting that the subsys_mask is
    essentially temporary and doesn't belong in cgroupfs_root; however,
    the patch made it impossible to tell whether a cgroupfs_root actually
    has the subsystems bound or just have the bits set leading to the
    following BUG when trying to mount with subsystems which are already
    mounted elsewhere.
    
     kernel BUG at kernel/cgroup.c:1038!
     invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
     ...
     CPU: 1 PID: 7973 Comm: mount Tainted: G        W    3.10.0-rc7-next-20130625-sasha-00011-g1c1dc0e #1105
     task: ffff880fc0ae8000 ti: ffff880fc0b9a000 task.ti: ffff880fc0b9a000
     RIP: 0010:[<ffffffff81249b29>]  [<ffffffff81249b29>] rebind_subsystems+0x409/0x5f0
     ...
     Call Trace:
      [<ffffffff8124bd4f>] cgroup_kill_sb+0xff/0x210
      [<ffffffff813d21af>] deactivate_locked_super+0x4f/0x90
      [<ffffffff8124f3b3>] cgroup_mount+0x673/0x6e0
      [<ffffffff81257169>] cpuset_mount+0xd9/0x110
      [<ffffffff813d2580>] mount_fs+0xb0/0x2d0
      [<ffffffff81404afd>] vfs_kern_mount+0xbd/0x180
      [<ffffffff814070b5>] do_new_mount+0x145/0x2c0
      [<ffffffff814085d6>] do_mount+0x356/0x3c0
      [<ffffffff8140873d>] SyS_mount+0xfd/0x140
      [<ffffffff854eb600>] tracesys+0xdd/0xe2
    
    We still want rebind_subsystems() to take added/removed masks, so
    let's fix it by marking whether a cgroupfs_root has finished binding
    or not.  Also, document what's going on around ->subsys_mask
    initialization so that similar mistakes aren't repeated.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reported-by: NSasha Levin <sasha.levin@oracle.com>
    Acked-by: NLi Zefan <lizefan@huawei.com>
    1672d040
cgroup.c 151.5 KB