From: Tejun Heo Date: Tue, 18 Aug 2015 21:55:07 +0000 (-0700) Subject: blkcg: use blkg_free() in blkcg_init_queue() failure path X-Git-Tag: v4.3-rc1~21^2~29 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=994b78327458ea14a1743196ee0560c73ace37f3;p=karo-tx-linux.git 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 Cc: Vivek Goyal Signed-off-by: Jens Axboe --- 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); }