cfq-iosched: fix other locations where blkcg_to_cfqgd() can return NULL
authorJens Axboe <axboe@fb.com>
Sat, 20 Jun 2015 16:26:50 +0000 (10:26 -0600)
committerJens Axboe <axboe@fb.com>
Sat, 20 Jun 2015 16:26:50 +0000 (10:26 -0600)
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>
block/cfq-iosched.c

index ed86fb242cd405281978aa50e81fd5ec5c355131..d8ad45ccd8fa784a60dac66d91158eb0c9065b27 100644 (file)
@@ -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,