]> xenbits.xensource.com Git - people/pauldu/linux.git/commitdiff
btrfs: qgroup: use qgroup_iterator in btrfs_qgroup_free_refroot()
authorQu Wenruo <wqu@suse.com>
Sat, 2 Sep 2023 00:13:53 +0000 (08:13 +0800)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Oct 2023 14:44:03 +0000 (16:44 +0200)
With the new qgroup_iterator_add() and qgroup_iterator_clean(), we can
get rid of the ulist and its GFP_ATOMIC memory allocation.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/qgroup.c

index b9a0bab88080ea3c29636ed5ac1ea10de5331a0b..0a136c51a6edb49c7f1c4de2d347f9783fca007c 100644 (file)
@@ -3204,9 +3204,7 @@ void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info,
                               enum btrfs_qgroup_rsv_type type)
 {
        struct btrfs_qgroup *qgroup;
-       struct ulist_node *unode;
-       struct ulist_iterator uiter;
-       int ret = 0;
+       LIST_HEAD(qgroup_list);
 
        if (!is_fstree(ref_root))
                return;
@@ -3234,30 +3232,17 @@ void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info,
                 */
                num_bytes = qgroup->rsv.values[type];
 
-       ulist_reinit(fs_info->qgroup_ulist);
-       ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid,
-                       qgroup_to_aux(qgroup), GFP_ATOMIC);
-       if (ret < 0)
-               goto out;
-       ULIST_ITER_INIT(&uiter);
-       while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) {
-               struct btrfs_qgroup *qg;
+       qgroup_iterator_add(&qgroup_list, qgroup);
+       list_for_each_entry(qgroup, &qgroup_list, iterator) {
                struct btrfs_qgroup_list *glist;
 
-               qg = unode_aux_to_qgroup(unode);
-
-               qgroup_rsv_release(fs_info, qg, num_bytes, type);
-
-               list_for_each_entry(glist, &qg->groups, next_group) {
-                       ret = ulist_add(fs_info->qgroup_ulist,
-                                       glist->group->qgroupid,
-                                       qgroup_to_aux(glist->group), GFP_ATOMIC);
-                       if (ret < 0)
-                               goto out;
+               qgroup_rsv_release(fs_info, qgroup, num_bytes, type);
+               list_for_each_entry(glist, &qgroup->groups, next_group) {
+                       qgroup_iterator_add(&qgroup_list, glist->group);
                }
        }
-
 out:
+       qgroup_iterator_clean(&qgroup_list);
        spin_unlock(&fs_info->qgroup_lock);
 }