btrfs: qgroup: use qgroup_iterator in qgroup_convert_meta()
authorQu Wenruo <wqu@suse.com>
Sat, 2 Sep 2023 00:13:54 +0000 (08:13 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jan 2024 12:42:24 +0000 (12:42 +0000)
[ Upstream commit 0913445082496c2b29668ee26521401b273838b8 ]

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>
Stable-dep-of: b321a52cce06 ("btrfs: free qgroup pertrans reserve on transaction abort")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/qgroup.c

index 32e5def..0d2212f 100644 (file)
@@ -4106,9 +4106,7 @@ static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root,
                                int num_bytes)
 {
        struct btrfs_qgroup *qgroup;
-       struct ulist_node *unode;
-       struct ulist_iterator uiter;
-       int ret = 0;
+       LIST_HEAD(qgroup_list);
 
        if (num_bytes == 0)
                return;
@@ -4119,31 +4117,21 @@ static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root,
        qgroup = find_qgroup_rb(fs_info, ref_root);
        if (!qgroup)
                goto out;
-       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;
-               struct btrfs_qgroup_list *glist;
 
-               qg = unode_aux_to_qgroup(unode);
+       qgroup_iterator_add(&qgroup_list, qgroup);
+       list_for_each_entry(qgroup, &qgroup_list, iterator) {
+               struct btrfs_qgroup_list *glist;
 
-               qgroup_rsv_release(fs_info, qg, num_bytes,
+               qgroup_rsv_release(fs_info, qgroup, num_bytes,
                                BTRFS_QGROUP_RSV_META_PREALLOC);
-               qgroup_rsv_add(fs_info, qg, num_bytes,
+               qgroup_rsv_add(fs_info, qgroup, num_bytes,
                                BTRFS_QGROUP_RSV_META_PERTRANS);
-               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;
-               }
+
+               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);
 }