diff options
author | Tejun Heo <tj@kernel.org> | 2015-08-18 23:55:07 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-08-19 00:49:16 +0200 |
commit | 994b78327458ea14a1743196ee0560c73ace37f3 (patch) | |
tree | 00b10beb44185de1f5739e7c393959ce268c3296 | |
parent | blkcg: remove unnecessary request_list->blkg NULL test in blk_put_rl() (diff) | |
download | linux-994b78327458ea14a1743196ee0560c73ace37f3.tar.xz linux-994b78327458ea14a1743196ee0560c73ace37f3.zip |
blkcg: use blkg_free() in blkcg_init_queue() failure path
When blkcg_init_queue() fails midway after creating a new blkg, it
performs kfree() directly; however, this doesn't free the policy data
areas. Make it use blkg_free() instead. In turn, blkg_free() is
updated to handle root request_list special case.
While this fixes a possible memory leak, it's on an unlikely failure
path of an already cold path and the size leaked per occurrence is
miniscule too. I don't think it needs to be tagged for -stable.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | block/blk-cgroup.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 1db904f95502..cd251830038a 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -70,7 +70,8 @@ static void blkg_free(struct blkcg_gq *blkg) for (i = 0; i < BLKCG_MAX_POLS; i++) kfree(blkg->pd[i]); - blk_exit_rl(&blkg->rl); + if (blkg->blkcg != &blkcg_root) + blk_exit_rl(&blkg->rl); kfree(blkg); } @@ -938,7 +939,7 @@ int blkcg_init_queue(struct request_queue *q) radix_tree_preload_end(); if (IS_ERR(blkg)) { - kfree(new_blkg); + blkg_free(new_blkg); return PTR_ERR(blkg); } |