}
        mutex_lock(&cgroup_mutex);
 
-       BUG_ON(root->number_of_cgroups != 1);
+       BUG_ON(atomic_read(&root->nr_cgrps) != 1);
        BUG_ON(!list_empty(&cgrp->children));
 
        /* Rebind all subsystems back to the default hierarchy */
 {
        struct cgroup *cgrp = container_of(work, struct cgroup, destroy_work);
 
-       mutex_lock(&cgroup_mutex);
-       cgrp->root->number_of_cgroups--;
-       mutex_unlock(&cgroup_mutex);
+       atomic_dec(&cgrp->root->nr_cgrps);
 
        /*
         * We get a ref to the parent, and put the ref when this cgroup is
        }
 
        /* remounting is not allowed for populated hierarchies */
-       if (root->number_of_cgroups > 1) {
+       if (!list_empty(&root->top_cgroup.children)) {
                ret = -EBUSY;
                goto out_unlock;
        }
 
        atomic_set(&root->refcnt, 1);
        INIT_LIST_HEAD(&root->root_list);
-       root->number_of_cgroups = 1;
+       atomic_set(&root->nr_cgrps, 1);
        cgrp->root = root;
        init_cgroup_housekeeping(cgrp);
        idr_init(&root->cgroup_idr);
        write_unlock(&css_set_lock);
 
        BUG_ON(!list_empty(&root_cgrp->children));
-       BUG_ON(root->number_of_cgroups != 1);
+       BUG_ON(atomic_read(&root->nr_cgrps) != 1);
 
        kernfs_activate(root_cgrp->kn);
        ret = 0;
 
        /* allocation complete, commit to creation */
        list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children);
-       root->number_of_cgroups++;
+       atomic_inc(&root->nr_cgrps);
 
        /*
         * Grab a reference on the root and parent so that they don't get
        for_each_subsys(ss, i)
                seq_printf(m, "%s\t%d\t%d\t%d\n",
                           ss->name, ss->root->hierarchy_id,
-                          ss->root->number_of_cgroups, !ss->disabled);
+                          atomic_read(&ss->root->nr_cgrps), !ss->disabled);
 
        mutex_unlock(&cgroup_mutex);
        return 0;