History

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.

Josef Bacik committed 4 years ago

Commit 9c54e801 parent bd676446 files · +75 −8Browse files

Unified · Split

6 files
  1. fs/btrfs/ctree.h +26 −1
  2. fs/btrfs/disk-io.c +42 −7
  3. fs/btrfs/disk-io.h +2 −0
  4. fs/btrfs/print-tree.c +1 −0
  5. include/trace/events/btrfs.h +1 −0
  6. include/uapi/linux/btrfs_tree.h +3 −0
fs/btrfs/ctree.h+26−1
@@ -274,8 +274,14 @@ struct btrfs_super_block { · 273 unmodified lines
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 { · 375 unmodified lines
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, · 1686 unmodified lines
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, · 128 unmodified lines
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+42−7
@@ -1727,6 +1727,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info) · 1726 unmodified lines
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) · 362 unmodified lines
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) · 19 unmodified lines
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) · 137 unmodified lines
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) · 689 unmodified lines
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) · 6 unmodified lines
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+2−0
@@ -111,6 +111,8 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root) · 110 unmodified lines
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+1−0
@@ -23,6 +23,7 @@ static const struct root_name_map root_map[] = { · 22 unmodified lines
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+1−0
@@ -53,6 +53,7 @@ struct btrfs_space_info; · 52 unmodified lines
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+3−0
@@ -53,6 +53,9 @@ · 52 unmodified lines
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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t