Commit dcb52201 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

Revert "blk-cgroup: simplify blkg freeing from initialization failure paths"

It turns out this was too soon.  blkg_conf_prep does to funky locking games
with the queue lock for this to work properly.

This reverts commit 27b642b0.
Reported-by: default avatarDan Carpenter <error27@gmail.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230209053523.437927-1-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent c43332fe
...@@ -114,8 +114,10 @@ static bool blkcg_policy_enabled(struct gendisk *disk, ...@@ -114,8 +114,10 @@ static bool blkcg_policy_enabled(struct gendisk *disk,
return pol && test_bit(pol->plid, disk->blkcg_pols); return pol && test_bit(pol->plid, disk->blkcg_pols);
} }
static void blkg_free(struct blkcg_gq *blkg) static void blkg_free_workfn(struct work_struct *work)
{ {
struct blkcg_gq *blkg = container_of(work, struct blkcg_gq,
free_work);
int i; int i;
/* /*
...@@ -140,9 +142,23 @@ static void blkg_free(struct blkcg_gq *blkg) ...@@ -140,9 +142,23 @@ static void blkg_free(struct blkcg_gq *blkg)
kfree(blkg); kfree(blkg);
} }
static void blkg_free_workfn(struct work_struct *work) /**
* blkg_free - free a blkg
* @blkg: blkg to free
*
* Free @blkg which may be partially allocated.
*/
static void blkg_free(struct blkcg_gq *blkg)
{ {
blkg_free(container_of(work, struct blkcg_gq, free_work)); if (!blkg)
return;
/*
* Both ->pd_free_fn() and request queue's release handler may
* sleep, so free us by scheduling one work func
*/
INIT_WORK(&blkg->free_work, blkg_free_workfn);
schedule_work(&blkg->free_work);
} }
static void __blkg_release(struct rcu_head *rcu) static void __blkg_release(struct rcu_head *rcu)
...@@ -153,10 +169,7 @@ static void __blkg_release(struct rcu_head *rcu) ...@@ -153,10 +169,7 @@ static void __blkg_release(struct rcu_head *rcu)
/* release the blkcg and parent blkg refs this blkg has been holding */ /* release the blkcg and parent blkg refs this blkg has been holding */
css_put(&blkg->blkcg->css); css_put(&blkg->blkcg->css);
blkg_free(blkg);
/* ->pd_free_fn() may sleep, so free from a work queue */
INIT_WORK(&blkg->free_work, blkg_free_workfn);
schedule_work(&blkg->free_work);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment