diff options
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index f5981e9d6ae2..8a8bb8796c6c 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -491,6 +491,7 @@ static void cgwb_release_workfn(struct work_struct *work) | |||
491 | { | 491 | { |
492 | struct bdi_writeback *wb = container_of(work, struct bdi_writeback, | 492 | struct bdi_writeback *wb = container_of(work, struct bdi_writeback, |
493 | release_work); | 493 | release_work); |
494 | struct blkcg *blkcg = css_to_blkcg(wb->blkcg_css); | ||
494 | 495 | ||
495 | mutex_lock(&wb->bdi->cgwb_release_mutex); | 496 | mutex_lock(&wb->bdi->cgwb_release_mutex); |
496 | wb_shutdown(wb); | 497 | wb_shutdown(wb); |
@@ -499,6 +500,9 @@ static void cgwb_release_workfn(struct work_struct *work) | |||
499 | css_put(wb->blkcg_css); | 500 | css_put(wb->blkcg_css); |
500 | mutex_unlock(&wb->bdi->cgwb_release_mutex); | 501 | mutex_unlock(&wb->bdi->cgwb_release_mutex); |
501 | 502 | ||
503 | /* triggers blkg destruction if cgwb_refcnt becomes zero */ | ||
504 | blkcg_cgwb_put(blkcg); | ||
505 | |||
502 | fprop_local_destroy_percpu(&wb->memcg_completions); | 506 | fprop_local_destroy_percpu(&wb->memcg_completions); |
503 | percpu_ref_exit(&wb->refcnt); | 507 | percpu_ref_exit(&wb->refcnt); |
504 | wb_exit(wb); | 508 | wb_exit(wb); |
@@ -597,6 +601,7 @@ static int cgwb_create(struct backing_dev_info *bdi, | |||
597 | list_add_tail_rcu(&wb->bdi_node, &bdi->wb_list); | 601 | list_add_tail_rcu(&wb->bdi_node, &bdi->wb_list); |
598 | list_add(&wb->memcg_node, memcg_cgwb_list); | 602 | list_add(&wb->memcg_node, memcg_cgwb_list); |
599 | list_add(&wb->blkcg_node, blkcg_cgwb_list); | 603 | list_add(&wb->blkcg_node, blkcg_cgwb_list); |
604 | blkcg_cgwb_get(blkcg); | ||
600 | css_get(memcg_css); | 605 | css_get(memcg_css); |
601 | css_get(blkcg_css); | 606 | css_get(blkcg_css); |
602 | } | 607 | } |