浏览代码

blk-cgroup: Fix an RCU warning in blkiocg_create()

with CONFIG_PROVE_RCU=y, a warning can be triggered:

  # mount -t cgroup -o blkio xxx /mnt
  # mkdir /mnt/subgroup

...
kernel/cgroup.c:4442 invoked rcu_dereference_check() without protection!
...

To fix this, we avoid caling css_depth() here, which is a bit simpler
than the original code.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Li Zefan 15 年之前
父节点
当前提交
0341509fdf
共有 1 个文件被更改,包括 4 次插入4 次删除
  1. 4 4
      block/blk-cgroup.c

+ 4 - 4
block/blk-cgroup.c

@@ -286,16 +286,16 @@ done:
 static struct cgroup_subsys_state *
 static struct cgroup_subsys_state *
 blkiocg_create(struct cgroup_subsys *subsys, struct cgroup *cgroup)
 blkiocg_create(struct cgroup_subsys *subsys, struct cgroup *cgroup)
 {
 {
-	struct blkio_cgroup *blkcg, *parent_blkcg;
+	struct blkio_cgroup *blkcg;
+	struct cgroup *parent = cgroup->parent;
 
 
-	if (!cgroup->parent) {
+	if (!parent) {
 		blkcg = &blkio_root_cgroup;
 		blkcg = &blkio_root_cgroup;
 		goto done;
 		goto done;
 	}
 	}
 
 
 	/* Currently we do not support hierarchy deeper than two level (0,1) */
 	/* Currently we do not support hierarchy deeper than two level (0,1) */
-	parent_blkcg = cgroup_to_blkio_cgroup(cgroup->parent);
-	if (css_depth(&parent_blkcg->css) > 0)
+	if (parent != cgroup->top_cgroup)
 		return ERR_PTR(-EINVAL);
 		return ERR_PTR(-EINVAL);
 
 
 	blkcg = kzalloc(sizeof(*blkcg), GFP_KERNEL);
 	blkcg = kzalloc(sizeof(*blkcg), GFP_KERNEL);