@@ -517,11 +517,6 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
info->log_root_tree->node->start,
btrfs_header_level(
info->log_root_tree->node));
- if (info->block_group_root)
- printf("block group tree: %llu level %d\n",
- info->block_group_root->node->start,
- btrfs_header_level(
- info->block_group_root->node));
} else {
if (info->tree_root->node) {
printf("root tree\n");
@@ -540,12 +535,6 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd,
btrfs_print_tree(info->log_root_tree->node,
BTRFS_PRINT_TREE_FOLLOW | print_mode);
}
-
- if (info->block_group_root) {
- printf("block group tree\n");
- btrfs_print_tree(info->block_group_root->node,
- BTRFS_PRINT_TREE_FOLLOW | print_mode);
- }
}
}
tree_root_scan = info->tree_root;
@@ -457,13 +457,7 @@ struct btrfs_super_block {
__le64 nr_global_roots;
- __le64 block_group_root;
- __le64 block_group_root_generation;
- u8 block_group_root_level;
-
- /* future expansion */
- u8 reserved8[7];
- __le64 reserved[24];
+ __le64 reserved[27];
u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
/* Padded to 4096 bytes */
@@ -2304,17 +2298,6 @@ BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
num_devices, 64);
-/*
- * Extent tree v2 doesn't have a global csum or extent root, so we use the
- * extent root slot for the block group root.
- */
-BTRFS_SETGET_STACK_FUNCS(backup_block_group_root, struct btrfs_root_backup,
- extent_root, 64);
-BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_gen, struct btrfs_root_backup,
- extent_root_gen, 64);
-BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_level, struct btrfs_root_backup,
- extent_root_level, 8);
-
/* struct btrfs_super_block */
BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
@@ -2365,13 +2348,6 @@ BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
uuid_tree_generation, 64);
BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
-BTRFS_SETGET_STACK_FUNCS(super_block_group_root, struct btrfs_super_block,
- block_group_root, 64);
-BTRFS_SETGET_STACK_FUNCS(super_block_group_root_generation,
- struct btrfs_super_block,
- block_group_root_generation, 64);
-BTRFS_SETGET_STACK_FUNCS(super_block_group_root_level,
- struct btrfs_super_block, block_group_root_level, 8);
BTRFS_SETGET_STACK_FUNCS(super_nr_global_roots, struct btrfs_super_block,
nr_global_roots, 64);
@@ -1209,33 +1209,9 @@ static int load_important_roots(struct btrfs_fs_info *fs_info,
goto tree_root;
}
- if (backup) {
- bytenr = btrfs_backup_block_group_root(backup);
- gen = btrfs_backup_block_group_root_gen(backup);
- level = btrfs_backup_block_group_root_level(backup);
- } else {
- bytenr = btrfs_super_block_group_root(sb);
- gen = btrfs_super_block_group_root_generation(sb);
- level = btrfs_super_block_group_root_level(sb);
- }
root = fs_info->block_group_root;
btrfs_setup_root(root, fs_info, BTRFS_BLOCK_GROUP_TREE_OBJECTID);
- ret = read_root_node(fs_info, root, bytenr, gen, level);
- if (ret) {
- fprintf(stderr, "Couldn't read block group root\n");
- return -EIO;
- }
-
- if (maybe_load_block_groups(fs_info, flags)) {
- int ret = btrfs_read_block_groups(fs_info);
- if (ret < 0 && ret != -ENOENT) {
- errno = -ret;
- error("failed to read block groups: %m");
- return ret;
- }
- }
-
tree_root:
if (backup) {
bytenr = btrfs_backup_tree_root(backup);
@@ -1280,6 +1256,17 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr,
if (ret)
return ret;
+ if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) {
+ ret = find_and_setup_root(root, fs_info,
+ BTRFS_BLOCK_GROUP_TREE_OBJECTID,
+ fs_info->block_group_root);
+ if (ret) {
+ error("Couldn't load block group tree\n");
+ return -EIO;
+ }
+ fs_info->block_group_root->track_dirty = 1;
+ }
+
ret = find_and_setup_root(root, fs_info, BTRFS_DEV_TREE_OBJECTID,
fs_info->dev_root);
if (ret) {
@@ -1288,6 +1275,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr,
}
fs_info->dev_root->track_dirty = 1;
+
ret = find_and_setup_root(root, fs_info, BTRFS_UUID_TREE_OBJECTID,
fs_info->uuid_root);
if (ret) {
@@ -1313,8 +1301,7 @@ int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr,
return -EIO;
}
- if (!btrfs_fs_incompat(fs_info, EXTENT_TREE_V2) &&
- maybe_load_block_groups(fs_info, flags)) {
+ if (maybe_load_block_groups(fs_info, flags)) {
ret = btrfs_read_block_groups(fs_info);
/*
* If we don't find any blockgroups (ENOENT) we're either
@@ -1834,20 +1821,6 @@ int btrfs_check_super(struct btrfs_super_block *sb, unsigned sbflags)
goto error_out;
}
- if (btrfs_super_incompat_flags(sb) & BTRFS_FEATURE_INCOMPAT_EXTENT_TREE_V2) {
- if (btrfs_super_block_group_root_level(sb) >= BTRFS_MAX_LEVEL) {
- error("block_group_root level too big: %d >= %d",
- btrfs_super_block_group_root_level(sb),
- BTRFS_MAX_LEVEL);
- goto error_out;
- }
- if (!IS_ALIGNED(btrfs_super_block_group_root(sb), 4096)) {
- error("block_group_root block unaligned: %llu",
- btrfs_super_block_group_root(sb));
- goto error_out;
- }
- }
-
if (btrfs_super_incompat_flags(sb) & BTRFS_FEATURE_INCOMPAT_METADATA_UUID)
metadata_uuid = sb->metadata_uuid;
else
@@ -2165,16 +2138,9 @@ static void backup_super_roots(struct btrfs_fs_info *info)
btrfs_set_backup_num_devices(root_backup,
btrfs_super_num_devices(info->super_copy));
- if (btrfs_fs_incompat(info, EXTENT_TREE_V2)) {
- btrfs_set_backup_block_group_root(root_backup,
- info->block_group_root->node->start);
- btrfs_set_backup_block_group_root_gen(root_backup,
- btrfs_header_generation(info->block_group_root->node));
- btrfs_set_backup_block_group_root_level(root_backup,
- btrfs_header_level(info->block_group_root->node));
- } else {
- struct btrfs_root *csum_root = btrfs_csum_root(info, 0);
+ if (!btrfs_fs_incompat(info, EXTENT_TREE_V2)) {
struct btrfs_root *extent_root = btrfs_extent_root(info, 0);
+ struct btrfs_root *csum_root = btrfs_csum_root(info, 0);
btrfs_set_backup_csum_root(root_backup, csum_root->node->start);
btrfs_set_backup_csum_root_gen(root_backup,
@@ -2235,7 +2201,7 @@ int write_ctree_super(struct btrfs_trans_handle *trans)
struct btrfs_fs_info *fs_info = trans->fs_info;
struct btrfs_root *tree_root = fs_info->tree_root;
struct btrfs_root *chunk_root = fs_info->chunk_root;
- struct btrfs_root *block_group_root = fs_info->block_group_root;
+
if (fs_info->readonly)
return 0;
@@ -2252,15 +2218,6 @@ int write_ctree_super(struct btrfs_trans_handle *trans)
btrfs_set_super_chunk_root_generation(fs_info->super_copy,
btrfs_header_generation(chunk_root->node));
- if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) {
- btrfs_set_super_block_group_root(fs_info->super_copy,
- block_group_root->node->start);
- btrfs_set_super_block_group_root_generation(fs_info->super_copy,
- btrfs_header_generation(block_group_root->node));
- btrfs_set_super_block_group_root_level(fs_info->super_copy,
- btrfs_header_level(block_group_root->node));
- }
-
ret = write_all_supers(fs_info);
if (ret)
fprintf(stderr, "failed to write new super block err %d\n", ret);
@@ -2046,12 +2046,6 @@ void btrfs_print_superblock(struct btrfs_super_block *sb, int full)
(unsigned long long)btrfs_super_cache_generation(sb));
printf("uuid_tree_generation\t%llu\n",
(unsigned long long)btrfs_super_uuid_tree_generation(sb));
- printf("block_group_root\t%llu\n",
- (unsigned long long)btrfs_super_block_group_root(sb));
- printf("block_group_root_generation\t%llu\n",
- (unsigned long long)btrfs_super_block_group_root_generation(sb));
- printf("block_group_root_level\t%llu\n",
- (unsigned long long)btrfs_super_block_group_root_level(sb));
uuid_unparse(sb->dev_item.uuid, buf);
printf("dev_item.uuid\t\t%s\n", buf);
@@ -98,8 +98,7 @@ static int btrfs_create_tree_root(int fd, struct btrfs_mkfs_config *cfg,
for (i = 0; i < blocks_nr; i++) {
blk = blocks[i];
- if (blk == MKFS_ROOT_TREE || blk == MKFS_CHUNK_TREE ||
- blk == MKFS_BLOCK_GROUP_TREE)
+ if (blk == MKFS_ROOT_TREE || blk == MKFS_CHUNK_TREE)
continue;
btrfs_set_root_bytenr(&root_item, cfg->blocks[blk]);
@@ -440,13 +439,9 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
btrfs_set_super_compat_ro_flags(&super, ro_flags);
btrfs_set_super_cache_generation(&super, 0);
}
- if (extent_tree_v2) {
+ if (extent_tree_v2)
btrfs_set_super_nr_global_roots(&super, 1);
- btrfs_set_super_block_group_root(&super,
- cfg->blocks[MKFS_BLOCK_GROUP_TREE]);
- btrfs_set_super_block_group_root_generation(&super, 1);
- btrfs_set_super_block_group_root_level(&super, 0);
- }
+
if (cfg->label)
__strncpy_null(super.label, cfg->label, BTRFS_LABEL_SIZE - 1);
The extent tree v2 (thankfully not yet fully materialized) needs a new root for storing all block group items. My initial proposal years ago just added a new tree rootid, and load it from tree root, just like what we did for quota/free space tree/uuid/extent roots. But the extent tree v2 patches introduced a completely new (and to me, wasteful) way to store block group tree root into super block. Currently there are only 3 trees stored in super blocks, and they all have their valid reasons: - Chunk root Needed for bootstrap. - Tree root Really the entrance of all trees. - Log root This is special as log root has to be updated out of existing transaction mechanism. There is not even any reason to put block group root into super blocks, the block group tree is updated at the same timing as old extent tree, no need for extra bootstrap/out-of-transaction update. So just move block group root from super block into tree root. Signed-off-by: Qu Wenruo <wqu@suse.com> --- cmds/inspect-dump-tree.c | 11 ------ kernel-shared/ctree.h | 26 +------------ kernel-shared/disk-io.c | 75 ++++++++------------------------------ kernel-shared/print-tree.c | 6 --- mkfs/common.c | 11 ++---- 5 files changed, 20 insertions(+), 109 deletions(-)