|
@@ -2763,10 +2763,7 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add)
|
|
|
*/
|
|
|
update_before = cgroup_serial_nr_next;
|
|
|
|
|
|
- mutex_unlock(&cgroup_mutex);
|
|
|
-
|
|
|
/* add/rm files for all cgroups created before */
|
|
|
- rcu_read_lock();
|
|
|
css_for_each_descendant_pre(css, cgroup_css(root, ss)) {
|
|
|
struct cgroup *cgrp = css->cgroup;
|
|
|
|
|
@@ -2775,23 +2772,19 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add)
|
|
|
|
|
|
inode = cgrp->dentry->d_inode;
|
|
|
dget(cgrp->dentry);
|
|
|
- rcu_read_unlock();
|
|
|
-
|
|
|
dput(prev);
|
|
|
prev = cgrp->dentry;
|
|
|
|
|
|
+ mutex_unlock(&cgroup_mutex);
|
|
|
mutex_lock(&inode->i_mutex);
|
|
|
mutex_lock(&cgroup_mutex);
|
|
|
if (cgrp->serial_nr < update_before && !cgroup_is_dead(cgrp))
|
|
|
ret = cgroup_addrm_files(cgrp, cfts, is_add);
|
|
|
- mutex_unlock(&cgroup_mutex);
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
-
|
|
|
- rcu_read_lock();
|
|
|
if (ret)
|
|
|
break;
|
|
|
}
|
|
|
- rcu_read_unlock();
|
|
|
+ mutex_unlock(&cgroup_mutex);
|
|
|
dput(prev);
|
|
|
deactivate_super(sb);
|
|
|
return ret;
|