In btrfs_add_qgroup_relation(), this function gets btrfs_qgroup
with calling find_qgroup_rb() and checks its validity. if it's
valid, it executes opeartion that add qgroup relation. But in this
logic, it calls add_relation_rb() and it finds btrfs_qgroup again
from id. This process can be skipped if we reuse the pointer get
before. This patch adds add_relation_rb_qgroup() that receive
btrfs_qgroup pointer but id. and replace add_relation_rb() to new
helper function.

Signed-off-by: Sidong Yang <realwa...@gmail.com>
---
 fs/btrfs/qgroup.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 14ff388fd3bd..2e82259fa368 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -259,6 +259,27 @@ static int del_qgroup_rb(struct btrfs_fs_info *fs_info, 
u64 qgroupid)
        return 0;
 }
 
+/* must be called with qgroup_lock held */
+static int add_relation_rb_qgroup(struct btrfs_fs_info *fs_info,
+                          struct btrfs_qgroup* member, struct btrfs_qgroup* 
parent)
+{
+       struct btrfs_qgroup_list *list;
+
+       if (!member || !parent)
+               return -EINVAL;
+
+       list = kzalloc(sizeof(*list), GFP_ATOMIC);
+       if (!list)
+               return -ENOMEM;
+
+       list->group = parent;
+       list->member = member;
+       list_add_tail(&list->next_group, &member->groups);
+       list_add_tail(&list->next_member, &parent->members);
+
+       return 0;
+}
+
 /* must be called with qgroup_lock held */
 static int add_relation_rb(struct btrfs_fs_info *fs_info,
                           u64 memberid, u64 parentid)
@@ -1409,7 +1430,7 @@ int btrfs_add_qgroup_relation(struct btrfs_trans_handle 
*trans, u64 src,
        }
 
        spin_lock(&fs_info->qgroup_lock);
-       ret = add_relation_rb(fs_info, src, dst);
+       ret = add_relation_rb_qgroup(fs_info, member, parent);
        if (ret < 0) {
                spin_unlock(&fs_info->qgroup_lock);
                goto out;
-- 
2.25.1

Reply via email to