]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
a555890c3ff501980e59261ab99c1c52d6b1b800
[thirdparty/kernel/stable-queue.git] /
1 From 8774930cf30f217de1e57c6f2aff373ef5af9f55 Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Tue, 28 Jul 2020 09:42:49 +0800
4 Subject: btrfs: tracepoints: output proper root owner for
5 trace_find_free_extent()
6
7 From: Qu Wenruo <wqu@suse.com>
8
9 The current trace event always output result like this:
10
11 find_free_extent: root=2(EXTENT_TREE) len=16384 empty_size=0 flags=4(METADATA)
12 find_free_extent: root=2(EXTENT_TREE) len=16384 empty_size=0 flags=4(METADATA)
13 find_free_extent: root=2(EXTENT_TREE) len=8192 empty_size=0 flags=1(DATA)
14 find_free_extent: root=2(EXTENT_TREE) len=8192 empty_size=0 flags=1(DATA)
15 find_free_extent: root=2(EXTENT_TREE) len=4096 empty_size=0 flags=1(DATA)
16 find_free_extent: root=2(EXTENT_TREE) len=4096 empty_size=0 flags=1(DATA)
17
18 T's saying we're allocating data extent for EXTENT tree, which is not
19 even possible.
20
21 It's because we always use EXTENT tree as the owner for
22 trace_find_free_extent() without using the @root from
23 btrfs_reserve_extent().
24
25 This patch will change the parameter to use proper @root for
26 trace_find_free_extent():
27
28 Now it looks much better:
29
30 find_free_extent: root=5(FS_TREE) len=16384 empty_size=0 flags=36(METADATA|DUP)
31 find_free_extent: root=5(FS_TREE) len=8192 empty_size=0 flags=1(DATA)
32 find_free_extent: root=5(FS_TREE) len=16384 empty_size=0 flags=1(DATA)
33 find_free_extent: root=5(FS_TREE) len=4096 empty_size=0 flags=1(DATA)
34 find_free_extent: root=5(FS_TREE) len=8192 empty_size=0 flags=1(DATA)
35 find_free_extent: root=5(FS_TREE) len=16384 empty_size=0 flags=36(METADATA|DUP)
36 find_free_extent: root=7(CSUM_TREE) len=16384 empty_size=0 flags=36(METADATA|DUP)
37 find_free_extent: root=2(EXTENT_TREE) len=16384 empty_size=0 flags=36(METADATA|DUP)
38 find_free_extent: root=1(ROOT_TREE) len=16384 empty_size=0 flags=36(METADATA|DUP)
39
40 Reported-by: Hans van Kranenburg <hans@knorrie.org>
41 CC: stable@vger.kernel.org # 5.4+
42 Signed-off-by: Qu Wenruo <wqu@suse.com>
43 Reviewed-by: David Sterba <dsterba@suse.com>
44 Signed-off-by: David Sterba <dsterba@suse.com>
45 ---
46 fs/btrfs/extent-tree.c | 7 ++++---
47 include/trace/events/btrfs.h | 10 ++++++----
48 2 files changed, 10 insertions(+), 7 deletions(-)
49
50 diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
51 index 388449101705e..c6d9e8c07c236 100644
52 --- a/fs/btrfs/extent-tree.c
53 +++ b/fs/btrfs/extent-tree.c
54 @@ -3800,11 +3800,12 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info,
55 * |- Push harder to find free extents
56 * |- If not found, re-iterate all block groups
57 */
58 -static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
59 +static noinline int find_free_extent(struct btrfs_root *root,
60 u64 ram_bytes, u64 num_bytes, u64 empty_size,
61 u64 hint_byte, struct btrfs_key *ins,
62 u64 flags, int delalloc)
63 {
64 + struct btrfs_fs_info *fs_info = root->fs_info;
65 int ret = 0;
66 int cache_block_group_error = 0;
67 struct btrfs_free_cluster *last_ptr = NULL;
68 @@ -3833,7 +3834,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
69 ins->objectid = 0;
70 ins->offset = 0;
71
72 - trace_find_free_extent(fs_info, num_bytes, empty_size, flags);
73 + trace_find_free_extent(root, num_bytes, empty_size, flags);
74
75 space_info = btrfs_find_space_info(fs_info, flags);
76 if (!space_info) {
77 @@ -4141,7 +4142,7 @@ int btrfs_reserve_extent(struct btrfs_root *root, u64 ram_bytes,
78 flags = get_alloc_profile_by_root(root, is_data);
79 again:
80 WARN_ON(num_bytes < fs_info->sectorsize);
81 - ret = find_free_extent(fs_info, ram_bytes, num_bytes, empty_size,
82 + ret = find_free_extent(root, ram_bytes, num_bytes, empty_size,
83 hint_byte, ins, flags, delalloc);
84 if (!ret && !is_data) {
85 btrfs_dec_block_group_reservations(fs_info, ins->objectid);
86 diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
87 index 75ae1899452b9..94a3adb65b8af 100644
88 --- a/include/trace/events/btrfs.h
89 +++ b/include/trace/events/btrfs.h
90 @@ -1159,25 +1159,27 @@ DEFINE_EVENT(btrfs__reserved_extent, btrfs_reserved_extent_free,
91
92 TRACE_EVENT(find_free_extent,
93
94 - TP_PROTO(const struct btrfs_fs_info *fs_info, u64 num_bytes,
95 + TP_PROTO(const struct btrfs_root *root, u64 num_bytes,
96 u64 empty_size, u64 data),
97
98 - TP_ARGS(fs_info, num_bytes, empty_size, data),
99 + TP_ARGS(root, num_bytes, empty_size, data),
100
101 TP_STRUCT__entry_btrfs(
102 + __field( u64, root_objectid )
103 __field( u64, num_bytes )
104 __field( u64, empty_size )
105 __field( u64, data )
106 ),
107
108 - TP_fast_assign_btrfs(fs_info,
109 + TP_fast_assign_btrfs(root->fs_info,
110 + __entry->root_objectid = root->root_key.objectid;
111 __entry->num_bytes = num_bytes;
112 __entry->empty_size = empty_size;
113 __entry->data = data;
114 ),
115
116 TP_printk_btrfs("root=%llu(%s) len=%llu empty_size=%llu flags=%llu(%s)",
117 - show_root_type(BTRFS_EXTENT_TREE_OBJECTID),
118 + show_root_type(__entry->root_objectid),
119 __entry->num_bytes, __entry->empty_size, __entry->data,
120 __print_flags((unsigned long)__entry->data, "|",
121 BTRFS_GROUP_FLAGS))
122 --
123 2.27.0
124