• Tejun Heo's avatar
    blkcg: Fix multiple bugs in blkcg_activate_policy() · 9d179b86
    Tejun Heo authored
    blkcg_activate_policy() has the following bugs.
    
    * cf09a8ee ("blkcg: pass @q and @blkcg into
      blkcg_pol_alloc_pd_fn()") added @blkcg to ->pd_alloc_fn(); however,
      blkcg_activate_policy() ends up using pd's allocated for the root
      blkcg for all preallocations, so ->pd_init_fn() for non-root blkcgs
      can be passed in pd's which are allocated for the root blkcg.
    
      For blk-iocost, this means that ->pd_init_fn() can write beyond the
      end of the allocated object as it determines the length of the flex
      array at the end based on the blkcg's nesting level.
    
    * Each pd is initialized as they get allocated.  If alloc fails, the
      policy will get freed with pd's initialized on it.
    
    * After the above partial failure, the partial pds are not freed.
    
    This patch fixes all the above issues by
    
    * Restructuring blkcg_activate_policy() so that alloc and init passes
      are separate.  Init takes place only after all allocs succeeded and
      on failure all allocated pds are freed.
    
    * Unifying and fixing the cleanup of the remaining pd_prealloc.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Fixes: cf09a8ee ("blkcg: pass @q and @blkcg into blkcg_pol_alloc_pd_fn()")
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    9d179b86
blk-cgroup.c 47.8 KB