cgroup: Fix an RCU warning in alloc_css_id()
authorLi Zefan <lizf@cn.fujitsu.com>
Thu, 22 Apr 2010 09:30:00 +0000 (17:30 +0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 4 May 2010 16:25:00 +0000 (09:25 -0700)
With CONFIG_PROVE_RCU=y, a warning can be triggered:

  # mount -t cgroup -o memory xxx /mnt
  # mkdir /mnt/0

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

This is a false-positive. It's safe to directly access parent_css->id.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/cgroup.c

index 4ca928db890c8801074b71544be4b8385d730bff..3a53c771e5030a8c95ba0715ed16010f0e015f6e 100644 (file)
@@ -4561,13 +4561,13 @@ static int alloc_css_id(struct cgroup_subsys *ss, struct cgroup *parent,
 {
        int subsys_id, i, depth = 0;
        struct cgroup_subsys_state *parent_css, *child_css;
-       struct css_id *child_id, *parent_id = NULL;
+       struct css_id *child_id, *parent_id;
 
        subsys_id = ss->subsys_id;
        parent_css = parent->subsys[subsys_id];
        child_css = child->subsys[subsys_id];
-       depth = css_depth(parent_css) + 1;
        parent_id = parent_css->id;
+       depth = parent_id->depth;
 
        child_id = get_new_cssid(ss, depth);
        if (IS_ERR(child_id))