@@ -1727,6 +1727,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info)
17271727 btrfs_put_root (fs_info -> uuid_root );
17281728 btrfs_put_root (fs_info -> fs_root );
17291729 btrfs_put_root (fs_info -> data_reloc_root );
1730+ btrfs_put_root (fs_info -> block_group_root );
17301731 btrfs_check_leaked_roots (fs_info );
17311732 btrfs_extent_buffer_leak_debug_check (fs_info );
17321733 kfree (fs_info -> super_copy );
@@ -2095,7 +2096,6 @@ static void backup_super_roots(struct btrfs_fs_info *info)
20952096{
20962097 const int next_backup = info -> backup_root_index ;
20972098 struct btrfs_root_backup * root_backup ;
2098- struct btrfs_root * extent_root = btrfs_extent_root (info , 0 );
20992099 struct btrfs_root * csum_root = btrfs_csum_root (info , 0 );
21002100
21012101 root_backup = info -> super_for_commit -> super_roots + next_backup ;
@@ -2121,11 +2121,23 @@ static void backup_super_roots(struct btrfs_fs_info *info)
21212121 btrfs_set_backup_chunk_root_level (root_backup ,
21222122 btrfs_header_level (info -> chunk_root -> node ));
21232123
2124- btrfs_set_backup_extent_root (root_backup , extent_root -> node -> start );
2125- btrfs_set_backup_extent_root_gen (root_backup ,
2126- btrfs_header_generation (extent_root -> node ));
2127- btrfs_set_backup_extent_root_level (root_backup ,
2128- btrfs_header_level (extent_root -> node ));
2124+ if (btrfs_fs_incompat (info , EXTENT_TREE_V2 )) {
2125+ btrfs_set_backup_block_group_root (root_backup ,
2126+ info -> block_group_root -> node -> start );
2127+ btrfs_set_backup_block_group_root_gen (root_backup ,
2128+ btrfs_header_generation (info -> block_group_root -> node ));
2129+ btrfs_set_backup_block_group_root_level (root_backup ,
2130+ btrfs_header_level (info -> block_group_root -> node ));
2131+ } else {
2132+ struct btrfs_root * extent_root = btrfs_extent_root (info , 0 );
2133+
2134+ btrfs_set_backup_extent_root (root_backup ,
2135+ extent_root -> node -> start );
2136+ btrfs_set_backup_extent_root_gen (root_backup ,
2137+ btrfs_header_generation (extent_root -> node ));
2138+ btrfs_set_backup_extent_root_level (root_backup ,
2139+ btrfs_header_level (extent_root -> node ));
2140+ }
21292141
21302142 /*
21312143 * we might commit during log recovery, which happens before we set
@@ -2269,6 +2281,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root)
22692281 free_root_extent_buffers (info -> uuid_root );
22702282 free_root_extent_buffers (info -> fs_root );
22712283 free_root_extent_buffers (info -> data_reloc_root );
2284+ free_root_extent_buffers (info -> block_group_root );
22722285 if (free_chunk_root )
22732286 free_root_extent_buffers (info -> chunk_root );
22742287}
@@ -2964,8 +2977,20 @@ static int load_important_roots(struct btrfs_fs_info *fs_info)
29642977 gen = btrfs_super_generation (sb );
29652978 level = btrfs_super_root_level (sb );
29662979 ret = load_super_root (fs_info -> tree_root , bytenr , gen , level );
2967- if (ret )
2980+ if (ret ) {
29682981 btrfs_warn (fs_info , "couldn't read tree root" );
2982+ return ret ;
2983+ }
2984+
2985+ if (!btrfs_fs_incompat (fs_info , EXTENT_TREE_V2 ))
2986+ return 0 ;
2987+
2988+ bytenr = btrfs_super_block_group_root (sb );
2989+ gen = btrfs_super_block_group_root_generation (sb );
2990+ level = btrfs_super_block_group_root_level (sb );
2991+ ret = load_super_root (fs_info -> block_group_root , bytenr , gen , level );
2992+ if (ret )
2993+ btrfs_warn (fs_info , "couldn't read block group root" );
29692994 return ret ;
29702995}
29712996
@@ -2978,6 +3003,16 @@ static int __cold init_tree_roots(struct btrfs_fs_info *fs_info)
29783003 int ret = 0 ;
29793004 int i ;
29803005
3006+ if (btrfs_fs_incompat (fs_info , EXTENT_TREE_V2 )) {
3007+ struct btrfs_root * root ;
3008+
3009+ root = btrfs_alloc_root (fs_info , BTRFS_BLOCK_GROUP_TREE_OBJECTID ,
3010+ GFP_KERNEL );
3011+ if (!root )
3012+ return - ENOMEM ;
3013+ fs_info -> block_group_root = root ;
3014+ }
3015+
29813016 for (i = 0 ; i < BTRFS_NUM_BACKUP_ROOTS ; i ++ ) {
29823017 if (handle_error ) {
29833018 if (!IS_ERR (tree_root -> node ))
0 commit comments