Skip to content

Commit 9c54e80

Browse files
josefbacikkdave
authored andcommitted
btrfs: add code to support the block group root
This code adds the on disk structures for the block group root, which will hold the block group items for extent tree v2. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent bd67644 commit 9c54e80

File tree

6 files changed

+75
-8
lines changed

6 files changed

+75
-8
lines changed

fs/btrfs/ctree.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,14 @@ struct btrfs_super_block {
274274
/* the UUID written into btree blocks */
275275
u8 metadata_uuid[BTRFS_FSID_SIZE];
276276

277+
/* Extent tree v2 */
278+
__le64 block_group_root;
279+
__le64 block_group_root_generation;
280+
u8 block_group_root_level;
281+
277282
/* future expansion */
278-
__le64 reserved[28];
283+
u8 reserved8[7];
284+
__le64 reserved[25];
279285
u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
280286
struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
281287

@@ -657,6 +663,7 @@ struct btrfs_fs_info {
657663
struct btrfs_root *quota_root;
658664
struct btrfs_root *uuid_root;
659665
struct btrfs_root *data_reloc_root;
666+
struct btrfs_root *block_group_root;
660667

661668
/* the log root tree is a directory of all the other log roots */
662669
struct btrfs_root *log_root_tree;
@@ -2349,6 +2356,17 @@ BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
23492356
BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
23502357
num_devices, 64);
23512358

2359+
/*
2360+
* For extent tree v2 we overload the extent root with the block group root, as
2361+
* we will have multiple extent roots.
2362+
*/
2363+
BTRFS_SETGET_STACK_FUNCS(backup_block_group_root, struct btrfs_root_backup,
2364+
extent_root, 64);
2365+
BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_gen, struct btrfs_root_backup,
2366+
extent_root_gen, 64);
2367+
BTRFS_SETGET_STACK_FUNCS(backup_block_group_root_level,
2368+
struct btrfs_root_backup, extent_root_level, 8);
2369+
23522370
/* struct btrfs_balance_item */
23532371
BTRFS_SETGET_FUNCS(balance_flags, struct btrfs_balance_item, flags, 64);
23542372

@@ -2483,6 +2501,13 @@ BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
24832501
BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
24842502
BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
24852503
uuid_tree_generation, 64);
2504+
BTRFS_SETGET_STACK_FUNCS(super_block_group_root, struct btrfs_super_block,
2505+
block_group_root, 64);
2506+
BTRFS_SETGET_STACK_FUNCS(super_block_group_root_generation,
2507+
struct btrfs_super_block,
2508+
block_group_root_generation, 64);
2509+
BTRFS_SETGET_STACK_FUNCS(super_block_group_root_level, struct btrfs_super_block,
2510+
block_group_root_level, 8);
24862511

24872512
int btrfs_super_csum_size(const struct btrfs_super_block *s);
24882513
const char *btrfs_super_csum_name(u16 csum_type);

fs/btrfs/disk-io.c

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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))

fs/btrfs/disk-io.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root)
111111

112112
static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info)
113113
{
114+
if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2))
115+
return fs_info->block_group_root;
114116
return btrfs_extent_root(fs_info, 0);
115117
}
116118

fs/btrfs/print-tree.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ static const struct root_name_map root_map[] = {
2323
{ BTRFS_QUOTA_TREE_OBJECTID, "QUOTA_TREE" },
2424
{ BTRFS_UUID_TREE_OBJECTID, "UUID_TREE" },
2525
{ BTRFS_FREE_SPACE_TREE_OBJECTID, "FREE_SPACE_TREE" },
26+
{ BTRFS_BLOCK_GROUP_TREE_OBJECTID, "BLOCK_GROUP_TREE" },
2627
{ BTRFS_DATA_RELOC_TREE_OBJECTID, "DATA_RELOC_TREE" },
2728
};
2829

include/trace/events/btrfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ struct btrfs_space_info;
5353
{ BTRFS_TREE_RELOC_OBJECTID, "TREE_RELOC" }, \
5454
{ BTRFS_UUID_TREE_OBJECTID, "UUID_TREE" }, \
5555
{ BTRFS_FREE_SPACE_TREE_OBJECTID, "FREE_SPACE_TREE" }, \
56+
{ BTRFS_BLOCK_GROUP_TREE_OBJECTID, "BLOCK_GROUP_TREE" },\
5657
{ BTRFS_DATA_RELOC_TREE_OBJECTID, "DATA_RELOC_TREE" })
5758

5859
#define show_root_type(obj) \

include/uapi/linux/btrfs_tree.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
/* tracks free space in block groups. */
5454
#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
5555

56+
/* Holds the block group items for extent tree v2. */
57+
#define BTRFS_BLOCK_GROUP_TREE_OBJECTID 11ULL
58+
5659
/* device stats in the device tree */
5760
#define BTRFS_DEV_STATS_OBJECTID 0ULL
5861

0 commit comments

Comments
 (0)