*/
 static void unlink_css_set(struct css_set *cg)
 {
+       struct cg_cgroup_link *link;
+       struct cg_cgroup_link *saved_link;
+
        write_lock(&css_set_lock);
        hlist_del(&cg->hlist);
        css_set_count--;
-       while (!list_empty(&cg->cg_links)) {
-               struct cg_cgroup_link *link;
-               link = list_entry(cg->cg_links.next,
-                                 struct cg_cgroup_link, cg_link_list);
+
+       list_for_each_entry_safe(link, saved_link, &cg->cg_links,
+                                cg_link_list) {
                list_del(&link->cg_link_list);
                list_del(&link->cgrp_link_list);
                kfree(link);
        }
+
        write_unlock(&css_set_lock);
 }
 
 static int allocate_cg_links(int count, struct list_head *tmp)
 {
        struct cg_cgroup_link *link;
+       struct cg_cgroup_link *saved_link;
        int i;
        INIT_LIST_HEAD(tmp);
        for (i = 0; i < count; i++) {
                link = kmalloc(sizeof(*link), GFP_KERNEL);
                if (!link) {
-                       while (!list_empty(tmp)) {
-                               link = list_entry(tmp->next,
-                                                 struct cg_cgroup_link,
-                                                 cgrp_link_list);
+                       list_for_each_entry_safe(link, saved_link, tmp,
+                                                cgrp_link_list) {
                                list_del(&link->cgrp_link_list);
                                kfree(link);
                        }
 
 static void free_cg_links(struct list_head *tmp)
 {
-       while (!list_empty(tmp)) {
-               struct cg_cgroup_link *link;
-               link = list_entry(tmp->next,
-                                 struct cg_cgroup_link,
-                                 cgrp_link_list);
+       struct cg_cgroup_link *link;
+       struct cg_cgroup_link *saved_link;
+
+       list_for_each_entry_safe(link, saved_link, tmp, cgrp_link_list) {
                list_del(&link->cgrp_link_list);
                kfree(link);
        }
        struct cgroupfs_root *root = sb->s_fs_info;
        struct cgroup *cgrp = &root->top_cgroup;
        int ret;
+       struct cg_cgroup_link *link;
+       struct cg_cgroup_link *saved_link;
 
        BUG_ON(!root);
 
         * root cgroup
         */
        write_lock(&css_set_lock);
-       while (!list_empty(&cgrp->css_sets)) {
-               struct cg_cgroup_link *link;
-               link = list_entry(cgrp->css_sets.next,
-                                 struct cg_cgroup_link, cgrp_link_list);
+
+       list_for_each_entry_safe(link, saved_link, &cgrp->css_sets,
+                                cgrp_link_list) {
                list_del(&link->cg_link_list);
                list_del(&link->cgrp_link_list);
                kfree(link);
 int cgroup_task_count(const struct cgroup *cgrp)
 {
        int count = 0;
-       struct list_head *l;
+       struct cg_cgroup_link *link;
 
        read_lock(&css_set_lock);
-       l = cgrp->css_sets.next;
-       while (l != &cgrp->css_sets) {
-               struct cg_cgroup_link *link =
-                       list_entry(l, struct cg_cgroup_link, cgrp_link_list);
+       list_for_each_entry(link, &cgrp->css_sets, cgrp_link_list) {
                count += atomic_read(&link->cg->ref.refcount);
-               l = l->next;
        }
        read_unlock(&css_set_lock);
        return count;