Skip to content

Commit

Permalink
cfq-iosched: fix other locations where blkcg_to_cfqgd() can return NULL
Browse files Browse the repository at this point in the history
Commit 9470e4a 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: e48453c ("block, cgroup: implement policy-specific per-blkcg data")
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Jun 20, 2015
1 parent 9470e4a commit ae994ea
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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;
Expand All @@ -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,
Expand Down

0 comments on commit ae994ea

Please sign in to comment.