xref: /openbmc/linux/fs/xfs/scrub/trace.h (revision 89e33ea7)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5  */
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM xfs_scrub
8 
9 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
10 #define _TRACE_XFS_SCRUB_TRACE_H
11 
12 #include <linux/tracepoint.h>
13 #include "xfs_bit.h"
14 
15 /*
16  * ftrace's __print_symbolic requires that all enum values be wrapped in the
17  * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
18  * ring buffer.  Somehow this was only worth mentioning in the ftrace sample
19  * code.
20  */
21 TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi);
22 TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi);
23 TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi);
24 TRACE_DEFINE_ENUM(XFS_BTNUM_INOi);
25 TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
26 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
27 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
28 
29 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
30 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
31 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
32 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
33 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
34 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
35 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
36 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
37 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
38 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
39 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
40 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
53 
54 #define XFS_SCRUB_TYPE_STRINGS \
55 	{ XFS_SCRUB_TYPE_PROBE,		"probe" }, \
56 	{ XFS_SCRUB_TYPE_SB,		"sb" }, \
57 	{ XFS_SCRUB_TYPE_AGF,		"agf" }, \
58 	{ XFS_SCRUB_TYPE_AGFL,		"agfl" }, \
59 	{ XFS_SCRUB_TYPE_AGI,		"agi" }, \
60 	{ XFS_SCRUB_TYPE_BNOBT,		"bnobt" }, \
61 	{ XFS_SCRUB_TYPE_CNTBT,		"cntbt" }, \
62 	{ XFS_SCRUB_TYPE_INOBT,		"inobt" }, \
63 	{ XFS_SCRUB_TYPE_FINOBT,	"finobt" }, \
64 	{ XFS_SCRUB_TYPE_RMAPBT,	"rmapbt" }, \
65 	{ XFS_SCRUB_TYPE_REFCNTBT,	"refcountbt" }, \
66 	{ XFS_SCRUB_TYPE_INODE,		"inode" }, \
67 	{ XFS_SCRUB_TYPE_BMBTD,		"bmapbtd" }, \
68 	{ XFS_SCRUB_TYPE_BMBTA,		"bmapbta" }, \
69 	{ XFS_SCRUB_TYPE_BMBTC,		"bmapbtc" }, \
70 	{ XFS_SCRUB_TYPE_DIR,		"directory" }, \
71 	{ XFS_SCRUB_TYPE_XATTR,		"xattr" }, \
72 	{ XFS_SCRUB_TYPE_SYMLINK,	"symlink" }, \
73 	{ XFS_SCRUB_TYPE_PARENT,	"parent" }, \
74 	{ XFS_SCRUB_TYPE_RTBITMAP,	"rtbitmap" }, \
75 	{ XFS_SCRUB_TYPE_RTSUM,		"rtsummary" }, \
76 	{ XFS_SCRUB_TYPE_UQUOTA,	"usrquota" }, \
77 	{ XFS_SCRUB_TYPE_GQUOTA,	"grpquota" }, \
78 	{ XFS_SCRUB_TYPE_PQUOTA,	"prjquota" }
79 
80 DECLARE_EVENT_CLASS(xchk_class,
81 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
82 		 int error),
83 	TP_ARGS(ip, sm, error),
84 	TP_STRUCT__entry(
85 		__field(dev_t, dev)
86 		__field(xfs_ino_t, ino)
87 		__field(unsigned int, type)
88 		__field(xfs_agnumber_t, agno)
89 		__field(xfs_ino_t, inum)
90 		__field(unsigned int, gen)
91 		__field(unsigned int, flags)
92 		__field(int, error)
93 	),
94 	TP_fast_assign(
95 		__entry->dev = ip->i_mount->m_super->s_dev;
96 		__entry->ino = ip->i_ino;
97 		__entry->type = sm->sm_type;
98 		__entry->agno = sm->sm_agno;
99 		__entry->inum = sm->sm_ino;
100 		__entry->gen = sm->sm_gen;
101 		__entry->flags = sm->sm_flags;
102 		__entry->error = error;
103 	),
104 	TP_printk("dev %d:%d ino 0x%llx type %s agno %u inum %llu gen %u flags 0x%x error %d",
105 		  MAJOR(__entry->dev), MINOR(__entry->dev),
106 		  __entry->ino,
107 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
108 		  __entry->agno,
109 		  __entry->inum,
110 		  __entry->gen,
111 		  __entry->flags,
112 		  __entry->error)
113 )
114 #define DEFINE_SCRUB_EVENT(name) \
115 DEFINE_EVENT(xchk_class, name, \
116 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
117 		 int error), \
118 	TP_ARGS(ip, sm, error))
119 
120 DEFINE_SCRUB_EVENT(xchk_start);
121 DEFINE_SCRUB_EVENT(xchk_done);
122 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
123 DEFINE_SCRUB_EVENT(xrep_attempt);
124 DEFINE_SCRUB_EVENT(xrep_done);
125 
126 TRACE_EVENT(xchk_op_error,
127 	TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
128 		 xfs_agblock_t bno, int error, void *ret_ip),
129 	TP_ARGS(sc, agno, bno, error, ret_ip),
130 	TP_STRUCT__entry(
131 		__field(dev_t, dev)
132 		__field(unsigned int, type)
133 		__field(xfs_agnumber_t, agno)
134 		__field(xfs_agblock_t, bno)
135 		__field(int, error)
136 		__field(void *, ret_ip)
137 	),
138 	TP_fast_assign(
139 		__entry->dev = sc->mp->m_super->s_dev;
140 		__entry->type = sc->sm->sm_type;
141 		__entry->agno = agno;
142 		__entry->bno = bno;
143 		__entry->error = error;
144 		__entry->ret_ip = ret_ip;
145 	),
146 	TP_printk("dev %d:%d type %s agno %u agbno %u error %d ret_ip %pS",
147 		  MAJOR(__entry->dev), MINOR(__entry->dev),
148 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
149 		  __entry->agno,
150 		  __entry->bno,
151 		  __entry->error,
152 		  __entry->ret_ip)
153 );
154 
155 TRACE_EVENT(xchk_file_op_error,
156 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
157 		 xfs_fileoff_t offset, int error, void *ret_ip),
158 	TP_ARGS(sc, whichfork, offset, error, ret_ip),
159 	TP_STRUCT__entry(
160 		__field(dev_t, dev)
161 		__field(xfs_ino_t, ino)
162 		__field(int, whichfork)
163 		__field(unsigned int, type)
164 		__field(xfs_fileoff_t, offset)
165 		__field(int, error)
166 		__field(void *, ret_ip)
167 	),
168 	TP_fast_assign(
169 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
170 		__entry->ino = sc->ip->i_ino;
171 		__entry->whichfork = whichfork;
172 		__entry->type = sc->sm->sm_type;
173 		__entry->offset = offset;
174 		__entry->error = error;
175 		__entry->ret_ip = ret_ip;
176 	),
177 	TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu error %d ret_ip %pS",
178 		  MAJOR(__entry->dev), MINOR(__entry->dev),
179 		  __entry->ino,
180 		  __entry->whichfork,
181 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
182 		  __entry->offset,
183 		  __entry->error,
184 		  __entry->ret_ip)
185 );
186 
187 DECLARE_EVENT_CLASS(xchk_block_error_class,
188 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
189 	TP_ARGS(sc, daddr, ret_ip),
190 	TP_STRUCT__entry(
191 		__field(dev_t, dev)
192 		__field(unsigned int, type)
193 		__field(xfs_agnumber_t, agno)
194 		__field(xfs_agblock_t, bno)
195 		__field(void *, ret_ip)
196 	),
197 	TP_fast_assign(
198 		xfs_fsblock_t	fsbno;
199 		xfs_agnumber_t	agno;
200 		xfs_agblock_t	bno;
201 
202 		fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
203 		agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
204 		bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
205 
206 		__entry->dev = sc->mp->m_super->s_dev;
207 		__entry->type = sc->sm->sm_type;
208 		__entry->agno = agno;
209 		__entry->bno = bno;
210 		__entry->ret_ip = ret_ip;
211 	),
212 	TP_printk("dev %d:%d type %s agno %u agbno %u ret_ip %pS",
213 		  MAJOR(__entry->dev), MINOR(__entry->dev),
214 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
215 		  __entry->agno,
216 		  __entry->bno,
217 		  __entry->ret_ip)
218 )
219 
220 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
221 DEFINE_EVENT(xchk_block_error_class, name, \
222 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
223 		 void *ret_ip), \
224 	TP_ARGS(sc, daddr, ret_ip))
225 
226 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
227 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
228 
229 DECLARE_EVENT_CLASS(xchk_ino_error_class,
230 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
231 	TP_ARGS(sc, ino, ret_ip),
232 	TP_STRUCT__entry(
233 		__field(dev_t, dev)
234 		__field(xfs_ino_t, ino)
235 		__field(unsigned int, type)
236 		__field(void *, ret_ip)
237 	),
238 	TP_fast_assign(
239 		__entry->dev = sc->mp->m_super->s_dev;
240 		__entry->ino = ino;
241 		__entry->type = sc->sm->sm_type;
242 		__entry->ret_ip = ret_ip;
243 	),
244 	TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
245 		  MAJOR(__entry->dev), MINOR(__entry->dev),
246 		  __entry->ino,
247 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
248 		  __entry->ret_ip)
249 )
250 
251 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
252 DEFINE_EVENT(xchk_ino_error_class, name, \
253 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
254 		 void *ret_ip), \
255 	TP_ARGS(sc, ino, ret_ip))
256 
257 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
258 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
259 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
260 
261 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
262 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
263 		 xfs_fileoff_t offset, void *ret_ip),
264 	TP_ARGS(sc, whichfork, offset, ret_ip),
265 	TP_STRUCT__entry(
266 		__field(dev_t, dev)
267 		__field(xfs_ino_t, ino)
268 		__field(int, whichfork)
269 		__field(unsigned int, type)
270 		__field(xfs_fileoff_t, offset)
271 		__field(void *, ret_ip)
272 	),
273 	TP_fast_assign(
274 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
275 		__entry->ino = sc->ip->i_ino;
276 		__entry->whichfork = whichfork;
277 		__entry->type = sc->sm->sm_type;
278 		__entry->offset = offset;
279 		__entry->ret_ip = ret_ip;
280 	),
281 	TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu ret_ip %pS",
282 		  MAJOR(__entry->dev), MINOR(__entry->dev),
283 		  __entry->ino,
284 		  __entry->whichfork,
285 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
286 		  __entry->offset,
287 		  __entry->ret_ip)
288 );
289 
290 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
291 DEFINE_EVENT(xchk_fblock_error_class, name, \
292 	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
293 		 xfs_fileoff_t offset, void *ret_ip), \
294 	TP_ARGS(sc, whichfork, offset, ret_ip))
295 
296 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
297 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
298 
299 TRACE_EVENT(xchk_incomplete,
300 	TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
301 	TP_ARGS(sc, ret_ip),
302 	TP_STRUCT__entry(
303 		__field(dev_t, dev)
304 		__field(unsigned int, type)
305 		__field(void *, ret_ip)
306 	),
307 	TP_fast_assign(
308 		__entry->dev = sc->mp->m_super->s_dev;
309 		__entry->type = sc->sm->sm_type;
310 		__entry->ret_ip = ret_ip;
311 	),
312 	TP_printk("dev %d:%d type %s ret_ip %pS",
313 		  MAJOR(__entry->dev), MINOR(__entry->dev),
314 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
315 		  __entry->ret_ip)
316 );
317 
318 TRACE_EVENT(xchk_btree_op_error,
319 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
320 		 int level, int error, void *ret_ip),
321 	TP_ARGS(sc, cur, level, error, ret_ip),
322 	TP_STRUCT__entry(
323 		__field(dev_t, dev)
324 		__field(unsigned int, type)
325 		__field(xfs_btnum_t, btnum)
326 		__field(int, level)
327 		__field(xfs_agnumber_t, agno)
328 		__field(xfs_agblock_t, bno)
329 		__field(int, ptr);
330 		__field(int, error)
331 		__field(void *, ret_ip)
332 	),
333 	TP_fast_assign(
334 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
335 
336 		__entry->dev = sc->mp->m_super->s_dev;
337 		__entry->type = sc->sm->sm_type;
338 		__entry->btnum = cur->bc_btnum;
339 		__entry->level = level;
340 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
341 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
342 		__entry->ptr = cur->bc_ptrs[level];
343 		__entry->error = error;
344 		__entry->ret_ip = ret_ip;
345 	),
346 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
347 		  MAJOR(__entry->dev), MINOR(__entry->dev),
348 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
349 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
350 		  __entry->level,
351 		  __entry->ptr,
352 		  __entry->agno,
353 		  __entry->bno,
354 		  __entry->error,
355 		  __entry->ret_ip)
356 );
357 
358 TRACE_EVENT(xchk_ifork_btree_op_error,
359 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
360 		 int level, int error, void *ret_ip),
361 	TP_ARGS(sc, cur, level, error, ret_ip),
362 	TP_STRUCT__entry(
363 		__field(dev_t, dev)
364 		__field(xfs_ino_t, ino)
365 		__field(int, whichfork)
366 		__field(unsigned int, type)
367 		__field(xfs_btnum_t, btnum)
368 		__field(int, level)
369 		__field(int, ptr)
370 		__field(xfs_agnumber_t, agno)
371 		__field(xfs_agblock_t, bno)
372 		__field(int, error)
373 		__field(void *, ret_ip)
374 	),
375 	TP_fast_assign(
376 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
377 		__entry->dev = sc->mp->m_super->s_dev;
378 		__entry->ino = sc->ip->i_ino;
379 		__entry->whichfork = cur->bc_private.b.whichfork;
380 		__entry->type = sc->sm->sm_type;
381 		__entry->btnum = cur->bc_btnum;
382 		__entry->level = level;
383 		__entry->ptr = cur->bc_ptrs[level];
384 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
385 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
386 		__entry->error = error;
387 		__entry->ret_ip = ret_ip;
388 	),
389 	TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
390 		  MAJOR(__entry->dev), MINOR(__entry->dev),
391 		  __entry->ino,
392 		  __entry->whichfork,
393 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
394 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
395 		  __entry->level,
396 		  __entry->ptr,
397 		  __entry->agno,
398 		  __entry->bno,
399 		  __entry->error,
400 		  __entry->ret_ip)
401 );
402 
403 TRACE_EVENT(xchk_btree_error,
404 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
405 		 int level, void *ret_ip),
406 	TP_ARGS(sc, cur, level, ret_ip),
407 	TP_STRUCT__entry(
408 		__field(dev_t, dev)
409 		__field(unsigned int, type)
410 		__field(xfs_btnum_t, btnum)
411 		__field(int, level)
412 		__field(xfs_agnumber_t, agno)
413 		__field(xfs_agblock_t, bno)
414 		__field(int, ptr);
415 		__field(void *, ret_ip)
416 	),
417 	TP_fast_assign(
418 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
419 		__entry->dev = sc->mp->m_super->s_dev;
420 		__entry->type = sc->sm->sm_type;
421 		__entry->btnum = cur->bc_btnum;
422 		__entry->level = level;
423 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
424 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
425 		__entry->ptr = cur->bc_ptrs[level];
426 		__entry->ret_ip = ret_ip;
427 	),
428 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS",
429 		  MAJOR(__entry->dev), MINOR(__entry->dev),
430 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
431 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
432 		  __entry->level,
433 		  __entry->ptr,
434 		  __entry->agno,
435 		  __entry->bno,
436 		  __entry->ret_ip)
437 );
438 
439 TRACE_EVENT(xchk_ifork_btree_error,
440 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
441 		 int level, void *ret_ip),
442 	TP_ARGS(sc, cur, level, ret_ip),
443 	TP_STRUCT__entry(
444 		__field(dev_t, dev)
445 		__field(xfs_ino_t, ino)
446 		__field(int, whichfork)
447 		__field(unsigned int, type)
448 		__field(xfs_btnum_t, btnum)
449 		__field(int, level)
450 		__field(xfs_agnumber_t, agno)
451 		__field(xfs_agblock_t, bno)
452 		__field(int, ptr);
453 		__field(void *, ret_ip)
454 	),
455 	TP_fast_assign(
456 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
457 		__entry->dev = sc->mp->m_super->s_dev;
458 		__entry->ino = sc->ip->i_ino;
459 		__entry->whichfork = cur->bc_private.b.whichfork;
460 		__entry->type = sc->sm->sm_type;
461 		__entry->btnum = cur->bc_btnum;
462 		__entry->level = level;
463 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
464 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
465 		__entry->ptr = cur->bc_ptrs[level];
466 		__entry->ret_ip = ret_ip;
467 	),
468 	TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS",
469 		  MAJOR(__entry->dev), MINOR(__entry->dev),
470 		  __entry->ino,
471 		  __entry->whichfork,
472 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
473 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
474 		  __entry->level,
475 		  __entry->ptr,
476 		  __entry->agno,
477 		  __entry->bno,
478 		  __entry->ret_ip)
479 );
480 
481 DECLARE_EVENT_CLASS(xchk_sbtree_class,
482 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
483 		 int level),
484 	TP_ARGS(sc, cur, level),
485 	TP_STRUCT__entry(
486 		__field(dev_t, dev)
487 		__field(int, type)
488 		__field(xfs_btnum_t, btnum)
489 		__field(xfs_agnumber_t, agno)
490 		__field(xfs_agblock_t, bno)
491 		__field(int, level)
492 		__field(int, nlevels)
493 		__field(int, ptr)
494 	),
495 	TP_fast_assign(
496 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
497 
498 		__entry->dev = sc->mp->m_super->s_dev;
499 		__entry->type = sc->sm->sm_type;
500 		__entry->btnum = cur->bc_btnum;
501 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
502 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
503 		__entry->level = level;
504 		__entry->nlevels = cur->bc_nlevels;
505 		__entry->ptr = cur->bc_ptrs[level];
506 	),
507 	TP_printk("dev %d:%d type %s btree %s agno %u agbno %u level %d nlevels %d ptr %d",
508 		  MAJOR(__entry->dev), MINOR(__entry->dev),
509 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
510 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
511 		  __entry->agno,
512 		  __entry->bno,
513 		  __entry->level,
514 		  __entry->nlevels,
515 		  __entry->ptr)
516 )
517 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
518 DEFINE_EVENT(xchk_sbtree_class, name, \
519 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
520 		 int level), \
521 	TP_ARGS(sc, cur, level))
522 
523 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
524 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
525 
526 TRACE_EVENT(xchk_xref_error,
527 	TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
528 	TP_ARGS(sc, error, ret_ip),
529 	TP_STRUCT__entry(
530 		__field(dev_t, dev)
531 		__field(int, type)
532 		__field(int, error)
533 		__field(void *, ret_ip)
534 	),
535 	TP_fast_assign(
536 		__entry->dev = sc->mp->m_super->s_dev;
537 		__entry->type = sc->sm->sm_type;
538 		__entry->error = error;
539 		__entry->ret_ip = ret_ip;
540 	),
541 	TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
542 		  MAJOR(__entry->dev), MINOR(__entry->dev),
543 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
544 		  __entry->error,
545 		  __entry->ret_ip)
546 );
547 
548 TRACE_EVENT(xchk_iallocbt_check_cluster,
549 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
550 		 xfs_agino_t startino, xfs_daddr_t map_daddr,
551 		 unsigned short map_len, unsigned int chunk_ino,
552 		 unsigned int nr_inodes, uint16_t cluster_mask,
553 		 uint16_t holemask, unsigned int cluster_ino),
554 	TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
555 		cluster_mask, holemask, cluster_ino),
556 	TP_STRUCT__entry(
557 		__field(dev_t, dev)
558 		__field(xfs_agnumber_t, agno)
559 		__field(xfs_agino_t, startino)
560 		__field(xfs_daddr_t, map_daddr)
561 		__field(unsigned short, map_len)
562 		__field(unsigned int, chunk_ino)
563 		__field(unsigned int, nr_inodes)
564 		__field(unsigned int, cluster_ino)
565 		__field(uint16_t, cluster_mask)
566 		__field(uint16_t, holemask)
567 	),
568 	TP_fast_assign(
569 		__entry->dev = mp->m_super->s_dev;
570 		__entry->agno = agno;
571 		__entry->startino = startino;
572 		__entry->map_daddr = map_daddr;
573 		__entry->map_len = map_len;
574 		__entry->chunk_ino = chunk_ino;
575 		__entry->nr_inodes = nr_inodes;
576 		__entry->cluster_mask = cluster_mask;
577 		__entry->holemask = holemask;
578 		__entry->cluster_ino = cluster_ino;
579 	),
580 	TP_printk("dev %d:%d agno %d startino %u daddr 0x%llx len %d chunkino %u nr_inodes %u cluster_mask 0x%x holemask 0x%x cluster_ino %u",
581 		  MAJOR(__entry->dev), MINOR(__entry->dev),
582 		  __entry->agno,
583 		  __entry->startino,
584 		  __entry->map_daddr,
585 		  __entry->map_len,
586 		  __entry->chunk_ino,
587 		  __entry->nr_inodes,
588 		  __entry->cluster_mask,
589 		  __entry->holemask,
590 		  __entry->cluster_ino)
591 )
592 
593 /* repair tracepoints */
594 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
595 
596 DECLARE_EVENT_CLASS(xrep_extent_class,
597 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
598 		 xfs_agblock_t agbno, xfs_extlen_t len),
599 	TP_ARGS(mp, agno, agbno, len),
600 	TP_STRUCT__entry(
601 		__field(dev_t, dev)
602 		__field(xfs_agnumber_t, agno)
603 		__field(xfs_agblock_t, agbno)
604 		__field(xfs_extlen_t, len)
605 	),
606 	TP_fast_assign(
607 		__entry->dev = mp->m_super->s_dev;
608 		__entry->agno = agno;
609 		__entry->agbno = agbno;
610 		__entry->len = len;
611 	),
612 	TP_printk("dev %d:%d agno %u agbno %u len %u",
613 		  MAJOR(__entry->dev), MINOR(__entry->dev),
614 		  __entry->agno,
615 		  __entry->agbno,
616 		  __entry->len)
617 );
618 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
619 DEFINE_EVENT(xrep_extent_class, name, \
620 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
621 		 xfs_agblock_t agbno, xfs_extlen_t len), \
622 	TP_ARGS(mp, agno, agbno, len))
623 DEFINE_REPAIR_EXTENT_EVENT(xrep_dispose_btree_extent);
624 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
625 
626 DECLARE_EVENT_CLASS(xrep_rmap_class,
627 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
628 		 xfs_agblock_t agbno, xfs_extlen_t len,
629 		 uint64_t owner, uint64_t offset, unsigned int flags),
630 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
631 	TP_STRUCT__entry(
632 		__field(dev_t, dev)
633 		__field(xfs_agnumber_t, agno)
634 		__field(xfs_agblock_t, agbno)
635 		__field(xfs_extlen_t, len)
636 		__field(uint64_t, owner)
637 		__field(uint64_t, offset)
638 		__field(unsigned int, flags)
639 	),
640 	TP_fast_assign(
641 		__entry->dev = mp->m_super->s_dev;
642 		__entry->agno = agno;
643 		__entry->agbno = agbno;
644 		__entry->len = len;
645 		__entry->owner = owner;
646 		__entry->offset = offset;
647 		__entry->flags = flags;
648 	),
649 	TP_printk("dev %d:%d agno %u agbno %u len %u owner %lld offset %llu flags 0x%x",
650 		  MAJOR(__entry->dev), MINOR(__entry->dev),
651 		  __entry->agno,
652 		  __entry->agbno,
653 		  __entry->len,
654 		  __entry->owner,
655 		  __entry->offset,
656 		  __entry->flags)
657 );
658 #define DEFINE_REPAIR_RMAP_EVENT(name) \
659 DEFINE_EVENT(xrep_rmap_class, name, \
660 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
661 		 xfs_agblock_t agbno, xfs_extlen_t len, \
662 		 uint64_t owner, uint64_t offset, unsigned int flags), \
663 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
664 DEFINE_REPAIR_RMAP_EVENT(xrep_alloc_extent_fn);
665 DEFINE_REPAIR_RMAP_EVENT(xrep_ialloc_extent_fn);
666 DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn);
667 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_extent_fn);
668 
669 TRACE_EVENT(xrep_refcount_extent_fn,
670 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
671 		 struct xfs_refcount_irec *irec),
672 	TP_ARGS(mp, agno, irec),
673 	TP_STRUCT__entry(
674 		__field(dev_t, dev)
675 		__field(xfs_agnumber_t, agno)
676 		__field(xfs_agblock_t, startblock)
677 		__field(xfs_extlen_t, blockcount)
678 		__field(xfs_nlink_t, refcount)
679 	),
680 	TP_fast_assign(
681 		__entry->dev = mp->m_super->s_dev;
682 		__entry->agno = agno;
683 		__entry->startblock = irec->rc_startblock;
684 		__entry->blockcount = irec->rc_blockcount;
685 		__entry->refcount = irec->rc_refcount;
686 	),
687 	TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u",
688 		  MAJOR(__entry->dev), MINOR(__entry->dev),
689 		  __entry->agno,
690 		  __entry->startblock,
691 		  __entry->blockcount,
692 		  __entry->refcount)
693 )
694 
695 TRACE_EVENT(xrep_init_btblock,
696 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
697 		 xfs_btnum_t btnum),
698 	TP_ARGS(mp, agno, agbno, btnum),
699 	TP_STRUCT__entry(
700 		__field(dev_t, dev)
701 		__field(xfs_agnumber_t, agno)
702 		__field(xfs_agblock_t, agbno)
703 		__field(uint32_t, btnum)
704 	),
705 	TP_fast_assign(
706 		__entry->dev = mp->m_super->s_dev;
707 		__entry->agno = agno;
708 		__entry->agbno = agbno;
709 		__entry->btnum = btnum;
710 	),
711 	TP_printk("dev %d:%d agno %u agbno %u btree %s",
712 		  MAJOR(__entry->dev), MINOR(__entry->dev),
713 		  __entry->agno,
714 		  __entry->agbno,
715 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS))
716 )
717 TRACE_EVENT(xrep_findroot_block,
718 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
719 		 uint32_t magic, uint16_t level),
720 	TP_ARGS(mp, agno, agbno, magic, level),
721 	TP_STRUCT__entry(
722 		__field(dev_t, dev)
723 		__field(xfs_agnumber_t, agno)
724 		__field(xfs_agblock_t, agbno)
725 		__field(uint32_t, magic)
726 		__field(uint16_t, level)
727 	),
728 	TP_fast_assign(
729 		__entry->dev = mp->m_super->s_dev;
730 		__entry->agno = agno;
731 		__entry->agbno = agbno;
732 		__entry->magic = magic;
733 		__entry->level = level;
734 	),
735 	TP_printk("dev %d:%d agno %u agbno %u magic 0x%x level %u",
736 		  MAJOR(__entry->dev), MINOR(__entry->dev),
737 		  __entry->agno,
738 		  __entry->agbno,
739 		  __entry->magic,
740 		  __entry->level)
741 )
742 TRACE_EVENT(xrep_calc_ag_resblks,
743 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
744 		 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
745 		 xfs_agblock_t usedlen),
746 	TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
747 	TP_STRUCT__entry(
748 		__field(dev_t, dev)
749 		__field(xfs_agnumber_t, agno)
750 		__field(xfs_agino_t, icount)
751 		__field(xfs_agblock_t, aglen)
752 		__field(xfs_agblock_t, freelen)
753 		__field(xfs_agblock_t, usedlen)
754 	),
755 	TP_fast_assign(
756 		__entry->dev = mp->m_super->s_dev;
757 		__entry->agno = agno;
758 		__entry->icount = icount;
759 		__entry->aglen = aglen;
760 		__entry->freelen = freelen;
761 		__entry->usedlen = usedlen;
762 	),
763 	TP_printk("dev %d:%d agno %d icount %u aglen %u freelen %u usedlen %u",
764 		  MAJOR(__entry->dev), MINOR(__entry->dev),
765 		  __entry->agno,
766 		  __entry->icount,
767 		  __entry->aglen,
768 		  __entry->freelen,
769 		  __entry->usedlen)
770 )
771 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
772 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
773 		 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
774 		 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
775 	TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
776 	TP_STRUCT__entry(
777 		__field(dev_t, dev)
778 		__field(xfs_agnumber_t, agno)
779 		__field(xfs_agblock_t, bnobt_sz)
780 		__field(xfs_agblock_t, inobt_sz)
781 		__field(xfs_agblock_t, rmapbt_sz)
782 		__field(xfs_agblock_t, refcbt_sz)
783 	),
784 	TP_fast_assign(
785 		__entry->dev = mp->m_super->s_dev;
786 		__entry->agno = agno;
787 		__entry->bnobt_sz = bnobt_sz;
788 		__entry->inobt_sz = inobt_sz;
789 		__entry->rmapbt_sz = rmapbt_sz;
790 		__entry->refcbt_sz = refcbt_sz;
791 	),
792 	TP_printk("dev %d:%d agno %d bno %u ino %u rmap %u refcount %u",
793 		  MAJOR(__entry->dev), MINOR(__entry->dev),
794 		  __entry->agno,
795 		  __entry->bnobt_sz,
796 		  __entry->inobt_sz,
797 		  __entry->rmapbt_sz,
798 		  __entry->refcbt_sz)
799 )
800 TRACE_EVENT(xrep_reset_counters,
801 	TP_PROTO(struct xfs_mount *mp),
802 	TP_ARGS(mp),
803 	TP_STRUCT__entry(
804 		__field(dev_t, dev)
805 	),
806 	TP_fast_assign(
807 		__entry->dev = mp->m_super->s_dev;
808 	),
809 	TP_printk("dev %d:%d",
810 		  MAJOR(__entry->dev), MINOR(__entry->dev))
811 )
812 
813 TRACE_EVENT(xrep_ialloc_insert,
814 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
815 		 xfs_agino_t startino, uint16_t holemask, uint8_t count,
816 		 uint8_t freecount, uint64_t freemask),
817 	TP_ARGS(mp, agno, startino, holemask, count, freecount, freemask),
818 	TP_STRUCT__entry(
819 		__field(dev_t, dev)
820 		__field(xfs_agnumber_t, agno)
821 		__field(xfs_agino_t, startino)
822 		__field(uint16_t, holemask)
823 		__field(uint8_t, count)
824 		__field(uint8_t, freecount)
825 		__field(uint64_t, freemask)
826 	),
827 	TP_fast_assign(
828 		__entry->dev = mp->m_super->s_dev;
829 		__entry->agno = agno;
830 		__entry->startino = startino;
831 		__entry->holemask = holemask;
832 		__entry->count = count;
833 		__entry->freecount = freecount;
834 		__entry->freemask = freemask;
835 	),
836 	TP_printk("dev %d:%d agno %d startino %u holemask 0x%x count %u freecount %u freemask 0x%llx",
837 		  MAJOR(__entry->dev), MINOR(__entry->dev),
838 		  __entry->agno,
839 		  __entry->startino,
840 		  __entry->holemask,
841 		  __entry->count,
842 		  __entry->freecount,
843 		  __entry->freemask)
844 )
845 
846 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
847 
848 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
849 
850 #undef TRACE_INCLUDE_PATH
851 #define TRACE_INCLUDE_PATH .
852 #define TRACE_INCLUDE_FILE scrub/trace
853 #include <trace/define_trace.h>
854