Call create_priority_trees() in create_space_info(). Call remove_priority_trees() before free of space_info.
Signed-off-by: Su Yue <suy.f...@cn.fujitsu.com> --- fs/btrfs/extent-tree.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 5ea1f2e40701..2dec02782df1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3940,6 +3940,10 @@ static const char *alloc_name(u64 flags) }; } +static int create_priority_trees(struct btrfs_fs_info *fs_info, + struct btrfs_space_info *space_info); +static void remove_priority_trees(struct btrfs_fs_info *fs_info, + struct btrfs_space_info *space_info); static int create_space_info(struct btrfs_fs_info *info, u64 flags) { @@ -3958,8 +3962,17 @@ static int create_space_info(struct btrfs_fs_info *info, u64 flags) return ret; } - for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) + for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) { INIT_LIST_HEAD(&space_info->block_groups[i]); + space_info->priority_trees[i] = RB_ROOT; + } + + ret = create_priority_trees(info, space_info); + if (ret) { + kfree(space_info); + return ret; + } + init_rwsem(&space_info->groups_sem); spin_lock_init(&space_info->lock); space_info->flags = flags & BTRFS_BLOCK_GROUP_TYPE_MASK; @@ -3974,6 +3987,7 @@ static int create_space_info(struct btrfs_fs_info *info, u64 flags) alloc_name(space_info->flags)); if (ret) { percpu_counter_destroy(&space_info->total_bytes_pinned); + remove_priority_trees(info, space_info); kfree(space_info); return ret; } @@ -9928,6 +9942,8 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info) space_info->bytes_may_use > 0)) dump_space_info(info, space_info, 0, 0); list_del(&space_info->list); + remove_priority_trees(info, space_info); + for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) { struct kobject *kobj; kobj = space_info->block_group_kobjs[i]; @@ -11282,9 +11298,6 @@ static void remove_priority_trees(struct btrfs_fs_info *fs_info, struct btrfs_priority_tree *pt, *next_pt; int i; - if (!is_priority_alloc_enabled(fs_info)) - return; - for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) { root = &space_info->priority_trees[i]; rbtree_postorder_for_each_entry_safe(pt, next_pt, root, node) { -- 2.19.1