}
        }
 
-       list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children);
-       root->number_of_cgroups++;
-
+       /*
+        * Create directory.  cgroup_create_file() returns with the new
+        * directory locked on success so that it can be populated without
+        * dropping cgroup_mutex.
+        */
        err = cgroup_create_file(dentry, S_IFDIR | mode, sb);
        if (err < 0)
-               goto err_remove;
+               goto err_destroy;
+       lockdep_assert_held(&dentry->d_inode->i_mutex);
 
+       /* allocation complete, commit to creation */
        dentry->d_fsdata = cgrp;
        rcu_assign_pointer(cgrp->dentry, dentry);
+       list_add_tail(&cgrp->allcg_node, &root->allcg_list);
+       list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children);
+       root->number_of_cgroups++;
 
        for_each_subsys(root, ss) {
                /* each css holds a ref to the cgroup's dentry */
                        ss->post_create(cgrp);
        }
 
-       /* The cgroup directory was pre-locked for us */
-       BUG_ON(!mutex_is_locked(&cgrp->dentry->d_inode->i_mutex));
-
-       list_add_tail(&cgrp->allcg_node, &root->allcg_list);
-
        err = cgroup_populate_dir(cgrp, true, root->subsys_mask);
        /* If err < 0, we have a half-filled directory - oh well ;) */
 
 
        return 0;
 
- err_remove:
-
-       list_del_rcu(&cgrp->sibling);
-       root->number_of_cgroups--;
-
- err_destroy:
-
+err_destroy:
        for_each_subsys(root, ss) {
                if (cgrp->subsys[ss->subsys_id])
                        ss->destroy(cgrp);
        }
-
        mutex_unlock(&cgroup_mutex);
-
        /* Release the reference count that we took on the superblock */
        deactivate_super(sb);
 err_free: