|
@@ -294,6 +294,8 @@ static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi,
|
|
|
|
|
|
memset(wb, 0, sizeof(*wb));
|
|
memset(wb, 0, sizeof(*wb));
|
|
|
|
|
|
|
|
+ if (wb != &bdi->wb)
|
|
|
|
+ bdi_get(bdi);
|
|
wb->bdi = bdi;
|
|
wb->bdi = bdi;
|
|
wb->last_old_flush = jiffies;
|
|
wb->last_old_flush = jiffies;
|
|
INIT_LIST_HEAD(&wb->b_dirty);
|
|
INIT_LIST_HEAD(&wb->b_dirty);
|
|
@@ -314,8 +316,10 @@ static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi,
|
|
wb->dirty_sleep = jiffies;
|
|
wb->dirty_sleep = jiffies;
|
|
|
|
|
|
wb->congested = wb_congested_get_create(bdi, blkcg_id, gfp);
|
|
wb->congested = wb_congested_get_create(bdi, blkcg_id, gfp);
|
|
- if (!wb->congested)
|
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ if (!wb->congested) {
|
|
|
|
+ err = -ENOMEM;
|
|
|
|
+ goto out_put_bdi;
|
|
|
|
+ }
|
|
|
|
|
|
err = fprop_local_init_percpu(&wb->completions, gfp);
|
|
err = fprop_local_init_percpu(&wb->completions, gfp);
|
|
if (err)
|
|
if (err)
|
|
@@ -335,6 +339,9 @@ out_destroy_stat:
|
|
fprop_local_destroy_percpu(&wb->completions);
|
|
fprop_local_destroy_percpu(&wb->completions);
|
|
out_put_cong:
|
|
out_put_cong:
|
|
wb_congested_put(wb->congested);
|
|
wb_congested_put(wb->congested);
|
|
|
|
+out_put_bdi:
|
|
|
|
+ if (wb != &bdi->wb)
|
|
|
|
+ bdi_put(bdi);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -372,6 +379,8 @@ static void wb_exit(struct bdi_writeback *wb)
|
|
|
|
|
|
fprop_local_destroy_percpu(&wb->completions);
|
|
fprop_local_destroy_percpu(&wb->completions);
|
|
wb_congested_put(wb->congested);
|
|
wb_congested_put(wb->congested);
|
|
|
|
+ if (wb != &wb->bdi->wb)
|
|
|
|
+ bdi_put(wb->bdi);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_CGROUP_WRITEBACK
|
|
#ifdef CONFIG_CGROUP_WRITEBACK
|