• Tejun Heo's avatar
    cgroup: make rebind_subsystems() handle file additions and removals with proper error handling · 3126121f
    Tejun Heo authored
    Currently, creating and removing cgroup files in the root directory
    are handled separately from the actual subsystem binding and unbinding
    which happens in rebind_subsystems().  Also, rebind_subsystems() users
    aren't handling file creation errors properly.  Let's integrate
    top_cgroup file handling into rebind_subsystems() so that it's simpler
    to use and everyone handles file creation errors correctly.
    
    * On a successful return, rebind_subsystems() is guaranteed to have
      created all files of the new subsystems and deleted the ones
      belonging to the removed subsystems.  After a failure, no file is
      created or removed.
    
    * cgroup_remount() no longer needs to make explicit populate/clear
      calls as it's all handled by rebind_subsystems(), and it gets proper
      error handling automatically.
    
    * cgroup_mount() has been updated such that the root dentry and cgroup
      are linked before rebind_subsystems().  Also, the init_cred dancing
      and base file handling are moved right above rebind_subsystems()
      call and proper error handling for the base files is added.  While
      at it, add a comment explaining what's going on with the cred thing.
    
    * cgroup_kill_sb() calls rebind_subsystems() to unbind all subsystems
      which now implies removing all subsystem files which requires the
      directory's i_mutex.  Grab it.  This means that files on the root
      cgroup are removed earlier - they used to be deleted from generic
      super_block cleanup from vfs.  This doesn't lead to any functional
      difference and it's cleaner to do the clean up explicitly for all
      files.
    
    Combined with the previous changes, this makes all cgroup file
    creation errors handled correctly.
    
    v2: Added comment on init_cred.
    
    v3: Li spotted that cgroup_mount() wasn't freeing tmp_links after base
        file addition failure.  Fix it by adding free_tmp_links error
        handling label.
    
    v4: v3 introduced build bugs which got noticed by Fengguang's awesome
        kbuild test robot.  Fixed, and shame on me.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    Cc: Fengguang Wu <fengguang.wu@intel.com>
    3126121f
cgroup.c 153 KB