|
@@ -1646,7 +1646,9 @@ static inline struct cftype *__d_cft(struct dentry *dentry)
|
|
|
int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen)
|
|
|
{
|
|
|
char *start;
|
|
|
- struct dentry *dentry = rcu_dereference(cgrp->dentry);
|
|
|
+ struct dentry *dentry = rcu_dereference_check(cgrp->dentry,
|
|
|
+ rcu_read_lock_held() ||
|
|
|
+ cgroup_lock_is_held());
|
|
|
|
|
|
if (!dentry || cgrp == dummytop) {
|
|
|
/*
|
|
@@ -1662,13 +1664,17 @@ int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen)
|
|
|
*--start = '\0';
|
|
|
for (;;) {
|
|
|
int len = dentry->d_name.len;
|
|
|
+
|
|
|
if ((start -= len) < buf)
|
|
|
return -ENAMETOOLONG;
|
|
|
- memcpy(start, cgrp->dentry->d_name.name, len);
|
|
|
+ memcpy(start, dentry->d_name.name, len);
|
|
|
cgrp = cgrp->parent;
|
|
|
if (!cgrp)
|
|
|
break;
|
|
|
- dentry = rcu_dereference(cgrp->dentry);
|
|
|
+
|
|
|
+ dentry = rcu_dereference_check(cgrp->dentry,
|
|
|
+ rcu_read_lock_held() ||
|
|
|
+ cgroup_lock_is_held());
|
|
|
if (!cgrp->parent)
|
|
|
continue;
|
|
|
if (--start < buf)
|
|
@@ -4555,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))
|