1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2017-2023 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  *
6  * NOTE: none of these tracepoints shall be considered a stable kernel ABI
7  * as they can change at any time.  See xfs_trace.h for documentation of
8  * specific units found in tracepoint output.
9  */
10 #undef TRACE_SYSTEM
11 #define TRACE_SYSTEM xfs_scrub
12 
13 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define _TRACE_XFS_SCRUB_TRACE_H
15 
16 #include <linux/tracepoint.h>
17 #include "xfs_bit.h"
18 
19 struct xfile;
20 struct xfarray;
21 struct xfarray_sortinfo;
22 
23 /*
24  * ftrace's __print_symbolic requires that all enum values be wrapped in the
25  * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
26  * ring buffer.  Somehow this was only worth mentioning in the ftrace sample
27  * code.
28  */
29 TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi);
30 TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi);
31 TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi);
32 TRACE_DEFINE_ENUM(XFS_BTNUM_INOi);
33 TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
34 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
35 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
36 
37 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
38 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
39 
40 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
54 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
55 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
56 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
57 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
58 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
59 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
60 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
61 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
62 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
63 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
64 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
65 
66 #define XFS_SCRUB_TYPE_STRINGS \
67 	{ XFS_SCRUB_TYPE_PROBE,		"probe" }, \
68 	{ XFS_SCRUB_TYPE_SB,		"sb" }, \
69 	{ XFS_SCRUB_TYPE_AGF,		"agf" }, \
70 	{ XFS_SCRUB_TYPE_AGFL,		"agfl" }, \
71 	{ XFS_SCRUB_TYPE_AGI,		"agi" }, \
72 	{ XFS_SCRUB_TYPE_BNOBT,		"bnobt" }, \
73 	{ XFS_SCRUB_TYPE_CNTBT,		"cntbt" }, \
74 	{ XFS_SCRUB_TYPE_INOBT,		"inobt" }, \
75 	{ XFS_SCRUB_TYPE_FINOBT,	"finobt" }, \
76 	{ XFS_SCRUB_TYPE_RMAPBT,	"rmapbt" }, \
77 	{ XFS_SCRUB_TYPE_REFCNTBT,	"refcountbt" }, \
78 	{ XFS_SCRUB_TYPE_INODE,		"inode" }, \
79 	{ XFS_SCRUB_TYPE_BMBTD,		"bmapbtd" }, \
80 	{ XFS_SCRUB_TYPE_BMBTA,		"bmapbta" }, \
81 	{ XFS_SCRUB_TYPE_BMBTC,		"bmapbtc" }, \
82 	{ XFS_SCRUB_TYPE_DIR,		"directory" }, \
83 	{ XFS_SCRUB_TYPE_XATTR,		"xattr" }, \
84 	{ XFS_SCRUB_TYPE_SYMLINK,	"symlink" }, \
85 	{ XFS_SCRUB_TYPE_PARENT,	"parent" }, \
86 	{ XFS_SCRUB_TYPE_RTBITMAP,	"rtbitmap" }, \
87 	{ XFS_SCRUB_TYPE_RTSUM,		"rtsummary" }, \
88 	{ XFS_SCRUB_TYPE_UQUOTA,	"usrquota" }, \
89 	{ XFS_SCRUB_TYPE_GQUOTA,	"grpquota" }, \
90 	{ XFS_SCRUB_TYPE_PQUOTA,	"prjquota" }, \
91 	{ XFS_SCRUB_TYPE_FSCOUNTERS,	"fscounters" }
92 
93 #define XFS_SCRUB_FLAG_STRINGS \
94 	{ XFS_SCRUB_IFLAG_REPAIR,		"repair" }, \
95 	{ XFS_SCRUB_OFLAG_CORRUPT,		"corrupt" }, \
96 	{ XFS_SCRUB_OFLAG_PREEN,		"preen" }, \
97 	{ XFS_SCRUB_OFLAG_XFAIL,		"xfail" }, \
98 	{ XFS_SCRUB_OFLAG_XCORRUPT,		"xcorrupt" }, \
99 	{ XFS_SCRUB_OFLAG_INCOMPLETE,		"incomplete" }, \
100 	{ XFS_SCRUB_OFLAG_WARNING,		"warning" }, \
101 	{ XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED,	"norepair" }, \
102 	{ XFS_SCRUB_IFLAG_FORCE_REBUILD,	"rebuild" }
103 
104 #define XFS_SCRUB_STATE_STRINGS \
105 	{ XCHK_TRY_HARDER,			"try_harder" }, \
106 	{ XCHK_HAVE_FREEZE_PROT,		"nofreeze" }, \
107 	{ XCHK_FSGATES_DRAIN,			"fsgates_drain" }, \
108 	{ XCHK_NEED_DRAIN,			"need_drain" }, \
109 	{ XREP_ALREADY_FIXED,			"already_fixed" }
110 
111 DECLARE_EVENT_CLASS(xchk_class,
112 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
113 		 int error),
114 	TP_ARGS(ip, sm, error),
115 	TP_STRUCT__entry(
116 		__field(dev_t, dev)
117 		__field(xfs_ino_t, ino)
118 		__field(unsigned int, type)
119 		__field(xfs_agnumber_t, agno)
120 		__field(xfs_ino_t, inum)
121 		__field(unsigned int, gen)
122 		__field(unsigned int, flags)
123 		__field(int, error)
124 	),
125 	TP_fast_assign(
126 		__entry->dev = ip->i_mount->m_super->s_dev;
127 		__entry->ino = ip->i_ino;
128 		__entry->type = sm->sm_type;
129 		__entry->agno = sm->sm_agno;
130 		__entry->inum = sm->sm_ino;
131 		__entry->gen = sm->sm_gen;
132 		__entry->flags = sm->sm_flags;
133 		__entry->error = error;
134 	),
135 	TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
136 		  MAJOR(__entry->dev), MINOR(__entry->dev),
137 		  __entry->ino,
138 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
139 		  __entry->agno,
140 		  __entry->inum,
141 		  __entry->gen,
142 		  __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
143 		  __entry->error)
144 )
145 #define DEFINE_SCRUB_EVENT(name) \
146 DEFINE_EVENT(xchk_class, name, \
147 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
148 		 int error), \
149 	TP_ARGS(ip, sm, error))
150 
151 DEFINE_SCRUB_EVENT(xchk_start);
152 DEFINE_SCRUB_EVENT(xchk_done);
153 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
154 DEFINE_SCRUB_EVENT(xrep_attempt);
155 DEFINE_SCRUB_EVENT(xrep_done);
156 
157 DECLARE_EVENT_CLASS(xchk_fsgate_class,
158 	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
159 	TP_ARGS(sc, fsgate_flags),
160 	TP_STRUCT__entry(
161 		__field(dev_t, dev)
162 		__field(unsigned int, type)
163 		__field(unsigned int, fsgate_flags)
164 	),
165 	TP_fast_assign(
166 		__entry->dev = sc->mp->m_super->s_dev;
167 		__entry->type = sc->sm->sm_type;
168 		__entry->fsgate_flags = fsgate_flags;
169 	),
170 	TP_printk("dev %d:%d type %s fsgates '%s'",
171 		  MAJOR(__entry->dev), MINOR(__entry->dev),
172 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
173 		  __print_flags(__entry->fsgate_flags, "|", XFS_SCRUB_STATE_STRINGS))
174 )
175 
176 #define DEFINE_SCRUB_FSHOOK_EVENT(name) \
177 DEFINE_EVENT(xchk_fsgate_class, name, \
178 	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
179 	TP_ARGS(sc, fsgates_flags))
180 
181 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
182 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
183 
184 TRACE_EVENT(xchk_op_error,
185 	TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
186 		 xfs_agblock_t bno, int error, void *ret_ip),
187 	TP_ARGS(sc, agno, bno, error, ret_ip),
188 	TP_STRUCT__entry(
189 		__field(dev_t, dev)
190 		__field(unsigned int, type)
191 		__field(xfs_agnumber_t, agno)
192 		__field(xfs_agblock_t, bno)
193 		__field(int, error)
194 		__field(void *, ret_ip)
195 	),
196 	TP_fast_assign(
197 		__entry->dev = sc->mp->m_super->s_dev;
198 		__entry->type = sc->sm->sm_type;
199 		__entry->agno = agno;
200 		__entry->bno = bno;
201 		__entry->error = error;
202 		__entry->ret_ip = ret_ip;
203 	),
204 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
205 		  MAJOR(__entry->dev), MINOR(__entry->dev),
206 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
207 		  __entry->agno,
208 		  __entry->bno,
209 		  __entry->error,
210 		  __entry->ret_ip)
211 );
212 
213 TRACE_EVENT(xchk_file_op_error,
214 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
215 		 xfs_fileoff_t offset, int error, void *ret_ip),
216 	TP_ARGS(sc, whichfork, offset, error, ret_ip),
217 	TP_STRUCT__entry(
218 		__field(dev_t, dev)
219 		__field(xfs_ino_t, ino)
220 		__field(int, whichfork)
221 		__field(unsigned int, type)
222 		__field(xfs_fileoff_t, offset)
223 		__field(int, error)
224 		__field(void *, ret_ip)
225 	),
226 	TP_fast_assign(
227 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
228 		__entry->ino = sc->ip->i_ino;
229 		__entry->whichfork = whichfork;
230 		__entry->type = sc->sm->sm_type;
231 		__entry->offset = offset;
232 		__entry->error = error;
233 		__entry->ret_ip = ret_ip;
234 	),
235 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
236 		  MAJOR(__entry->dev), MINOR(__entry->dev),
237 		  __entry->ino,
238 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
239 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
240 		  __entry->offset,
241 		  __entry->error,
242 		  __entry->ret_ip)
243 );
244 
245 DECLARE_EVENT_CLASS(xchk_block_error_class,
246 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
247 	TP_ARGS(sc, daddr, ret_ip),
248 	TP_STRUCT__entry(
249 		__field(dev_t, dev)
250 		__field(unsigned int, type)
251 		__field(xfs_agnumber_t, agno)
252 		__field(xfs_agblock_t, agbno)
253 		__field(void *, ret_ip)
254 	),
255 	TP_fast_assign(
256 		__entry->dev = sc->mp->m_super->s_dev;
257 		__entry->type = sc->sm->sm_type;
258 		__entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
259 		__entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
260 		__entry->ret_ip = ret_ip;
261 	),
262 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
263 		  MAJOR(__entry->dev), MINOR(__entry->dev),
264 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
265 		  __entry->agno,
266 		  __entry->agbno,
267 		  __entry->ret_ip)
268 )
269 
270 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
271 DEFINE_EVENT(xchk_block_error_class, name, \
272 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
273 		 void *ret_ip), \
274 	TP_ARGS(sc, daddr, ret_ip))
275 
276 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
277 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
278 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
279 
280 DECLARE_EVENT_CLASS(xchk_ino_error_class,
281 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
282 	TP_ARGS(sc, ino, ret_ip),
283 	TP_STRUCT__entry(
284 		__field(dev_t, dev)
285 		__field(xfs_ino_t, ino)
286 		__field(unsigned int, type)
287 		__field(void *, ret_ip)
288 	),
289 	TP_fast_assign(
290 		__entry->dev = sc->mp->m_super->s_dev;
291 		__entry->ino = ino;
292 		__entry->type = sc->sm->sm_type;
293 		__entry->ret_ip = ret_ip;
294 	),
295 	TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
296 		  MAJOR(__entry->dev), MINOR(__entry->dev),
297 		  __entry->ino,
298 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
299 		  __entry->ret_ip)
300 )
301 
302 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
303 DEFINE_EVENT(xchk_ino_error_class, name, \
304 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
305 		 void *ret_ip), \
306 	TP_ARGS(sc, ino, ret_ip))
307 
308 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
309 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
310 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
311 
312 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
313 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
314 		 xfs_fileoff_t offset, void *ret_ip),
315 	TP_ARGS(sc, whichfork, offset, ret_ip),
316 	TP_STRUCT__entry(
317 		__field(dev_t, dev)
318 		__field(xfs_ino_t, ino)
319 		__field(int, whichfork)
320 		__field(unsigned int, type)
321 		__field(xfs_fileoff_t, offset)
322 		__field(void *, ret_ip)
323 	),
324 	TP_fast_assign(
325 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
326 		__entry->ino = sc->ip->i_ino;
327 		__entry->whichfork = whichfork;
328 		__entry->type = sc->sm->sm_type;
329 		__entry->offset = offset;
330 		__entry->ret_ip = ret_ip;
331 	),
332 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
333 		  MAJOR(__entry->dev), MINOR(__entry->dev),
334 		  __entry->ino,
335 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
336 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
337 		  __entry->offset,
338 		  __entry->ret_ip)
339 );
340 
341 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
342 DEFINE_EVENT(xchk_fblock_error_class, name, \
343 	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
344 		 xfs_fileoff_t offset, void *ret_ip), \
345 	TP_ARGS(sc, whichfork, offset, ret_ip))
346 
347 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
348 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
349 
350 TRACE_EVENT(xchk_incomplete,
351 	TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
352 	TP_ARGS(sc, ret_ip),
353 	TP_STRUCT__entry(
354 		__field(dev_t, dev)
355 		__field(unsigned int, type)
356 		__field(void *, ret_ip)
357 	),
358 	TP_fast_assign(
359 		__entry->dev = sc->mp->m_super->s_dev;
360 		__entry->type = sc->sm->sm_type;
361 		__entry->ret_ip = ret_ip;
362 	),
363 	TP_printk("dev %d:%d type %s ret_ip %pS",
364 		  MAJOR(__entry->dev), MINOR(__entry->dev),
365 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
366 		  __entry->ret_ip)
367 );
368 
369 TRACE_EVENT(xchk_btree_op_error,
370 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
371 		 int level, int error, void *ret_ip),
372 	TP_ARGS(sc, cur, level, error, ret_ip),
373 	TP_STRUCT__entry(
374 		__field(dev_t, dev)
375 		__field(unsigned int, type)
376 		__field(xfs_btnum_t, btnum)
377 		__field(int, level)
378 		__field(xfs_agnumber_t, agno)
379 		__field(xfs_agblock_t, bno)
380 		__field(int, ptr)
381 		__field(int, error)
382 		__field(void *, ret_ip)
383 	),
384 	TP_fast_assign(
385 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
386 
387 		__entry->dev = sc->mp->m_super->s_dev;
388 		__entry->type = sc->sm->sm_type;
389 		__entry->btnum = cur->bc_btnum;
390 		__entry->level = level;
391 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
392 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
393 		__entry->ptr = cur->bc_levels[level].ptr;
394 		__entry->error = error;
395 		__entry->ret_ip = ret_ip;
396 	),
397 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
398 		  MAJOR(__entry->dev), MINOR(__entry->dev),
399 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
400 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
401 		  __entry->level,
402 		  __entry->ptr,
403 		  __entry->agno,
404 		  __entry->bno,
405 		  __entry->error,
406 		  __entry->ret_ip)
407 );
408 
409 TRACE_EVENT(xchk_ifork_btree_op_error,
410 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
411 		 int level, int error, void *ret_ip),
412 	TP_ARGS(sc, cur, level, error, ret_ip),
413 	TP_STRUCT__entry(
414 		__field(dev_t, dev)
415 		__field(xfs_ino_t, ino)
416 		__field(int, whichfork)
417 		__field(unsigned int, type)
418 		__field(xfs_btnum_t, btnum)
419 		__field(int, level)
420 		__field(int, ptr)
421 		__field(xfs_agnumber_t, agno)
422 		__field(xfs_agblock_t, bno)
423 		__field(int, error)
424 		__field(void *, ret_ip)
425 	),
426 	TP_fast_assign(
427 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
428 		__entry->dev = sc->mp->m_super->s_dev;
429 		__entry->ino = sc->ip->i_ino;
430 		__entry->whichfork = cur->bc_ino.whichfork;
431 		__entry->type = sc->sm->sm_type;
432 		__entry->btnum = cur->bc_btnum;
433 		__entry->level = level;
434 		__entry->ptr = cur->bc_levels[level].ptr;
435 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
436 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
437 		__entry->error = error;
438 		__entry->ret_ip = ret_ip;
439 	),
440 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
441 		  MAJOR(__entry->dev), MINOR(__entry->dev),
442 		  __entry->ino,
443 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
444 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
445 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
446 		  __entry->level,
447 		  __entry->ptr,
448 		  __entry->agno,
449 		  __entry->bno,
450 		  __entry->error,
451 		  __entry->ret_ip)
452 );
453 
454 TRACE_EVENT(xchk_btree_error,
455 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
456 		 int level, void *ret_ip),
457 	TP_ARGS(sc, cur, level, ret_ip),
458 	TP_STRUCT__entry(
459 		__field(dev_t, dev)
460 		__field(unsigned int, type)
461 		__field(xfs_btnum_t, btnum)
462 		__field(int, level)
463 		__field(xfs_agnumber_t, agno)
464 		__field(xfs_agblock_t, bno)
465 		__field(int, ptr)
466 		__field(void *, ret_ip)
467 	),
468 	TP_fast_assign(
469 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
470 		__entry->dev = sc->mp->m_super->s_dev;
471 		__entry->type = sc->sm->sm_type;
472 		__entry->btnum = cur->bc_btnum;
473 		__entry->level = level;
474 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
475 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
476 		__entry->ptr = cur->bc_levels[level].ptr;
477 		__entry->ret_ip = ret_ip;
478 	),
479 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
480 		  MAJOR(__entry->dev), MINOR(__entry->dev),
481 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
482 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
483 		  __entry->level,
484 		  __entry->ptr,
485 		  __entry->agno,
486 		  __entry->bno,
487 		  __entry->ret_ip)
488 );
489 
490 TRACE_EVENT(xchk_ifork_btree_error,
491 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
492 		 int level, void *ret_ip),
493 	TP_ARGS(sc, cur, level, ret_ip),
494 	TP_STRUCT__entry(
495 		__field(dev_t, dev)
496 		__field(xfs_ino_t, ino)
497 		__field(int, whichfork)
498 		__field(unsigned int, type)
499 		__field(xfs_btnum_t, btnum)
500 		__field(int, level)
501 		__field(xfs_agnumber_t, agno)
502 		__field(xfs_agblock_t, bno)
503 		__field(int, ptr)
504 		__field(void *, ret_ip)
505 	),
506 	TP_fast_assign(
507 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
508 		__entry->dev = sc->mp->m_super->s_dev;
509 		__entry->ino = sc->ip->i_ino;
510 		__entry->whichfork = cur->bc_ino.whichfork;
511 		__entry->type = sc->sm->sm_type;
512 		__entry->btnum = cur->bc_btnum;
513 		__entry->level = level;
514 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
515 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
516 		__entry->ptr = cur->bc_levels[level].ptr;
517 		__entry->ret_ip = ret_ip;
518 	),
519 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
520 		  MAJOR(__entry->dev), MINOR(__entry->dev),
521 		  __entry->ino,
522 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
523 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
524 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
525 		  __entry->level,
526 		  __entry->ptr,
527 		  __entry->agno,
528 		  __entry->bno,
529 		  __entry->ret_ip)
530 );
531 
532 DECLARE_EVENT_CLASS(xchk_sbtree_class,
533 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
534 		 int level),
535 	TP_ARGS(sc, cur, level),
536 	TP_STRUCT__entry(
537 		__field(dev_t, dev)
538 		__field(int, type)
539 		__field(xfs_btnum_t, btnum)
540 		__field(xfs_agnumber_t, agno)
541 		__field(xfs_agblock_t, bno)
542 		__field(int, level)
543 		__field(int, nlevels)
544 		__field(int, ptr)
545 	),
546 	TP_fast_assign(
547 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
548 
549 		__entry->dev = sc->mp->m_super->s_dev;
550 		__entry->type = sc->sm->sm_type;
551 		__entry->btnum = cur->bc_btnum;
552 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
553 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
554 		__entry->level = level;
555 		__entry->nlevels = cur->bc_nlevels;
556 		__entry->ptr = cur->bc_levels[level].ptr;
557 	),
558 	TP_printk("dev %d:%d type %s btree %s agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
559 		  MAJOR(__entry->dev), MINOR(__entry->dev),
560 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
561 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
562 		  __entry->agno,
563 		  __entry->bno,
564 		  __entry->level,
565 		  __entry->nlevels,
566 		  __entry->ptr)
567 )
568 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
569 DEFINE_EVENT(xchk_sbtree_class, name, \
570 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
571 		 int level), \
572 	TP_ARGS(sc, cur, level))
573 
574 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
575 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
576 
577 TRACE_EVENT(xchk_xref_error,
578 	TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
579 	TP_ARGS(sc, error, ret_ip),
580 	TP_STRUCT__entry(
581 		__field(dev_t, dev)
582 		__field(int, type)
583 		__field(int, error)
584 		__field(void *, ret_ip)
585 	),
586 	TP_fast_assign(
587 		__entry->dev = sc->mp->m_super->s_dev;
588 		__entry->type = sc->sm->sm_type;
589 		__entry->error = error;
590 		__entry->ret_ip = ret_ip;
591 	),
592 	TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
593 		  MAJOR(__entry->dev), MINOR(__entry->dev),
594 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
595 		  __entry->error,
596 		  __entry->ret_ip)
597 );
598 
599 TRACE_EVENT(xchk_iallocbt_check_cluster,
600 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
601 		 xfs_agino_t startino, xfs_daddr_t map_daddr,
602 		 unsigned short map_len, unsigned int chunk_ino,
603 		 unsigned int nr_inodes, uint16_t cluster_mask,
604 		 uint16_t holemask, unsigned int cluster_ino),
605 	TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
606 		cluster_mask, holemask, cluster_ino),
607 	TP_STRUCT__entry(
608 		__field(dev_t, dev)
609 		__field(xfs_agnumber_t, agno)
610 		__field(xfs_agino_t, startino)
611 		__field(xfs_daddr_t, map_daddr)
612 		__field(unsigned short, map_len)
613 		__field(unsigned int, chunk_ino)
614 		__field(unsigned int, nr_inodes)
615 		__field(unsigned int, cluster_ino)
616 		__field(uint16_t, cluster_mask)
617 		__field(uint16_t, holemask)
618 	),
619 	TP_fast_assign(
620 		__entry->dev = mp->m_super->s_dev;
621 		__entry->agno = agno;
622 		__entry->startino = startino;
623 		__entry->map_daddr = map_daddr;
624 		__entry->map_len = map_len;
625 		__entry->chunk_ino = chunk_ino;
626 		__entry->nr_inodes = nr_inodes;
627 		__entry->cluster_mask = cluster_mask;
628 		__entry->holemask = holemask;
629 		__entry->cluster_ino = cluster_ino;
630 	),
631 	TP_printk("dev %d:%d agno 0x%x startino 0x%x daddr 0x%llx bbcount 0x%x chunkino 0x%x nr_inodes %u cluster_mask 0x%x holemask 0x%x cluster_ino 0x%x",
632 		  MAJOR(__entry->dev), MINOR(__entry->dev),
633 		  __entry->agno,
634 		  __entry->startino,
635 		  __entry->map_daddr,
636 		  __entry->map_len,
637 		  __entry->chunk_ino,
638 		  __entry->nr_inodes,
639 		  __entry->cluster_mask,
640 		  __entry->holemask,
641 		  __entry->cluster_ino)
642 )
643 
644 TRACE_EVENT(xchk_inode_is_allocated,
645 	TP_PROTO(struct xfs_inode *ip),
646 	TP_ARGS(ip),
647 	TP_STRUCT__entry(
648 		__field(dev_t, dev)
649 		__field(xfs_ino_t, ino)
650 		__field(unsigned long, iflags)
651 		__field(umode_t, mode)
652 	),
653 	TP_fast_assign(
654 		__entry->dev = VFS_I(ip)->i_sb->s_dev;
655 		__entry->ino = ip->i_ino;
656 		__entry->iflags = ip->i_flags;
657 		__entry->mode = VFS_I(ip)->i_mode;
658 	),
659 	TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
660 		  MAJOR(__entry->dev), MINOR(__entry->dev),
661 		  __entry->ino,
662 		  __entry->iflags,
663 		  __entry->mode)
664 );
665 
666 TRACE_EVENT(xchk_fscounters_calc,
667 	TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
668 		 uint64_t fdblocks, uint64_t delalloc),
669 	TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
670 	TP_STRUCT__entry(
671 		__field(dev_t, dev)
672 		__field(int64_t, icount_sb)
673 		__field(uint64_t, icount_calculated)
674 		__field(int64_t, ifree_sb)
675 		__field(uint64_t, ifree_calculated)
676 		__field(int64_t, fdblocks_sb)
677 		__field(uint64_t, fdblocks_calculated)
678 		__field(uint64_t, delalloc)
679 	),
680 	TP_fast_assign(
681 		__entry->dev = mp->m_super->s_dev;
682 		__entry->icount_sb = mp->m_sb.sb_icount;
683 		__entry->icount_calculated = icount;
684 		__entry->ifree_sb = mp->m_sb.sb_ifree;
685 		__entry->ifree_calculated = ifree;
686 		__entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
687 		__entry->fdblocks_calculated = fdblocks;
688 		__entry->delalloc = delalloc;
689 	),
690 	TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
691 		  MAJOR(__entry->dev), MINOR(__entry->dev),
692 		  __entry->icount_sb,
693 		  __entry->icount_calculated,
694 		  __entry->ifree_sb,
695 		  __entry->ifree_calculated,
696 		  __entry->fdblocks_sb,
697 		  __entry->fdblocks_calculated,
698 		  __entry->delalloc)
699 )
700 
701 TRACE_EVENT(xchk_fscounters_within_range,
702 	TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
703 		 int64_t old_value),
704 	TP_ARGS(mp, expected, curr_value, old_value),
705 	TP_STRUCT__entry(
706 		__field(dev_t, dev)
707 		__field(uint64_t, expected)
708 		__field(int64_t, curr_value)
709 		__field(int64_t, old_value)
710 	),
711 	TP_fast_assign(
712 		__entry->dev = mp->m_super->s_dev;
713 		__entry->expected = expected;
714 		__entry->curr_value = curr_value;
715 		__entry->old_value = old_value;
716 	),
717 	TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
718 		  MAJOR(__entry->dev), MINOR(__entry->dev),
719 		  __entry->expected,
720 		  __entry->curr_value,
721 		  __entry->old_value)
722 )
723 
724 DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
725 	TP_PROTO(struct xfs_scrub *sc, int error),
726 	TP_ARGS(sc, error),
727 	TP_STRUCT__entry(
728 		__field(dev_t, dev)
729 		__field(unsigned int, type)
730 		__field(int, error)
731 	),
732 	TP_fast_assign(
733 		__entry->dev = sc->mp->m_super->s_dev;
734 		__entry->type = sc->sm->sm_type;
735 		__entry->error = error;
736 	),
737 	TP_printk("dev %d:%d type %s error %d",
738 		  MAJOR(__entry->dev), MINOR(__entry->dev),
739 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
740 		  __entry->error)
741 );
742 #define DEFINE_XCHK_FSFREEZE_EVENT(name) \
743 DEFINE_EVENT(xchk_fsfreeze_class, name, \
744 	TP_PROTO(struct xfs_scrub *sc, int error), \
745 	TP_ARGS(sc, error))
746 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
747 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
748 
749 TRACE_EVENT(xchk_refcount_incorrect,
750 	TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
751 		 xfs_nlink_t seen),
752 	TP_ARGS(pag, irec, seen),
753 	TP_STRUCT__entry(
754 		__field(dev_t, dev)
755 		__field(xfs_agnumber_t, agno)
756 		__field(enum xfs_refc_domain, domain)
757 		__field(xfs_agblock_t, startblock)
758 		__field(xfs_extlen_t, blockcount)
759 		__field(xfs_nlink_t, refcount)
760 		__field(xfs_nlink_t, seen)
761 	),
762 	TP_fast_assign(
763 		__entry->dev = pag->pag_mount->m_super->s_dev;
764 		__entry->agno = pag->pag_agno;
765 		__entry->domain = irec->rc_domain;
766 		__entry->startblock = irec->rc_startblock;
767 		__entry->blockcount = irec->rc_blockcount;
768 		__entry->refcount = irec->rc_refcount;
769 		__entry->seen = seen;
770 	),
771 	TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
772 		  MAJOR(__entry->dev), MINOR(__entry->dev),
773 		  __entry->agno,
774 		  __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
775 		  __entry->startblock,
776 		  __entry->blockcount,
777 		  __entry->refcount,
778 		  __entry->seen)
779 )
780 
781 TRACE_EVENT(xfile_create,
782 	TP_PROTO(struct xfile *xf),
783 	TP_ARGS(xf),
784 	TP_STRUCT__entry(
785 		__field(dev_t, dev)
786 		__field(unsigned long, ino)
787 		__array(char, pathname, 256)
788 	),
789 	TP_fast_assign(
790 		char		pathname[257];
791 		char		*path;
792 
793 		__entry->ino = file_inode(xf->file)->i_ino;
794 		memset(pathname, 0, sizeof(pathname));
795 		path = file_path(xf->file, pathname, sizeof(pathname) - 1);
796 		if (IS_ERR(path))
797 			path = "(unknown)";
798 		strncpy(__entry->pathname, path, sizeof(__entry->pathname));
799 	),
800 	TP_printk("xfino 0x%lx path '%s'",
801 		  __entry->ino,
802 		  __entry->pathname)
803 );
804 
805 TRACE_EVENT(xfile_destroy,
806 	TP_PROTO(struct xfile *xf),
807 	TP_ARGS(xf),
808 	TP_STRUCT__entry(
809 		__field(unsigned long, ino)
810 		__field(unsigned long long, bytes)
811 		__field(loff_t, size)
812 	),
813 	TP_fast_assign(
814 		struct xfile_stat	statbuf;
815 		int			ret;
816 
817 		ret = xfile_stat(xf, &statbuf);
818 		if (!ret) {
819 			__entry->bytes = statbuf.bytes;
820 			__entry->size = statbuf.size;
821 		} else {
822 			__entry->bytes = -1;
823 			__entry->size = -1;
824 		}
825 		__entry->ino = file_inode(xf->file)->i_ino;
826 	),
827 	TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
828 		  __entry->ino,
829 		  __entry->bytes,
830 		  __entry->size)
831 );
832 
833 DECLARE_EVENT_CLASS(xfile_class,
834 	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
835 	TP_ARGS(xf, pos, bytecount),
836 	TP_STRUCT__entry(
837 		__field(unsigned long, ino)
838 		__field(unsigned long long, bytes_used)
839 		__field(loff_t, pos)
840 		__field(loff_t, size)
841 		__field(unsigned long long, bytecount)
842 	),
843 	TP_fast_assign(
844 		struct xfile_stat	statbuf;
845 		int			ret;
846 
847 		ret = xfile_stat(xf, &statbuf);
848 		if (!ret) {
849 			__entry->bytes_used = statbuf.bytes;
850 			__entry->size = statbuf.size;
851 		} else {
852 			__entry->bytes_used = -1;
853 			__entry->size = -1;
854 		}
855 		__entry->ino = file_inode(xf->file)->i_ino;
856 		__entry->pos = pos;
857 		__entry->bytecount = bytecount;
858 	),
859 	TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
860 		  __entry->ino,
861 		  __entry->bytes_used,
862 		  __entry->pos,
863 		  __entry->bytecount,
864 		  __entry->size)
865 );
866 #define DEFINE_XFILE_EVENT(name) \
867 DEFINE_EVENT(xfile_class, name, \
868 	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
869 	TP_ARGS(xf, pos, bytecount))
870 DEFINE_XFILE_EVENT(xfile_pread);
871 DEFINE_XFILE_EVENT(xfile_pwrite);
872 DEFINE_XFILE_EVENT(xfile_seek_data);
873 DEFINE_XFILE_EVENT(xfile_get_page);
874 DEFINE_XFILE_EVENT(xfile_put_page);
875 
876 TRACE_EVENT(xfarray_create,
877 	TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
878 	TP_ARGS(xfa, required_capacity),
879 	TP_STRUCT__entry(
880 		__field(unsigned long, ino)
881 		__field(uint64_t, max_nr)
882 		__field(size_t, obj_size)
883 		__field(int, obj_size_log)
884 		__field(unsigned long long, required_capacity)
885 	),
886 	TP_fast_assign(
887 		__entry->max_nr = xfa->max_nr;
888 		__entry->obj_size = xfa->obj_size;
889 		__entry->obj_size_log = xfa->obj_size_log;
890 		__entry->ino = file_inode(xfa->xfile->file)->i_ino;
891 		__entry->required_capacity = required_capacity;
892 	),
893 	TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
894 		  __entry->ino,
895 		  __entry->max_nr,
896 		  __entry->required_capacity,
897 		  __entry->obj_size,
898 		  __entry->obj_size_log)
899 );
900 
901 TRACE_EVENT(xfarray_isort,
902 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
903 	TP_ARGS(si, lo, hi),
904 	TP_STRUCT__entry(
905 		__field(unsigned long, ino)
906 		__field(unsigned long long, lo)
907 		__field(unsigned long long, hi)
908 	),
909 	TP_fast_assign(
910 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
911 		__entry->lo = lo;
912 		__entry->hi = hi;
913 	),
914 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
915 		  __entry->ino,
916 		  __entry->lo,
917 		  __entry->hi,
918 		  __entry->hi - __entry->lo)
919 );
920 
921 TRACE_EVENT(xfarray_pagesort,
922 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
923 	TP_ARGS(si, lo, hi),
924 	TP_STRUCT__entry(
925 		__field(unsigned long, ino)
926 		__field(unsigned long long, lo)
927 		__field(unsigned long long, hi)
928 	),
929 	TP_fast_assign(
930 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
931 		__entry->lo = lo;
932 		__entry->hi = hi;
933 	),
934 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
935 		  __entry->ino,
936 		  __entry->lo,
937 		  __entry->hi,
938 		  __entry->hi - __entry->lo)
939 );
940 
941 TRACE_EVENT(xfarray_qsort,
942 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
943 	TP_ARGS(si, lo, hi),
944 	TP_STRUCT__entry(
945 		__field(unsigned long, ino)
946 		__field(unsigned long long, lo)
947 		__field(unsigned long long, hi)
948 		__field(int, stack_depth)
949 		__field(int, max_stack_depth)
950 	),
951 	TP_fast_assign(
952 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
953 		__entry->lo = lo;
954 		__entry->hi = hi;
955 		__entry->stack_depth = si->stack_depth;
956 		__entry->max_stack_depth = si->max_stack_depth;
957 	),
958 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
959 		  __entry->ino,
960 		  __entry->lo,
961 		  __entry->hi,
962 		  __entry->hi - __entry->lo,
963 		  __entry->stack_depth,
964 		  __entry->max_stack_depth)
965 );
966 
967 TRACE_EVENT(xfarray_sort,
968 	TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
969 	TP_ARGS(si, bytes),
970 	TP_STRUCT__entry(
971 		__field(unsigned long, ino)
972 		__field(unsigned long long, nr)
973 		__field(size_t, obj_size)
974 		__field(size_t, bytes)
975 		__field(unsigned int, max_stack_depth)
976 	),
977 	TP_fast_assign(
978 		__entry->nr = si->array->nr;
979 		__entry->obj_size = si->array->obj_size;
980 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
981 		__entry->bytes = bytes;
982 		__entry->max_stack_depth = si->max_stack_depth;
983 	),
984 	TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
985 		  __entry->ino,
986 		  __entry->nr,
987 		  __entry->obj_size,
988 		  __entry->max_stack_depth,
989 		  __entry->bytes)
990 );
991 
992 TRACE_EVENT(xfarray_sort_stats,
993 	TP_PROTO(struct xfarray_sortinfo *si, int error),
994 	TP_ARGS(si, error),
995 	TP_STRUCT__entry(
996 		__field(unsigned long, ino)
997 #ifdef DEBUG
998 		__field(unsigned long long, loads)
999 		__field(unsigned long long, stores)
1000 		__field(unsigned long long, compares)
1001 		__field(unsigned long long, heapsorts)
1002 #endif
1003 		__field(unsigned int, max_stack_depth)
1004 		__field(unsigned int, max_stack_used)
1005 		__field(int, error)
1006 	),
1007 	TP_fast_assign(
1008 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1009 #ifdef DEBUG
1010 		__entry->loads = si->loads;
1011 		__entry->stores = si->stores;
1012 		__entry->compares = si->compares;
1013 		__entry->heapsorts = si->heapsorts;
1014 #endif
1015 		__entry->max_stack_depth = si->max_stack_depth;
1016 		__entry->max_stack_used = si->max_stack_used;
1017 		__entry->error = error;
1018 	),
1019 	TP_printk(
1020 #ifdef DEBUG
1021 		  "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1022 #else
1023 		  "xfino 0x%lx stack_depth %u/%u error %d",
1024 #endif
1025 		  __entry->ino,
1026 #ifdef DEBUG
1027 		  __entry->loads,
1028 		  __entry->stores,
1029 		  __entry->compares,
1030 		  __entry->heapsorts,
1031 #endif
1032 		  __entry->max_stack_used,
1033 		  __entry->max_stack_depth,
1034 		  __entry->error)
1035 );
1036 
1037 #ifdef CONFIG_XFS_RT
1038 TRACE_EVENT(xchk_rtsum_record_free,
1039 	TP_PROTO(struct xfs_mount *mp, xfs_rtblock_t start,
1040 		 uint64_t len, unsigned int log, loff_t pos, xfs_suminfo_t v),
1041 	TP_ARGS(mp, start, len, log, pos, v),
1042 	TP_STRUCT__entry(
1043 		__field(dev_t, dev)
1044 		__field(dev_t, rtdev)
1045 		__field(xfs_rtblock_t, start)
1046 		__field(unsigned long long, len)
1047 		__field(unsigned int, log)
1048 		__field(loff_t, pos)
1049 		__field(xfs_suminfo_t, v)
1050 	),
1051 	TP_fast_assign(
1052 		__entry->dev = mp->m_super->s_dev;
1053 		__entry->rtdev = mp->m_rtdev_targp->bt_dev;
1054 		__entry->start = start;
1055 		__entry->len = len;
1056 		__entry->log = log;
1057 		__entry->pos = pos;
1058 		__entry->v = v;
1059 	),
1060 	TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
1061 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1062 		  MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
1063 		  __entry->start,
1064 		  __entry->len,
1065 		  __entry->log,
1066 		  __entry->pos,
1067 		  __entry->v)
1068 );
1069 #endif /* CONFIG_XFS_RT */
1070 
1071 /* repair tracepoints */
1072 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1073 
1074 DECLARE_EVENT_CLASS(xrep_extent_class,
1075 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len),
1076 	TP_ARGS(pag, agbno, len),
1077 	TP_STRUCT__entry(
1078 		__field(dev_t, dev)
1079 		__field(xfs_agnumber_t, agno)
1080 		__field(xfs_agblock_t, agbno)
1081 		__field(xfs_extlen_t, len)
1082 	),
1083 	TP_fast_assign(
1084 		__entry->dev = pag->pag_mount->m_super->s_dev;
1085 		__entry->agno = pag->pag_agno;
1086 		__entry->agbno = agbno;
1087 		__entry->len = len;
1088 	),
1089 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1090 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1091 		  __entry->agno,
1092 		  __entry->agbno,
1093 		  __entry->len)
1094 );
1095 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
1096 DEFINE_EVENT(xrep_extent_class, name, \
1097 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len), \
1098 	TP_ARGS(pag, agbno, len))
1099 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1100 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1101 DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1102 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1103 
1104 DECLARE_EVENT_CLASS(xrep_reap_find_class,
1105 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len,
1106 		bool crosslinked),
1107 	TP_ARGS(pag, agbno, len, crosslinked),
1108 	TP_STRUCT__entry(
1109 		__field(dev_t, dev)
1110 		__field(xfs_agnumber_t, agno)
1111 		__field(xfs_agblock_t, agbno)
1112 		__field(xfs_extlen_t, len)
1113 		__field(bool, crosslinked)
1114 	),
1115 	TP_fast_assign(
1116 		__entry->dev = pag->pag_mount->m_super->s_dev;
1117 		__entry->agno = pag->pag_agno;
1118 		__entry->agbno = agbno;
1119 		__entry->len = len;
1120 		__entry->crosslinked = crosslinked;
1121 	),
1122 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
1123 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1124 		  __entry->agno,
1125 		  __entry->agbno,
1126 		  __entry->len,
1127 		  __entry->crosslinked ? 1 : 0)
1128 );
1129 #define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
1130 DEFINE_EVENT(xrep_reap_find_class, name, \
1131 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len, \
1132 		 bool crosslinked), \
1133 	TP_ARGS(pag, agbno, len, crosslinked))
1134 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1135 
1136 DECLARE_EVENT_CLASS(xrep_rmap_class,
1137 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1138 		 xfs_agblock_t agbno, xfs_extlen_t len,
1139 		 uint64_t owner, uint64_t offset, unsigned int flags),
1140 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
1141 	TP_STRUCT__entry(
1142 		__field(dev_t, dev)
1143 		__field(xfs_agnumber_t, agno)
1144 		__field(xfs_agblock_t, agbno)
1145 		__field(xfs_extlen_t, len)
1146 		__field(uint64_t, owner)
1147 		__field(uint64_t, offset)
1148 		__field(unsigned int, flags)
1149 	),
1150 	TP_fast_assign(
1151 		__entry->dev = mp->m_super->s_dev;
1152 		__entry->agno = agno;
1153 		__entry->agbno = agbno;
1154 		__entry->len = len;
1155 		__entry->owner = owner;
1156 		__entry->offset = offset;
1157 		__entry->flags = flags;
1158 	),
1159 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
1160 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1161 		  __entry->agno,
1162 		  __entry->agbno,
1163 		  __entry->len,
1164 		  __entry->owner,
1165 		  __entry->offset,
1166 		  __entry->flags)
1167 );
1168 #define DEFINE_REPAIR_RMAP_EVENT(name) \
1169 DEFINE_EVENT(xrep_rmap_class, name, \
1170 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
1171 		 xfs_agblock_t agbno, xfs_extlen_t len, \
1172 		 uint64_t owner, uint64_t offset, unsigned int flags), \
1173 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
1174 DEFINE_REPAIR_RMAP_EVENT(xrep_alloc_extent_fn);
1175 DEFINE_REPAIR_RMAP_EVENT(xrep_ialloc_extent_fn);
1176 DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn);
1177 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_extent_fn);
1178 
1179 TRACE_EVENT(xrep_refcount_extent_fn,
1180 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1181 		 struct xfs_refcount_irec *irec),
1182 	TP_ARGS(mp, agno, irec),
1183 	TP_STRUCT__entry(
1184 		__field(dev_t, dev)
1185 		__field(xfs_agnumber_t, agno)
1186 		__field(xfs_agblock_t, startblock)
1187 		__field(xfs_extlen_t, blockcount)
1188 		__field(xfs_nlink_t, refcount)
1189 	),
1190 	TP_fast_assign(
1191 		__entry->dev = mp->m_super->s_dev;
1192 		__entry->agno = agno;
1193 		__entry->startblock = irec->rc_startblock;
1194 		__entry->blockcount = irec->rc_blockcount;
1195 		__entry->refcount = irec->rc_refcount;
1196 	),
1197 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x refcount %u",
1198 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1199 		  __entry->agno,
1200 		  __entry->startblock,
1201 		  __entry->blockcount,
1202 		  __entry->refcount)
1203 )
1204 
1205 TRACE_EVENT(xrep_findroot_block,
1206 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
1207 		 uint32_t magic, uint16_t level),
1208 	TP_ARGS(mp, agno, agbno, magic, level),
1209 	TP_STRUCT__entry(
1210 		__field(dev_t, dev)
1211 		__field(xfs_agnumber_t, agno)
1212 		__field(xfs_agblock_t, agbno)
1213 		__field(uint32_t, magic)
1214 		__field(uint16_t, level)
1215 	),
1216 	TP_fast_assign(
1217 		__entry->dev = mp->m_super->s_dev;
1218 		__entry->agno = agno;
1219 		__entry->agbno = agbno;
1220 		__entry->magic = magic;
1221 		__entry->level = level;
1222 	),
1223 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
1224 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1225 		  __entry->agno,
1226 		  __entry->agbno,
1227 		  __entry->magic,
1228 		  __entry->level)
1229 )
1230 TRACE_EVENT(xrep_calc_ag_resblks,
1231 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1232 		 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
1233 		 xfs_agblock_t usedlen),
1234 	TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
1235 	TP_STRUCT__entry(
1236 		__field(dev_t, dev)
1237 		__field(xfs_agnumber_t, agno)
1238 		__field(xfs_agino_t, icount)
1239 		__field(xfs_agblock_t, aglen)
1240 		__field(xfs_agblock_t, freelen)
1241 		__field(xfs_agblock_t, usedlen)
1242 	),
1243 	TP_fast_assign(
1244 		__entry->dev = mp->m_super->s_dev;
1245 		__entry->agno = agno;
1246 		__entry->icount = icount;
1247 		__entry->aglen = aglen;
1248 		__entry->freelen = freelen;
1249 		__entry->usedlen = usedlen;
1250 	),
1251 	TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
1252 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1253 		  __entry->agno,
1254 		  __entry->icount,
1255 		  __entry->aglen,
1256 		  __entry->freelen,
1257 		  __entry->usedlen)
1258 )
1259 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
1260 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1261 		 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
1262 		 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
1263 	TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
1264 	TP_STRUCT__entry(
1265 		__field(dev_t, dev)
1266 		__field(xfs_agnumber_t, agno)
1267 		__field(xfs_agblock_t, bnobt_sz)
1268 		__field(xfs_agblock_t, inobt_sz)
1269 		__field(xfs_agblock_t, rmapbt_sz)
1270 		__field(xfs_agblock_t, refcbt_sz)
1271 	),
1272 	TP_fast_assign(
1273 		__entry->dev = mp->m_super->s_dev;
1274 		__entry->agno = agno;
1275 		__entry->bnobt_sz = bnobt_sz;
1276 		__entry->inobt_sz = inobt_sz;
1277 		__entry->rmapbt_sz = rmapbt_sz;
1278 		__entry->refcbt_sz = refcbt_sz;
1279 	),
1280 	TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
1281 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1282 		  __entry->agno,
1283 		  __entry->bnobt_sz,
1284 		  __entry->inobt_sz,
1285 		  __entry->rmapbt_sz,
1286 		  __entry->refcbt_sz)
1287 )
1288 TRACE_EVENT(xrep_reset_counters,
1289 	TP_PROTO(struct xfs_mount *mp),
1290 	TP_ARGS(mp),
1291 	TP_STRUCT__entry(
1292 		__field(dev_t, dev)
1293 	),
1294 	TP_fast_assign(
1295 		__entry->dev = mp->m_super->s_dev;
1296 	),
1297 	TP_printk("dev %d:%d",
1298 		  MAJOR(__entry->dev), MINOR(__entry->dev))
1299 )
1300 
1301 TRACE_EVENT(xrep_ialloc_insert,
1302 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1303 		 xfs_agino_t startino, uint16_t holemask, uint8_t count,
1304 		 uint8_t freecount, uint64_t freemask),
1305 	TP_ARGS(mp, agno, startino, holemask, count, freecount, freemask),
1306 	TP_STRUCT__entry(
1307 		__field(dev_t, dev)
1308 		__field(xfs_agnumber_t, agno)
1309 		__field(xfs_agino_t, startino)
1310 		__field(uint16_t, holemask)
1311 		__field(uint8_t, count)
1312 		__field(uint8_t, freecount)
1313 		__field(uint64_t, freemask)
1314 	),
1315 	TP_fast_assign(
1316 		__entry->dev = mp->m_super->s_dev;
1317 		__entry->agno = agno;
1318 		__entry->startino = startino;
1319 		__entry->holemask = holemask;
1320 		__entry->count = count;
1321 		__entry->freecount = freecount;
1322 		__entry->freemask = freemask;
1323 	),
1324 	TP_printk("dev %d:%d agno 0x%x startino 0x%x holemask 0x%x count %u freecount %u freemask 0x%llx",
1325 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1326 		  __entry->agno,
1327 		  __entry->startino,
1328 		  __entry->holemask,
1329 		  __entry->count,
1330 		  __entry->freecount,
1331 		  __entry->freemask)
1332 )
1333 
1334 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
1335 
1336 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
1337 
1338 #undef TRACE_INCLUDE_PATH
1339 #define TRACE_INCLUDE_PATH .
1340 #define TRACE_INCLUDE_FILE scrub/trace
1341 #include <trace/define_trace.h>
1342