Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 994b7832 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 401efbf8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ static void blkg_free(struct blkcg_gq *blkg)
	for (i = 0; i < BLKCG_MAX_POLS; i++)
		kfree(blkg->pd[i]);

	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);
	}