diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_btree_trace.c | 249 | ||||
-rw-r--r-- | fs/xfs/xfs_btree_trace.h | 116 |
2 files changed, 365 insertions, 0 deletions
diff --git a/fs/xfs/xfs_btree_trace.c b/fs/xfs/xfs_btree_trace.c new file mode 100644 index 000000000000..44ff942a0fda --- /dev/null +++ b/fs/xfs/xfs_btree_trace.c | |||
@@ -0,0 +1,249 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008 Silicon Graphics, Inc. | ||
3 | * All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it would be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write the Free Software Foundation, | ||
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | */ | ||
18 | #include "xfs.h" | ||
19 | #include "xfs_types.h" | ||
20 | #include "xfs_inum.h" | ||
21 | #include "xfs_bmap_btree.h" | ||
22 | #include "xfs_alloc_btree.h" | ||
23 | #include "xfs_ialloc_btree.h" | ||
24 | #include "xfs_inode.h" | ||
25 | #include "xfs_btree.h" | ||
26 | #include "xfs_btree_trace.h" | ||
27 | |||
28 | STATIC void | ||
29 | xfs_btree_trace_ptr( | ||
30 | struct xfs_btree_cur *cur, | ||
31 | union xfs_btree_ptr ptr, | ||
32 | __psunsigned_t *high, | ||
33 | __psunsigned_t *low) | ||
34 | { | ||
35 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { | ||
36 | __u64 val = be64_to_cpu(ptr.l); | ||
37 | *high = val >> 32; | ||
38 | *low = (int)val; | ||
39 | } else { | ||
40 | *high = 0; | ||
41 | *low = be32_to_cpu(ptr.s); | ||
42 | } | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * Add a trace buffer entry for arguments, for a buffer & 1 integer arg. | ||
47 | */ | ||
48 | void | ||
49 | xfs_btree_trace_argbi( | ||
50 | const char *func, | ||
51 | struct xfs_btree_cur *cur, | ||
52 | struct xfs_buf *b, | ||
53 | int i, | ||
54 | int line) | ||
55 | { | ||
56 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBI, | ||
57 | line, (__psunsigned_t)b, i, 0, 0, 0, 0, 0, | ||
58 | 0, 0, 0, 0); | ||
59 | } | ||
60 | |||
61 | /* | ||
62 | * Add a trace buffer entry for arguments, for a buffer & 2 integer args. | ||
63 | */ | ||
64 | void | ||
65 | xfs_btree_trace_argbii( | ||
66 | const char *func, | ||
67 | struct xfs_btree_cur *cur, | ||
68 | struct xfs_buf *b, | ||
69 | int i0, | ||
70 | int i1, | ||
71 | int line) | ||
72 | { | ||
73 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBII, | ||
74 | line, (__psunsigned_t)b, i0, i1, 0, 0, 0, 0, | ||
75 | 0, 0, 0, 0); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Add a trace buffer entry for arguments, for 3 block-length args | ||
80 | * and an integer arg. | ||
81 | */ | ||
82 | void | ||
83 | xfs_btree_trace_argfffi( | ||
84 | const char *func, | ||
85 | struct xfs_btree_cur *cur, | ||
86 | xfs_dfiloff_t o, | ||
87 | xfs_dfsbno_t b, | ||
88 | xfs_dfilblks_t i, | ||
89 | int j, | ||
90 | int line) | ||
91 | { | ||
92 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGFFFI, | ||
93 | line, | ||
94 | o >> 32, (int)o, | ||
95 | b >> 32, (int)b, | ||
96 | i >> 32, (int)i, | ||
97 | (int)j, 0, 0, 0, 0); | ||
98 | } | ||
99 | |||
100 | /* | ||
101 | * Add a trace buffer entry for arguments, for one integer arg. | ||
102 | */ | ||
103 | void | ||
104 | xfs_btree_trace_argi( | ||
105 | const char *func, | ||
106 | struct xfs_btree_cur *cur, | ||
107 | int i, | ||
108 | int line) | ||
109 | { | ||
110 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGI, | ||
111 | line, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||
112 | } | ||
113 | |||
114 | /* | ||
115 | * Add a trace buffer entry for arguments, for int, fsblock, key. | ||
116 | */ | ||
117 | void | ||
118 | xfs_btree_trace_argipk( | ||
119 | const char *func, | ||
120 | struct xfs_btree_cur *cur, | ||
121 | int i, | ||
122 | union xfs_btree_ptr ptr, | ||
123 | union xfs_btree_key *key, | ||
124 | int line) | ||
125 | { | ||
126 | __psunsigned_t high, low; | ||
127 | __uint64_t l0, l1; | ||
128 | |||
129 | xfs_btree_trace_ptr(cur, ptr, &high, &low); | ||
130 | cur->bc_ops->trace_key(cur, key, &l0, &l1); | ||
131 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPK, | ||
132 | line, i, high, low, | ||
133 | l0 >> 32, (int)l0, | ||
134 | l1 >> 32, (int)l1, | ||
135 | 0, 0, 0, 0); | ||
136 | } | ||
137 | |||
138 | /* | ||
139 | * Add a trace buffer entry for arguments, for int, fsblock, rec. | ||
140 | */ | ||
141 | void | ||
142 | xfs_btree_trace_argipr( | ||
143 | const char *func, | ||
144 | struct xfs_btree_cur *cur, | ||
145 | int i, | ||
146 | union xfs_btree_ptr ptr, | ||
147 | union xfs_btree_rec *rec, | ||
148 | int line) | ||
149 | { | ||
150 | __psunsigned_t high, low; | ||
151 | __uint64_t l0, l1, l2; | ||
152 | |||
153 | xfs_btree_trace_ptr(cur, ptr, &high, &low); | ||
154 | cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2); | ||
155 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPR, | ||
156 | line, i, | ||
157 | high, low, | ||
158 | l0 >> 32, (int)l0, | ||
159 | l1 >> 32, (int)l1, | ||
160 | l2 >> 32, (int)l2, | ||
161 | 0, 0); | ||
162 | } | ||
163 | |||
164 | /* | ||
165 | * Add a trace buffer entry for arguments, for int, key. | ||
166 | */ | ||
167 | void | ||
168 | xfs_btree_trace_argik( | ||
169 | const char *func, | ||
170 | struct xfs_btree_cur *cur, | ||
171 | int i, | ||
172 | union xfs_btree_key *key, | ||
173 | int line) | ||
174 | { | ||
175 | __uint64_t l0, l1; | ||
176 | |||
177 | cur->bc_ops->trace_key(cur, key, &l0, &l1); | ||
178 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIK, | ||
179 | line, i, | ||
180 | l0 >> 32, (int)l0, | ||
181 | l1 >> 32, (int)l1, | ||
182 | 0, 0, 0, 0, 0, 0); | ||
183 | } | ||
184 | |||
185 | /* | ||
186 | * Add a trace buffer entry for arguments, for record. | ||
187 | */ | ||
188 | void | ||
189 | xfs_btree_trace_argr( | ||
190 | const char *func, | ||
191 | struct xfs_btree_cur *cur, | ||
192 | union xfs_btree_rec *rec, | ||
193 | int line) | ||
194 | { | ||
195 | __uint64_t l0, l1, l2; | ||
196 | |||
197 | cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2); | ||
198 | cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGR, | ||
199 | line, | ||
200 | l0 >> 32, (int)l0, | ||
201 | l1 >> 32, (int)l1, | ||
202 | l2 >> 32, (int)l2, | ||
203 | 0, 0, 0, 0, 0); | ||
204 | } | ||
205 | |||
206 | /* | ||
207 | * Add a trace buffer entry for the cursor/operation. | ||
208 | */ | ||
209 | void | ||
210 | xfs_btree_trace_cursor( | ||
211 | const char *func, | ||
212 | struct xfs_btree_cur *cur, | ||
213 | int type, | ||
214 | int line) | ||
215 | { | ||
216 | __uint32_t s0; | ||
217 | __uint64_t l0, l1; | ||
218 | char *s; | ||
219 | |||
220 | switch (type) { | ||
221 | case XBT_ARGS: | ||
222 | s = "args"; | ||
223 | break; | ||
224 | case XBT_ENTRY: | ||
225 | s = "entry"; | ||
226 | break; | ||
227 | case XBT_ERROR: | ||
228 | s = "error"; | ||
229 | break; | ||
230 | case XBT_EXIT: | ||
231 | s = "exit"; | ||
232 | break; | ||
233 | default: | ||
234 | s = "unknown"; | ||
235 | break; | ||
236 | } | ||
237 | |||
238 | cur->bc_ops->trace_cursor(cur, &s0, &l0, &l1); | ||
239 | cur->bc_ops->trace_enter(cur, func, s, XFS_BTREE_KTRACE_CUR, line, | ||
240 | s0, | ||
241 | l0 >> 32, (int)l0, | ||
242 | l1 >> 32, (int)l1, | ||
243 | (__psunsigned_t)cur->bc_bufs[0], | ||
244 | (__psunsigned_t)cur->bc_bufs[1], | ||
245 | (__psunsigned_t)cur->bc_bufs[2], | ||
246 | (__psunsigned_t)cur->bc_bufs[3], | ||
247 | (cur->bc_ptrs[0] << 16) | cur->bc_ptrs[1], | ||
248 | (cur->bc_ptrs[2] << 16) | cur->bc_ptrs[3]); | ||
249 | } | ||
diff --git a/fs/xfs/xfs_btree_trace.h b/fs/xfs/xfs_btree_trace.h new file mode 100644 index 000000000000..b3f5eb3c3c6c --- /dev/null +++ b/fs/xfs/xfs_btree_trace.h | |||
@@ -0,0 +1,116 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008 Silicon Graphics, Inc. | ||
3 | * All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it would be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write the Free Software Foundation, | ||
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | */ | ||
18 | #ifndef __XFS_BTREE_TRACE_H__ | ||
19 | #define __XFS_BTREE_TRACE_H__ | ||
20 | |||
21 | struct xfs_btree_cur; | ||
22 | struct xfs_buf; | ||
23 | |||
24 | |||
25 | /* | ||
26 | * Trace hooks. | ||
27 | * i,j = integer (32 bit) | ||
28 | * b = btree block buffer (xfs_buf_t) | ||
29 | * p = btree ptr | ||
30 | * r = btree record | ||
31 | * k = btree key | ||
32 | */ | ||
33 | |||
34 | #ifdef XFS_BTREE_TRACE | ||
35 | |||
36 | /* | ||
37 | * Trace buffer entry types. | ||
38 | */ | ||
39 | #define XFS_BTREE_KTRACE_ARGBI 1 | ||
40 | #define XFS_BTREE_KTRACE_ARGBII 2 | ||
41 | #define XFS_BTREE_KTRACE_ARGFFFI 3 | ||
42 | #define XFS_BTREE_KTRACE_ARGI 4 | ||
43 | #define XFS_BTREE_KTRACE_ARGIPK 5 | ||
44 | #define XFS_BTREE_KTRACE_ARGIPR 6 | ||
45 | #define XFS_BTREE_KTRACE_ARGIK 7 | ||
46 | #define XFS_BTREE_KTRACE_ARGR 8 | ||
47 | #define XFS_BTREE_KTRACE_CUR 9 | ||
48 | |||
49 | /* | ||
50 | * Sub-types for cursor traces. | ||
51 | */ | ||
52 | #define XBT_ARGS 0 | ||
53 | #define XBT_ENTRY 1 | ||
54 | #define XBT_ERROR 2 | ||
55 | #define XBT_EXIT 3 | ||
56 | |||
57 | void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *, | ||
58 | struct xfs_buf *, int, int); | ||
59 | void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *, | ||
60 | struct xfs_buf *, int, int, int); | ||
61 | void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *, | ||
62 | xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int); | ||
63 | void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int); | ||
64 | void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int, | ||
65 | union xfs_btree_ptr, union xfs_btree_key *, int); | ||
66 | void xfs_btree_trace_argipr(const char *, struct xfs_btree_cur *, int, | ||
67 | union xfs_btree_ptr, union xfs_btree_rec *, int); | ||
68 | void xfs_btree_trace_argik(const char *, struct xfs_btree_cur *, int, | ||
69 | union xfs_btree_key *, int); | ||
70 | void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *, | ||
71 | union xfs_btree_rec *, int); | ||
72 | void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int); | ||
73 | |||
74 | |||
75 | #define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */ | ||
76 | extern ktrace_t *xfs_allocbt_trace_buf; | ||
77 | |||
78 | #define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */ | ||
79 | extern ktrace_t *xfs_inobt_trace_buf; | ||
80 | |||
81 | #define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */ | ||
82 | #define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */ | ||
83 | extern ktrace_t *xfs_bmbt_trace_buf; | ||
84 | |||
85 | |||
86 | #define XFS_BTREE_TRACE_ARGBI(c, b, i) \ | ||
87 | xfs_btree_trace_argbi(__func__, c, b, i, __LINE__) | ||
88 | #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \ | ||
89 | xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__) | ||
90 | #define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \ | ||
91 | xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__) | ||
92 | #define XFS_BTREE_TRACE_ARGI(c, i) \ | ||
93 | xfs_btree_trace_argi(__func__, c, i, __LINE__) | ||
94 | #define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \ | ||
95 | xfs_btree_trace_argipk(__func__, c, i, p, k, __LINE__) | ||
96 | #define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) \ | ||
97 | xfs_btree_trace_argipr(__func__, c, i, p, r, __LINE__) | ||
98 | #define XFS_BTREE_TRACE_ARGIK(c, i, k) \ | ||
99 | xfs_btree_trace_argik(__func__, c, i, k, __LINE__) | ||
100 | #define XFS_BTREE_TRACE_ARGR(c, r) \ | ||
101 | xfs_btree_trace_argr(__func__, c, r, __LINE__) | ||
102 | #define XFS_BTREE_TRACE_CURSOR(c, t) \ | ||
103 | xfs_btree_trace_cursor(__func__, c, t, __LINE__) | ||
104 | #else | ||
105 | #define XFS_BTREE_TRACE_ARGBI(c, b, i) | ||
106 | #define XFS_BTREE_TRACE_ARGBII(c, b, i, j) | ||
107 | #define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) | ||
108 | #define XFS_BTREE_TRACE_ARGI(c, i) | ||
109 | #define XFS_BTREE_TRACE_ARGIPK(c, i, p, s) | ||
110 | #define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) | ||
111 | #define XFS_BTREE_TRACE_ARGIK(c, i, k) | ||
112 | #define XFS_BTREE_TRACE_ARGR(c, r) | ||
113 | #define XFS_BTREE_TRACE_CURSOR(c, t) | ||
114 | #endif /* XFS_BTREE_TRACE */ | ||
115 | |||
116 | #endif /* __XFS_BTREE_TRACE_H__ */ | ||