summaryrefslogtreecommitdiffstats
path: root/mm/backing-dev.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-03-22 20:36:55 -0400
committerJens Axboe <axboe@fb.com>2017-03-22 22:11:25 -0400
commit810df54a64fb7841d6511f67818f3e1589c249a2 (patch)
treee74df014f39f898484c99a1c548bf3d14f9254fc /mm/backing-dev.c
parentb7d680d7bf584bce6023343304b819009a7c3336 (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.c13
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);
336out_put_cong: 340out_put_cong:
337 wb_congested_put(wb->congested); 341 wb_congested_put(wb->congested);
342out_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