diff options
author | Tejun Heo <tj@kernel.org> | 2019-10-15 09:03:47 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-10-15 10:13:00 -0600 |
commit | 9d179b865449b351ad5cb76dbea480c9170d4a27 (patch) | |
tree | ebce8fe05f478889be94075edf4e75e34763e349 /block/Kconfig.iosched | |
parent | 5da0fb1ab34ccfe6d49210b4f5a739c59fcbf25e (diff) |
blkcg: Fix multiple bugs in blkcg_activate_policy()
blkcg_activate_policy() has the following bugs.
* cf09a8ee19ad ("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: Tejun Heo <tj@kernel.org>
Fixes: cf09a8ee19ad ("blkcg: pass @q and @blkcg into blkcg_pol_alloc_pd_fn()")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/Kconfig.iosched')
0 files changed, 0 insertions, 0 deletions