diff options
author | Jan Kara <jack@suse.cz> | 2017-03-22 20:36:55 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-03-22 22:11:25 -0400 |
commit | 810df54a64fb7841d6511f67818f3e1589c249a2 (patch) | |
tree | e74df014f39f898484c99a1c548bf3d14f9254fc /mm/backing-dev.c | |
parent | b7d680d7bf584bce6023343304b819009a7c3336 (diff) |
bdi: Make wb->bdi a proper reference
Make wb->bdi a proper refcounted reference to bdi for all bdi_writeback
structures except for the one embedded inside struct backing_dev_info.
That will allow us to simplify bdi unregistration.
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 12408f86783c..03d4ba27c133 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -294,6 +294,8 @@ static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi, | |||
294 | 294 | ||
295 | memset(wb, 0, sizeof(*wb)); | 295 | memset(wb, 0, sizeof(*wb)); |
296 | 296 | ||
297 | if (wb != &bdi->wb) | ||
298 | bdi_get(bdi); | ||
297 | wb->bdi = bdi; | 299 | wb->bdi = bdi; |
298 | wb->last_old_flush = jiffies; | 300 | wb->last_old_flush = jiffies; |
299 | INIT_LIST_HEAD(&wb->b_dirty); | 301 | INIT_LIST_HEAD(&wb->b_dirty); |
@@ -314,8 +316,10 @@ static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi, | |||
314 | wb->dirty_sleep = jiffies; | 316 | wb->dirty_sleep = jiffies; |
315 | 317 | ||
316 | wb->congested = wb_congested_get_create(bdi, blkcg_id, gfp); | 318 | wb->congested = wb_congested_get_create(bdi, blkcg_id, gfp); |
317 | if (!wb->congested) | 319 | if (!wb->congested) { |
318 | return -ENOMEM; | 320 | err = -ENOMEM; |
321 | goto out_put_bdi; | ||
322 | } | ||
319 | 323 | ||
320 | err = fprop_local_init_percpu(&wb->completions, gfp); | 324 | err = fprop_local_init_percpu(&wb->completions, gfp); |
321 | if (err) | 325 | if (err) |
@@ -335,6 +339,9 @@ out_destroy_stat: | |||
335 | fprop_local_destroy_percpu(&wb->completions); | 339 | fprop_local_destroy_percpu(&wb->completions); |
336 | out_put_cong: | 340 | out_put_cong: |
337 | wb_congested_put(wb->congested); | 341 | wb_congested_put(wb->congested); |
342 | out_put_bdi: | ||
343 | if (wb != &bdi->wb) | ||
344 | bdi_put(bdi); | ||
338 | return err; | 345 | return err; |
339 | } | 346 | } |
340 | 347 | ||
@@ -372,6 +379,8 @@ static void wb_exit(struct bdi_writeback *wb) | |||
372 | 379 | ||
373 | fprop_local_destroy_percpu(&wb->completions); | 380 | fprop_local_destroy_percpu(&wb->completions); |
374 | wb_congested_put(wb->congested); | 381 | wb_congested_put(wb->congested); |
382 | if (wb != &wb->bdi->wb) | ||
383 | bdi_put(wb->bdi); | ||
375 | } | 384 | } |
376 | 385 | ||
377 | #ifdef CONFIG_CGROUP_WRITEBACK | 386 | #ifdef CONFIG_CGROUP_WRITEBACK |