static noinline_for_stack
 void free_reloc_roots(struct list_head *list)
 {
-       struct btrfs_root *reloc_root;
+       struct btrfs_root *reloc_root, *tmp;
 
-       while (!list_empty(list)) {
-               reloc_root = list_entry(list->next, struct btrfs_root,
-                                       root_list);
+       list_for_each_entry_safe(reloc_root, tmp, list, root_list)
                __del_reloc_root(reloc_root);
-       }
 }
 
 static noinline_for_stack
 out:
        if (ret) {
                btrfs_handle_fs_error(fs_info, ret, NULL);
-               if (!list_empty(&reloc_roots))
-                       free_reloc_roots(&reloc_roots);
+               free_reloc_roots(&reloc_roots);
 
                /* new reloc root may be added */
                mutex_lock(&fs_info->reloc_mutex);
                list_splice_init(&rc->reloc_roots, &reloc_roots);
                mutex_unlock(&fs_info->reloc_mutex);
-               if (!list_empty(&reloc_roots))
-                       free_reloc_roots(&reloc_roots);
+               free_reloc_roots(&reloc_roots);
        }
 
        /*
        unset_reloc_control(rc);
        free_reloc_control(rc);
 out:
-       if (!list_empty(&reloc_roots))
-               free_reloc_roots(&reloc_roots);
+       free_reloc_roots(&reloc_roots);
 
        btrfs_free_path(path);