Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae994ea9 authored by Jens Axboe's avatar Jens Axboe
Browse files

cfq-iosched: fix other locations where blkcg_to_cfqgd() can return NULL



Commit 9470e4a6 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: default avatarJens Axboe <axboe@fb.com>
parent 9470e4a6
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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,