diff options
author | Jens Axboe <axboe@fb.com> | 2015-06-20 10:26:50 -0600 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-06-20 10:26:50 -0600 |
commit | ae994ea972473c0ace9d55f718b60f0727af1381 (patch) | |
tree | 4f8f4de062db1d65af8480f2d04414b16aa2e168 | |
parent | 9470e4a693db84bee7becbba8de01af02bb23c9f (diff) | |
download | op-kernel-dev-ae994ea972473c0ace9d55f718b60f0727af1381.zip op-kernel-dev-ae994ea972473c0ace9d55f718b60f0727af1381.tar.gz |
cfq-iosched: fix other locations where blkcg_to_cfqgd() can return NULL
Commit 9470e4a693db only covered the initial bug report, there are
other spots in CFQ where we need to check that we actually have
a valid cfq_group_data structure.
Fixes: e48453c3 ("block, cgroup: implement policy-specific per-blkcg data")
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | block/cfq-iosched.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index ed86fb2..d8ad45ccd 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -1754,6 +1754,9 @@ static ssize_t __cfqg_set_weight_device(struct kernfs_open_file *of, ret = -EINVAL; cfqg = blkg_to_cfqg(ctx.blkg); cfqgd = blkcg_to_cfqgd(blkcg); + if (!cfqg || !cfqgd) + goto err; + if (!ctx.v || (ctx.v >= CFQ_WEIGHT_MIN && ctx.v <= CFQ_WEIGHT_MAX)) { if (!is_leaf_weight) { cfqg->dev_weight = ctx.v; @@ -1765,6 +1768,7 @@ static ssize_t __cfqg_set_weight_device(struct kernfs_open_file *of, ret = 0; } +err: blkg_conf_finish(&ctx); return ret ?: nbytes; } @@ -1787,12 +1791,17 @@ static int __cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft, struct blkcg *blkcg = css_to_blkcg(css); struct blkcg_gq *blkg; struct cfq_group_data *cfqgd; + int ret = 0; if (val < CFQ_WEIGHT_MIN || val > CFQ_WEIGHT_MAX) return -EINVAL; spin_lock_irq(&blkcg->lock); cfqgd = blkcg_to_cfqgd(blkcg); + if (!cfqgd) { + ret = -EINVAL; + goto out; + } if (!is_leaf_weight) cfqgd->weight = val; @@ -1814,8 +1823,9 @@ static int __cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft, } } +out: spin_unlock_irq(&blkcg->lock); - return 0; + return ret; } static int cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft, |