xref: /linux/fs/xfs/scrub/trace.h (revision e5a2f47cff812c01018652f11d5e861e2a6b462b)
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 struct xchk_dqiter;
23 
24 /*
25  * ftrace's __print_symbolic requires that all enum values be wrapped in the
26  * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
27  * ring buffer.  Somehow this was only worth mentioning in the ftrace sample
28  * code.
29  */
30 TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi);
31 TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi);
32 TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi);
33 TRACE_DEFINE_ENUM(XFS_BTNUM_INOi);
34 TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
35 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
36 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
37 
38 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
39 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
40 
41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
54 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
55 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
56 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
57 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
58 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
59 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
60 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
61 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
62 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
63 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
64 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
65 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
66 
67 #define XFS_SCRUB_TYPE_STRINGS \
68 	{ XFS_SCRUB_TYPE_PROBE,		"probe" }, \
69 	{ XFS_SCRUB_TYPE_SB,		"sb" }, \
70 	{ XFS_SCRUB_TYPE_AGF,		"agf" }, \
71 	{ XFS_SCRUB_TYPE_AGFL,		"agfl" }, \
72 	{ XFS_SCRUB_TYPE_AGI,		"agi" }, \
73 	{ XFS_SCRUB_TYPE_BNOBT,		"bnobt" }, \
74 	{ XFS_SCRUB_TYPE_CNTBT,		"cntbt" }, \
75 	{ XFS_SCRUB_TYPE_INOBT,		"inobt" }, \
76 	{ XFS_SCRUB_TYPE_FINOBT,	"finobt" }, \
77 	{ XFS_SCRUB_TYPE_RMAPBT,	"rmapbt" }, \
78 	{ XFS_SCRUB_TYPE_REFCNTBT,	"refcountbt" }, \
79 	{ XFS_SCRUB_TYPE_INODE,		"inode" }, \
80 	{ XFS_SCRUB_TYPE_BMBTD,		"bmapbtd" }, \
81 	{ XFS_SCRUB_TYPE_BMBTA,		"bmapbta" }, \
82 	{ XFS_SCRUB_TYPE_BMBTC,		"bmapbtc" }, \
83 	{ XFS_SCRUB_TYPE_DIR,		"directory" }, \
84 	{ XFS_SCRUB_TYPE_XATTR,		"xattr" }, \
85 	{ XFS_SCRUB_TYPE_SYMLINK,	"symlink" }, \
86 	{ XFS_SCRUB_TYPE_PARENT,	"parent" }, \
87 	{ XFS_SCRUB_TYPE_RTBITMAP,	"rtbitmap" }, \
88 	{ XFS_SCRUB_TYPE_RTSUM,		"rtsummary" }, \
89 	{ XFS_SCRUB_TYPE_UQUOTA,	"usrquota" }, \
90 	{ XFS_SCRUB_TYPE_GQUOTA,	"grpquota" }, \
91 	{ XFS_SCRUB_TYPE_PQUOTA,	"prjquota" }, \
92 	{ XFS_SCRUB_TYPE_FSCOUNTERS,	"fscounters" }
93 
94 #define XFS_SCRUB_FLAG_STRINGS \
95 	{ XFS_SCRUB_IFLAG_REPAIR,		"repair" }, \
96 	{ XFS_SCRUB_OFLAG_CORRUPT,		"corrupt" }, \
97 	{ XFS_SCRUB_OFLAG_PREEN,		"preen" }, \
98 	{ XFS_SCRUB_OFLAG_XFAIL,		"xfail" }, \
99 	{ XFS_SCRUB_OFLAG_XCORRUPT,		"xcorrupt" }, \
100 	{ XFS_SCRUB_OFLAG_INCOMPLETE,		"incomplete" }, \
101 	{ XFS_SCRUB_OFLAG_WARNING,		"warning" }, \
102 	{ XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED,	"norepair" }, \
103 	{ XFS_SCRUB_IFLAG_FORCE_REBUILD,	"rebuild" }
104 
105 #define XFS_SCRUB_STATE_STRINGS \
106 	{ XCHK_TRY_HARDER,			"try_harder" }, \
107 	{ XCHK_HAVE_FREEZE_PROT,		"nofreeze" }, \
108 	{ XCHK_FSGATES_DRAIN,			"fsgates_drain" }, \
109 	{ XCHK_NEED_DRAIN,			"need_drain" }, \
110 	{ XREP_RESET_PERAG_RESV,		"reset_perag_resv" }, \
111 	{ XREP_ALREADY_FIXED,			"already_fixed" }
112 
113 DECLARE_EVENT_CLASS(xchk_class,
114 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
115 		 int error),
116 	TP_ARGS(ip, sm, error),
117 	TP_STRUCT__entry(
118 		__field(dev_t, dev)
119 		__field(xfs_ino_t, ino)
120 		__field(unsigned int, type)
121 		__field(xfs_agnumber_t, agno)
122 		__field(xfs_ino_t, inum)
123 		__field(unsigned int, gen)
124 		__field(unsigned int, flags)
125 		__field(int, error)
126 	),
127 	TP_fast_assign(
128 		__entry->dev = ip->i_mount->m_super->s_dev;
129 		__entry->ino = ip->i_ino;
130 		__entry->type = sm->sm_type;
131 		__entry->agno = sm->sm_agno;
132 		__entry->inum = sm->sm_ino;
133 		__entry->gen = sm->sm_gen;
134 		__entry->flags = sm->sm_flags;
135 		__entry->error = error;
136 	),
137 	TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
138 		  MAJOR(__entry->dev), MINOR(__entry->dev),
139 		  __entry->ino,
140 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
141 		  __entry->agno,
142 		  __entry->inum,
143 		  __entry->gen,
144 		  __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
145 		  __entry->error)
146 )
147 #define DEFINE_SCRUB_EVENT(name) \
148 DEFINE_EVENT(xchk_class, name, \
149 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
150 		 int error), \
151 	TP_ARGS(ip, sm, error))
152 
153 DEFINE_SCRUB_EVENT(xchk_start);
154 DEFINE_SCRUB_EVENT(xchk_done);
155 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
156 DEFINE_SCRUB_EVENT(xrep_attempt);
157 DEFINE_SCRUB_EVENT(xrep_done);
158 
159 DECLARE_EVENT_CLASS(xchk_fsgate_class,
160 	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
161 	TP_ARGS(sc, fsgate_flags),
162 	TP_STRUCT__entry(
163 		__field(dev_t, dev)
164 		__field(unsigned int, type)
165 		__field(unsigned int, fsgate_flags)
166 	),
167 	TP_fast_assign(
168 		__entry->dev = sc->mp->m_super->s_dev;
169 		__entry->type = sc->sm->sm_type;
170 		__entry->fsgate_flags = fsgate_flags;
171 	),
172 	TP_printk("dev %d:%d type %s fsgates '%s'",
173 		  MAJOR(__entry->dev), MINOR(__entry->dev),
174 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
175 		  __print_flags(__entry->fsgate_flags, "|", XFS_SCRUB_STATE_STRINGS))
176 )
177 
178 #define DEFINE_SCRUB_FSHOOK_EVENT(name) \
179 DEFINE_EVENT(xchk_fsgate_class, name, \
180 	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
181 	TP_ARGS(sc, fsgates_flags))
182 
183 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
184 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
185 
186 TRACE_EVENT(xchk_op_error,
187 	TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
188 		 xfs_agblock_t bno, int error, void *ret_ip),
189 	TP_ARGS(sc, agno, bno, error, 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(int, error)
196 		__field(void *, ret_ip)
197 	),
198 	TP_fast_assign(
199 		__entry->dev = sc->mp->m_super->s_dev;
200 		__entry->type = sc->sm->sm_type;
201 		__entry->agno = agno;
202 		__entry->bno = bno;
203 		__entry->error = error;
204 		__entry->ret_ip = ret_ip;
205 	),
206 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
207 		  MAJOR(__entry->dev), MINOR(__entry->dev),
208 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
209 		  __entry->agno,
210 		  __entry->bno,
211 		  __entry->error,
212 		  __entry->ret_ip)
213 );
214 
215 TRACE_EVENT(xchk_file_op_error,
216 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
217 		 xfs_fileoff_t offset, int error, void *ret_ip),
218 	TP_ARGS(sc, whichfork, offset, error, ret_ip),
219 	TP_STRUCT__entry(
220 		__field(dev_t, dev)
221 		__field(xfs_ino_t, ino)
222 		__field(int, whichfork)
223 		__field(unsigned int, type)
224 		__field(xfs_fileoff_t, offset)
225 		__field(int, error)
226 		__field(void *, ret_ip)
227 	),
228 	TP_fast_assign(
229 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
230 		__entry->ino = sc->ip->i_ino;
231 		__entry->whichfork = whichfork;
232 		__entry->type = sc->sm->sm_type;
233 		__entry->offset = offset;
234 		__entry->error = error;
235 		__entry->ret_ip = ret_ip;
236 	),
237 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
238 		  MAJOR(__entry->dev), MINOR(__entry->dev),
239 		  __entry->ino,
240 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
241 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
242 		  __entry->offset,
243 		  __entry->error,
244 		  __entry->ret_ip)
245 );
246 
247 DECLARE_EVENT_CLASS(xchk_block_error_class,
248 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
249 	TP_ARGS(sc, daddr, ret_ip),
250 	TP_STRUCT__entry(
251 		__field(dev_t, dev)
252 		__field(unsigned int, type)
253 		__field(xfs_agnumber_t, agno)
254 		__field(xfs_agblock_t, agbno)
255 		__field(void *, ret_ip)
256 	),
257 	TP_fast_assign(
258 		__entry->dev = sc->mp->m_super->s_dev;
259 		__entry->type = sc->sm->sm_type;
260 		__entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
261 		__entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
262 		__entry->ret_ip = ret_ip;
263 	),
264 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
265 		  MAJOR(__entry->dev), MINOR(__entry->dev),
266 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
267 		  __entry->agno,
268 		  __entry->agbno,
269 		  __entry->ret_ip)
270 )
271 
272 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
273 DEFINE_EVENT(xchk_block_error_class, name, \
274 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
275 		 void *ret_ip), \
276 	TP_ARGS(sc, daddr, ret_ip))
277 
278 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
279 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
280 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
281 
282 DECLARE_EVENT_CLASS(xchk_ino_error_class,
283 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
284 	TP_ARGS(sc, ino, ret_ip),
285 	TP_STRUCT__entry(
286 		__field(dev_t, dev)
287 		__field(xfs_ino_t, ino)
288 		__field(unsigned int, type)
289 		__field(void *, ret_ip)
290 	),
291 	TP_fast_assign(
292 		__entry->dev = sc->mp->m_super->s_dev;
293 		__entry->ino = ino;
294 		__entry->type = sc->sm->sm_type;
295 		__entry->ret_ip = ret_ip;
296 	),
297 	TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
298 		  MAJOR(__entry->dev), MINOR(__entry->dev),
299 		  __entry->ino,
300 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
301 		  __entry->ret_ip)
302 )
303 
304 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
305 DEFINE_EVENT(xchk_ino_error_class, name, \
306 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
307 		 void *ret_ip), \
308 	TP_ARGS(sc, ino, ret_ip))
309 
310 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
311 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
312 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
313 
314 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
315 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
316 		 xfs_fileoff_t offset, void *ret_ip),
317 	TP_ARGS(sc, whichfork, offset, ret_ip),
318 	TP_STRUCT__entry(
319 		__field(dev_t, dev)
320 		__field(xfs_ino_t, ino)
321 		__field(int, whichfork)
322 		__field(unsigned int, type)
323 		__field(xfs_fileoff_t, offset)
324 		__field(void *, ret_ip)
325 	),
326 	TP_fast_assign(
327 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
328 		__entry->ino = sc->ip->i_ino;
329 		__entry->whichfork = whichfork;
330 		__entry->type = sc->sm->sm_type;
331 		__entry->offset = offset;
332 		__entry->ret_ip = ret_ip;
333 	),
334 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
335 		  MAJOR(__entry->dev), MINOR(__entry->dev),
336 		  __entry->ino,
337 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
338 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
339 		  __entry->offset,
340 		  __entry->ret_ip)
341 );
342 
343 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
344 DEFINE_EVENT(xchk_fblock_error_class, name, \
345 	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
346 		 xfs_fileoff_t offset, void *ret_ip), \
347 	TP_ARGS(sc, whichfork, offset, ret_ip))
348 
349 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
350 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
351 
352 #ifdef CONFIG_XFS_QUOTA
353 DECLARE_EVENT_CLASS(xchk_dqiter_class,
354 	TP_PROTO(struct xchk_dqiter *cursor, uint64_t id),
355 	TP_ARGS(cursor, id),
356 	TP_STRUCT__entry(
357 		__field(dev_t, dev)
358 		__field(xfs_dqtype_t, dqtype)
359 		__field(xfs_ino_t, ino)
360 		__field(unsigned long long, cur_id)
361 		__field(unsigned long long, id)
362 		__field(xfs_fileoff_t, startoff)
363 		__field(xfs_fsblock_t, startblock)
364 		__field(xfs_filblks_t, blockcount)
365 		__field(xfs_exntst_t, state)
366 	),
367 	TP_fast_assign(
368 		__entry->dev = cursor->sc->ip->i_mount->m_super->s_dev;
369 		__entry->dqtype = cursor->dqtype;
370 		__entry->ino = cursor->quota_ip->i_ino;
371 		__entry->cur_id = cursor->id;
372 		__entry->startoff = cursor->bmap.br_startoff;
373 		__entry->startblock = cursor->bmap.br_startblock;
374 		__entry->blockcount = cursor->bmap.br_blockcount;
375 		__entry->state = cursor->bmap.br_state;
376 		__entry->id = id;
377 	),
378 	TP_printk("dev %d:%d dquot type %s ino 0x%llx cursor_id 0x%llx startoff 0x%llx startblock 0x%llx blockcount 0x%llx state %u id 0x%llx",
379 		  MAJOR(__entry->dev), MINOR(__entry->dev),
380 		  __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
381 		  __entry->ino,
382 		  __entry->cur_id,
383 		  __entry->startoff,
384 		  __entry->startblock,
385 		  __entry->blockcount,
386 		  __entry->state,
387 		  __entry->id)
388 );
389 
390 #define DEFINE_SCRUB_DQITER_EVENT(name) \
391 DEFINE_EVENT(xchk_dqiter_class, name, \
392 	TP_PROTO(struct xchk_dqiter *cursor, uint64_t id), \
393 	TP_ARGS(cursor, id))
394 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_revalidate_bmap);
395 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_bmap);
396 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_incore);
397 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter);
398 #endif /* CONFIG_XFS_QUOTA */
399 
400 TRACE_EVENT(xchk_incomplete,
401 	TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
402 	TP_ARGS(sc, ret_ip),
403 	TP_STRUCT__entry(
404 		__field(dev_t, dev)
405 		__field(unsigned int, type)
406 		__field(void *, ret_ip)
407 	),
408 	TP_fast_assign(
409 		__entry->dev = sc->mp->m_super->s_dev;
410 		__entry->type = sc->sm->sm_type;
411 		__entry->ret_ip = ret_ip;
412 	),
413 	TP_printk("dev %d:%d type %s ret_ip %pS",
414 		  MAJOR(__entry->dev), MINOR(__entry->dev),
415 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
416 		  __entry->ret_ip)
417 );
418 
419 TRACE_EVENT(xchk_btree_op_error,
420 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
421 		 int level, int error, void *ret_ip),
422 	TP_ARGS(sc, cur, level, error, ret_ip),
423 	TP_STRUCT__entry(
424 		__field(dev_t, dev)
425 		__field(unsigned int, type)
426 		__field(xfs_btnum_t, btnum)
427 		__field(int, level)
428 		__field(xfs_agnumber_t, agno)
429 		__field(xfs_agblock_t, bno)
430 		__field(int, ptr)
431 		__field(int, error)
432 		__field(void *, ret_ip)
433 	),
434 	TP_fast_assign(
435 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
436 
437 		__entry->dev = sc->mp->m_super->s_dev;
438 		__entry->type = sc->sm->sm_type;
439 		__entry->btnum = cur->bc_btnum;
440 		__entry->level = level;
441 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
442 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
443 		__entry->ptr = cur->bc_levels[level].ptr;
444 		__entry->error = error;
445 		__entry->ret_ip = ret_ip;
446 	),
447 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
448 		  MAJOR(__entry->dev), MINOR(__entry->dev),
449 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
450 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
451 		  __entry->level,
452 		  __entry->ptr,
453 		  __entry->agno,
454 		  __entry->bno,
455 		  __entry->error,
456 		  __entry->ret_ip)
457 );
458 
459 TRACE_EVENT(xchk_ifork_btree_op_error,
460 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
461 		 int level, int error, void *ret_ip),
462 	TP_ARGS(sc, cur, level, error, ret_ip),
463 	TP_STRUCT__entry(
464 		__field(dev_t, dev)
465 		__field(xfs_ino_t, ino)
466 		__field(int, whichfork)
467 		__field(unsigned int, type)
468 		__field(xfs_btnum_t, btnum)
469 		__field(int, level)
470 		__field(int, ptr)
471 		__field(xfs_agnumber_t, agno)
472 		__field(xfs_agblock_t, bno)
473 		__field(int, error)
474 		__field(void *, ret_ip)
475 	),
476 	TP_fast_assign(
477 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
478 		__entry->dev = sc->mp->m_super->s_dev;
479 		__entry->ino = sc->ip->i_ino;
480 		__entry->whichfork = cur->bc_ino.whichfork;
481 		__entry->type = sc->sm->sm_type;
482 		__entry->btnum = cur->bc_btnum;
483 		__entry->level = level;
484 		__entry->ptr = cur->bc_levels[level].ptr;
485 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
486 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
487 		__entry->error = error;
488 		__entry->ret_ip = ret_ip;
489 	),
490 	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",
491 		  MAJOR(__entry->dev), MINOR(__entry->dev),
492 		  __entry->ino,
493 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
494 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
495 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
496 		  __entry->level,
497 		  __entry->ptr,
498 		  __entry->agno,
499 		  __entry->bno,
500 		  __entry->error,
501 		  __entry->ret_ip)
502 );
503 
504 TRACE_EVENT(xchk_btree_error,
505 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
506 		 int level, void *ret_ip),
507 	TP_ARGS(sc, cur, level, ret_ip),
508 	TP_STRUCT__entry(
509 		__field(dev_t, dev)
510 		__field(unsigned int, type)
511 		__field(xfs_btnum_t, btnum)
512 		__field(int, level)
513 		__field(xfs_agnumber_t, agno)
514 		__field(xfs_agblock_t, bno)
515 		__field(int, ptr)
516 		__field(void *, ret_ip)
517 	),
518 	TP_fast_assign(
519 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
520 		__entry->dev = sc->mp->m_super->s_dev;
521 		__entry->type = sc->sm->sm_type;
522 		__entry->btnum = cur->bc_btnum;
523 		__entry->level = level;
524 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
525 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
526 		__entry->ptr = cur->bc_levels[level].ptr;
527 		__entry->ret_ip = ret_ip;
528 	),
529 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
530 		  MAJOR(__entry->dev), MINOR(__entry->dev),
531 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
532 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
533 		  __entry->level,
534 		  __entry->ptr,
535 		  __entry->agno,
536 		  __entry->bno,
537 		  __entry->ret_ip)
538 );
539 
540 TRACE_EVENT(xchk_ifork_btree_error,
541 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
542 		 int level, void *ret_ip),
543 	TP_ARGS(sc, cur, level, ret_ip),
544 	TP_STRUCT__entry(
545 		__field(dev_t, dev)
546 		__field(xfs_ino_t, ino)
547 		__field(int, whichfork)
548 		__field(unsigned int, type)
549 		__field(xfs_btnum_t, btnum)
550 		__field(int, level)
551 		__field(xfs_agnumber_t, agno)
552 		__field(xfs_agblock_t, bno)
553 		__field(int, ptr)
554 		__field(void *, ret_ip)
555 	),
556 	TP_fast_assign(
557 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
558 		__entry->dev = sc->mp->m_super->s_dev;
559 		__entry->ino = sc->ip->i_ino;
560 		__entry->whichfork = cur->bc_ino.whichfork;
561 		__entry->type = sc->sm->sm_type;
562 		__entry->btnum = cur->bc_btnum;
563 		__entry->level = level;
564 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
565 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
566 		__entry->ptr = cur->bc_levels[level].ptr;
567 		__entry->ret_ip = ret_ip;
568 	),
569 	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",
570 		  MAJOR(__entry->dev), MINOR(__entry->dev),
571 		  __entry->ino,
572 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
573 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
574 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
575 		  __entry->level,
576 		  __entry->ptr,
577 		  __entry->agno,
578 		  __entry->bno,
579 		  __entry->ret_ip)
580 );
581 
582 DECLARE_EVENT_CLASS(xchk_sbtree_class,
583 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
584 		 int level),
585 	TP_ARGS(sc, cur, level),
586 	TP_STRUCT__entry(
587 		__field(dev_t, dev)
588 		__field(int, type)
589 		__field(xfs_btnum_t, btnum)
590 		__field(xfs_agnumber_t, agno)
591 		__field(xfs_agblock_t, bno)
592 		__field(int, level)
593 		__field(int, nlevels)
594 		__field(int, ptr)
595 	),
596 	TP_fast_assign(
597 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
598 
599 		__entry->dev = sc->mp->m_super->s_dev;
600 		__entry->type = sc->sm->sm_type;
601 		__entry->btnum = cur->bc_btnum;
602 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
603 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
604 		__entry->level = level;
605 		__entry->nlevels = cur->bc_nlevels;
606 		__entry->ptr = cur->bc_levels[level].ptr;
607 	),
608 	TP_printk("dev %d:%d type %s btree %s agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
609 		  MAJOR(__entry->dev), MINOR(__entry->dev),
610 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
611 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
612 		  __entry->agno,
613 		  __entry->bno,
614 		  __entry->level,
615 		  __entry->nlevels,
616 		  __entry->ptr)
617 )
618 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
619 DEFINE_EVENT(xchk_sbtree_class, name, \
620 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
621 		 int level), \
622 	TP_ARGS(sc, cur, level))
623 
624 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
625 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
626 
627 TRACE_EVENT(xchk_xref_error,
628 	TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
629 	TP_ARGS(sc, error, ret_ip),
630 	TP_STRUCT__entry(
631 		__field(dev_t, dev)
632 		__field(int, type)
633 		__field(int, error)
634 		__field(void *, ret_ip)
635 	),
636 	TP_fast_assign(
637 		__entry->dev = sc->mp->m_super->s_dev;
638 		__entry->type = sc->sm->sm_type;
639 		__entry->error = error;
640 		__entry->ret_ip = ret_ip;
641 	),
642 	TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
643 		  MAJOR(__entry->dev), MINOR(__entry->dev),
644 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
645 		  __entry->error,
646 		  __entry->ret_ip)
647 );
648 
649 TRACE_EVENT(xchk_iallocbt_check_cluster,
650 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
651 		 xfs_agino_t startino, xfs_daddr_t map_daddr,
652 		 unsigned short map_len, unsigned int chunk_ino,
653 		 unsigned int nr_inodes, uint16_t cluster_mask,
654 		 uint16_t holemask, unsigned int cluster_ino),
655 	TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
656 		cluster_mask, holemask, cluster_ino),
657 	TP_STRUCT__entry(
658 		__field(dev_t, dev)
659 		__field(xfs_agnumber_t, agno)
660 		__field(xfs_agino_t, startino)
661 		__field(xfs_daddr_t, map_daddr)
662 		__field(unsigned short, map_len)
663 		__field(unsigned int, chunk_ino)
664 		__field(unsigned int, nr_inodes)
665 		__field(unsigned int, cluster_ino)
666 		__field(uint16_t, cluster_mask)
667 		__field(uint16_t, holemask)
668 	),
669 	TP_fast_assign(
670 		__entry->dev = mp->m_super->s_dev;
671 		__entry->agno = agno;
672 		__entry->startino = startino;
673 		__entry->map_daddr = map_daddr;
674 		__entry->map_len = map_len;
675 		__entry->chunk_ino = chunk_ino;
676 		__entry->nr_inodes = nr_inodes;
677 		__entry->cluster_mask = cluster_mask;
678 		__entry->holemask = holemask;
679 		__entry->cluster_ino = cluster_ino;
680 	),
681 	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",
682 		  MAJOR(__entry->dev), MINOR(__entry->dev),
683 		  __entry->agno,
684 		  __entry->startino,
685 		  __entry->map_daddr,
686 		  __entry->map_len,
687 		  __entry->chunk_ino,
688 		  __entry->nr_inodes,
689 		  __entry->cluster_mask,
690 		  __entry->holemask,
691 		  __entry->cluster_ino)
692 )
693 
694 TRACE_EVENT(xchk_inode_is_allocated,
695 	TP_PROTO(struct xfs_inode *ip),
696 	TP_ARGS(ip),
697 	TP_STRUCT__entry(
698 		__field(dev_t, dev)
699 		__field(xfs_ino_t, ino)
700 		__field(unsigned long, iflags)
701 		__field(umode_t, mode)
702 	),
703 	TP_fast_assign(
704 		__entry->dev = VFS_I(ip)->i_sb->s_dev;
705 		__entry->ino = ip->i_ino;
706 		__entry->iflags = ip->i_flags;
707 		__entry->mode = VFS_I(ip)->i_mode;
708 	),
709 	TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
710 		  MAJOR(__entry->dev), MINOR(__entry->dev),
711 		  __entry->ino,
712 		  __entry->iflags,
713 		  __entry->mode)
714 );
715 
716 TRACE_EVENT(xchk_fscounters_calc,
717 	TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
718 		 uint64_t fdblocks, uint64_t delalloc),
719 	TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
720 	TP_STRUCT__entry(
721 		__field(dev_t, dev)
722 		__field(int64_t, icount_sb)
723 		__field(uint64_t, icount_calculated)
724 		__field(int64_t, ifree_sb)
725 		__field(uint64_t, ifree_calculated)
726 		__field(int64_t, fdblocks_sb)
727 		__field(uint64_t, fdblocks_calculated)
728 		__field(uint64_t, delalloc)
729 	),
730 	TP_fast_assign(
731 		__entry->dev = mp->m_super->s_dev;
732 		__entry->icount_sb = mp->m_sb.sb_icount;
733 		__entry->icount_calculated = icount;
734 		__entry->ifree_sb = mp->m_sb.sb_ifree;
735 		__entry->ifree_calculated = ifree;
736 		__entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
737 		__entry->fdblocks_calculated = fdblocks;
738 		__entry->delalloc = delalloc;
739 	),
740 	TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
741 		  MAJOR(__entry->dev), MINOR(__entry->dev),
742 		  __entry->icount_sb,
743 		  __entry->icount_calculated,
744 		  __entry->ifree_sb,
745 		  __entry->ifree_calculated,
746 		  __entry->fdblocks_sb,
747 		  __entry->fdblocks_calculated,
748 		  __entry->delalloc)
749 )
750 
751 TRACE_EVENT(xchk_fscounters_within_range,
752 	TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
753 		 int64_t old_value),
754 	TP_ARGS(mp, expected, curr_value, old_value),
755 	TP_STRUCT__entry(
756 		__field(dev_t, dev)
757 		__field(uint64_t, expected)
758 		__field(int64_t, curr_value)
759 		__field(int64_t, old_value)
760 	),
761 	TP_fast_assign(
762 		__entry->dev = mp->m_super->s_dev;
763 		__entry->expected = expected;
764 		__entry->curr_value = curr_value;
765 		__entry->old_value = old_value;
766 	),
767 	TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
768 		  MAJOR(__entry->dev), MINOR(__entry->dev),
769 		  __entry->expected,
770 		  __entry->curr_value,
771 		  __entry->old_value)
772 )
773 
774 DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
775 	TP_PROTO(struct xfs_scrub *sc, int error),
776 	TP_ARGS(sc, error),
777 	TP_STRUCT__entry(
778 		__field(dev_t, dev)
779 		__field(unsigned int, type)
780 		__field(int, error)
781 	),
782 	TP_fast_assign(
783 		__entry->dev = sc->mp->m_super->s_dev;
784 		__entry->type = sc->sm->sm_type;
785 		__entry->error = error;
786 	),
787 	TP_printk("dev %d:%d type %s error %d",
788 		  MAJOR(__entry->dev), MINOR(__entry->dev),
789 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
790 		  __entry->error)
791 );
792 #define DEFINE_XCHK_FSFREEZE_EVENT(name) \
793 DEFINE_EVENT(xchk_fsfreeze_class, name, \
794 	TP_PROTO(struct xfs_scrub *sc, int error), \
795 	TP_ARGS(sc, error))
796 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
797 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
798 
799 TRACE_EVENT(xchk_refcount_incorrect,
800 	TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
801 		 xfs_nlink_t seen),
802 	TP_ARGS(pag, irec, seen),
803 	TP_STRUCT__entry(
804 		__field(dev_t, dev)
805 		__field(xfs_agnumber_t, agno)
806 		__field(enum xfs_refc_domain, domain)
807 		__field(xfs_agblock_t, startblock)
808 		__field(xfs_extlen_t, blockcount)
809 		__field(xfs_nlink_t, refcount)
810 		__field(xfs_nlink_t, seen)
811 	),
812 	TP_fast_assign(
813 		__entry->dev = pag->pag_mount->m_super->s_dev;
814 		__entry->agno = pag->pag_agno;
815 		__entry->domain = irec->rc_domain;
816 		__entry->startblock = irec->rc_startblock;
817 		__entry->blockcount = irec->rc_blockcount;
818 		__entry->refcount = irec->rc_refcount;
819 		__entry->seen = seen;
820 	),
821 	TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
822 		  MAJOR(__entry->dev), MINOR(__entry->dev),
823 		  __entry->agno,
824 		  __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
825 		  __entry->startblock,
826 		  __entry->blockcount,
827 		  __entry->refcount,
828 		  __entry->seen)
829 )
830 
831 TRACE_EVENT(xfile_create,
832 	TP_PROTO(struct xfile *xf),
833 	TP_ARGS(xf),
834 	TP_STRUCT__entry(
835 		__field(dev_t, dev)
836 		__field(unsigned long, ino)
837 		__array(char, pathname, 256)
838 	),
839 	TP_fast_assign(
840 		char		pathname[257];
841 		char		*path;
842 
843 		__entry->ino = file_inode(xf->file)->i_ino;
844 		memset(pathname, 0, sizeof(pathname));
845 		path = file_path(xf->file, pathname, sizeof(pathname) - 1);
846 		if (IS_ERR(path))
847 			path = "(unknown)";
848 		strncpy(__entry->pathname, path, sizeof(__entry->pathname));
849 	),
850 	TP_printk("xfino 0x%lx path '%s'",
851 		  __entry->ino,
852 		  __entry->pathname)
853 );
854 
855 TRACE_EVENT(xfile_destroy,
856 	TP_PROTO(struct xfile *xf),
857 	TP_ARGS(xf),
858 	TP_STRUCT__entry(
859 		__field(unsigned long, ino)
860 		__field(unsigned long long, bytes)
861 		__field(loff_t, size)
862 	),
863 	TP_fast_assign(
864 		struct inode		*inode = file_inode(xf->file);
865 
866 		__entry->ino = inode->i_ino;
867 		__entry->bytes = inode->i_blocks << SECTOR_SHIFT;
868 		__entry->size = i_size_read(inode);
869 	),
870 	TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
871 		  __entry->ino,
872 		  __entry->bytes,
873 		  __entry->size)
874 );
875 
876 DECLARE_EVENT_CLASS(xfile_class,
877 	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
878 	TP_ARGS(xf, pos, bytecount),
879 	TP_STRUCT__entry(
880 		__field(unsigned long, ino)
881 		__field(unsigned long long, bytes_used)
882 		__field(loff_t, pos)
883 		__field(loff_t, size)
884 		__field(unsigned long long, bytecount)
885 	),
886 	TP_fast_assign(
887 		struct inode		*inode = file_inode(xf->file);
888 
889 		__entry->ino = inode->i_ino;
890 		__entry->bytes_used = inode->i_blocks << SECTOR_SHIFT;
891 		__entry->pos = pos;
892 		__entry->size = i_size_read(inode);
893 		__entry->bytecount = bytecount;
894 	),
895 	TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
896 		  __entry->ino,
897 		  __entry->bytes_used,
898 		  __entry->pos,
899 		  __entry->bytecount,
900 		  __entry->size)
901 );
902 #define DEFINE_XFILE_EVENT(name) \
903 DEFINE_EVENT(xfile_class, name, \
904 	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
905 	TP_ARGS(xf, pos, bytecount))
906 DEFINE_XFILE_EVENT(xfile_load);
907 DEFINE_XFILE_EVENT(xfile_store);
908 DEFINE_XFILE_EVENT(xfile_seek_data);
909 DEFINE_XFILE_EVENT(xfile_get_folio);
910 DEFINE_XFILE_EVENT(xfile_put_folio);
911 
912 TRACE_EVENT(xfarray_create,
913 	TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
914 	TP_ARGS(xfa, required_capacity),
915 	TP_STRUCT__entry(
916 		__field(unsigned long, ino)
917 		__field(uint64_t, max_nr)
918 		__field(size_t, obj_size)
919 		__field(int, obj_size_log)
920 		__field(unsigned long long, required_capacity)
921 	),
922 	TP_fast_assign(
923 		__entry->max_nr = xfa->max_nr;
924 		__entry->obj_size = xfa->obj_size;
925 		__entry->obj_size_log = xfa->obj_size_log;
926 		__entry->ino = file_inode(xfa->xfile->file)->i_ino;
927 		__entry->required_capacity = required_capacity;
928 	),
929 	TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
930 		  __entry->ino,
931 		  __entry->max_nr,
932 		  __entry->required_capacity,
933 		  __entry->obj_size,
934 		  __entry->obj_size_log)
935 );
936 
937 TRACE_EVENT(xfarray_isort,
938 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
939 	TP_ARGS(si, lo, hi),
940 	TP_STRUCT__entry(
941 		__field(unsigned long, ino)
942 		__field(unsigned long long, lo)
943 		__field(unsigned long long, hi)
944 	),
945 	TP_fast_assign(
946 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
947 		__entry->lo = lo;
948 		__entry->hi = hi;
949 	),
950 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
951 		  __entry->ino,
952 		  __entry->lo,
953 		  __entry->hi,
954 		  __entry->hi - __entry->lo)
955 );
956 
957 TRACE_EVENT(xfarray_foliosort,
958 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
959 	TP_ARGS(si, lo, hi),
960 	TP_STRUCT__entry(
961 		__field(unsigned long, ino)
962 		__field(unsigned long long, lo)
963 		__field(unsigned long long, hi)
964 	),
965 	TP_fast_assign(
966 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
967 		__entry->lo = lo;
968 		__entry->hi = hi;
969 	),
970 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
971 		  __entry->ino,
972 		  __entry->lo,
973 		  __entry->hi,
974 		  __entry->hi - __entry->lo)
975 );
976 
977 TRACE_EVENT(xfarray_qsort,
978 	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
979 	TP_ARGS(si, lo, hi),
980 	TP_STRUCT__entry(
981 		__field(unsigned long, ino)
982 		__field(unsigned long long, lo)
983 		__field(unsigned long long, hi)
984 		__field(int, stack_depth)
985 		__field(int, max_stack_depth)
986 	),
987 	TP_fast_assign(
988 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
989 		__entry->lo = lo;
990 		__entry->hi = hi;
991 		__entry->stack_depth = si->stack_depth;
992 		__entry->max_stack_depth = si->max_stack_depth;
993 	),
994 	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
995 		  __entry->ino,
996 		  __entry->lo,
997 		  __entry->hi,
998 		  __entry->hi - __entry->lo,
999 		  __entry->stack_depth,
1000 		  __entry->max_stack_depth)
1001 );
1002 
1003 TRACE_EVENT(xfarray_sort,
1004 	TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
1005 	TP_ARGS(si, bytes),
1006 	TP_STRUCT__entry(
1007 		__field(unsigned long, ino)
1008 		__field(unsigned long long, nr)
1009 		__field(size_t, obj_size)
1010 		__field(size_t, bytes)
1011 		__field(unsigned int, max_stack_depth)
1012 	),
1013 	TP_fast_assign(
1014 		__entry->nr = si->array->nr;
1015 		__entry->obj_size = si->array->obj_size;
1016 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1017 		__entry->bytes = bytes;
1018 		__entry->max_stack_depth = si->max_stack_depth;
1019 	),
1020 	TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
1021 		  __entry->ino,
1022 		  __entry->nr,
1023 		  __entry->obj_size,
1024 		  __entry->max_stack_depth,
1025 		  __entry->bytes)
1026 );
1027 
1028 TRACE_EVENT(xfarray_sort_scan,
1029 	TP_PROTO(struct xfarray_sortinfo *si, unsigned long long idx),
1030 	TP_ARGS(si, idx),
1031 	TP_STRUCT__entry(
1032 		__field(unsigned long, ino)
1033 		__field(unsigned long long, nr)
1034 		__field(size_t, obj_size)
1035 		__field(unsigned long long, idx)
1036 		__field(unsigned long long, folio_pos)
1037 		__field(unsigned long, folio_bytes)
1038 		__field(unsigned long long, first_idx)
1039 		__field(unsigned long long, last_idx)
1040 	),
1041 	TP_fast_assign(
1042 		__entry->nr = si->array->nr;
1043 		__entry->obj_size = si->array->obj_size;
1044 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1045 		__entry->idx = idx;
1046 		if (si->folio) {
1047 			__entry->folio_pos = folio_pos(si->folio);
1048 			__entry->folio_bytes = folio_size(si->folio);
1049 			__entry->first_idx = si->first_folio_idx;
1050 			__entry->last_idx = si->last_folio_idx;
1051 		} else {
1052 			__entry->folio_pos = 0;
1053 			__entry->folio_bytes = 0;
1054 			__entry->first_idx = 0;
1055 			__entry->last_idx = 0;
1056 		}
1057 	),
1058 	TP_printk("xfino 0x%lx nr %llu objsz %zu idx %llu folio_pos 0x%llx folio_bytes 0x%lx first_idx %llu last_idx %llu",
1059 		  __entry->ino,
1060 		  __entry->nr,
1061 		  __entry->obj_size,
1062 		  __entry->idx,
1063 		  __entry->folio_pos,
1064 		  __entry->folio_bytes,
1065 		  __entry->first_idx,
1066 		  __entry->last_idx)
1067 );
1068 
1069 TRACE_EVENT(xfarray_sort_stats,
1070 	TP_PROTO(struct xfarray_sortinfo *si, int error),
1071 	TP_ARGS(si, error),
1072 	TP_STRUCT__entry(
1073 		__field(unsigned long, ino)
1074 #ifdef DEBUG
1075 		__field(unsigned long long, loads)
1076 		__field(unsigned long long, stores)
1077 		__field(unsigned long long, compares)
1078 		__field(unsigned long long, heapsorts)
1079 #endif
1080 		__field(unsigned int, max_stack_depth)
1081 		__field(unsigned int, max_stack_used)
1082 		__field(int, error)
1083 	),
1084 	TP_fast_assign(
1085 		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1086 #ifdef DEBUG
1087 		__entry->loads = si->loads;
1088 		__entry->stores = si->stores;
1089 		__entry->compares = si->compares;
1090 		__entry->heapsorts = si->heapsorts;
1091 #endif
1092 		__entry->max_stack_depth = si->max_stack_depth;
1093 		__entry->max_stack_used = si->max_stack_used;
1094 		__entry->error = error;
1095 	),
1096 	TP_printk(
1097 #ifdef DEBUG
1098 		  "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1099 #else
1100 		  "xfino 0x%lx stack_depth %u/%u error %d",
1101 #endif
1102 		  __entry->ino,
1103 #ifdef DEBUG
1104 		  __entry->loads,
1105 		  __entry->stores,
1106 		  __entry->compares,
1107 		  __entry->heapsorts,
1108 #endif
1109 		  __entry->max_stack_used,
1110 		  __entry->max_stack_depth,
1111 		  __entry->error)
1112 );
1113 
1114 #ifdef CONFIG_XFS_RT
1115 TRACE_EVENT(xchk_rtsum_record_free,
1116 	TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
1117 		 xfs_rtbxlen_t len, unsigned int log, loff_t pos,
1118 		 xfs_suminfo_t value),
1119 	TP_ARGS(mp, start, len, log, pos, value),
1120 	TP_STRUCT__entry(
1121 		__field(dev_t, dev)
1122 		__field(dev_t, rtdev)
1123 		__field(xfs_rtxnum_t, start)
1124 		__field(unsigned long long, len)
1125 		__field(unsigned int, log)
1126 		__field(loff_t, pos)
1127 		__field(xfs_suminfo_t, value)
1128 	),
1129 	TP_fast_assign(
1130 		__entry->dev = mp->m_super->s_dev;
1131 		__entry->rtdev = mp->m_rtdev_targp->bt_dev;
1132 		__entry->start = start;
1133 		__entry->len = len;
1134 		__entry->log = log;
1135 		__entry->pos = pos;
1136 		__entry->value = value;
1137 	),
1138 	TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
1139 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1140 		  MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
1141 		  __entry->start,
1142 		  __entry->len,
1143 		  __entry->log,
1144 		  __entry->pos,
1145 		  __entry->value)
1146 );
1147 #endif /* CONFIG_XFS_RT */
1148 
1149 /* repair tracepoints */
1150 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1151 
1152 DECLARE_EVENT_CLASS(xrep_extent_class,
1153 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len),
1154 	TP_ARGS(pag, agbno, len),
1155 	TP_STRUCT__entry(
1156 		__field(dev_t, dev)
1157 		__field(xfs_agnumber_t, agno)
1158 		__field(xfs_agblock_t, agbno)
1159 		__field(xfs_extlen_t, len)
1160 	),
1161 	TP_fast_assign(
1162 		__entry->dev = pag->pag_mount->m_super->s_dev;
1163 		__entry->agno = pag->pag_agno;
1164 		__entry->agbno = agbno;
1165 		__entry->len = len;
1166 	),
1167 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1168 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1169 		  __entry->agno,
1170 		  __entry->agbno,
1171 		  __entry->len)
1172 );
1173 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
1174 DEFINE_EVENT(xrep_extent_class, name, \
1175 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len), \
1176 	TP_ARGS(pag, agbno, len))
1177 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1178 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1179 DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1180 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1181 
1182 DECLARE_EVENT_CLASS(xrep_reap_find_class,
1183 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len,
1184 		bool crosslinked),
1185 	TP_ARGS(pag, agbno, len, crosslinked),
1186 	TP_STRUCT__entry(
1187 		__field(dev_t, dev)
1188 		__field(xfs_agnumber_t, agno)
1189 		__field(xfs_agblock_t, agbno)
1190 		__field(xfs_extlen_t, len)
1191 		__field(bool, crosslinked)
1192 	),
1193 	TP_fast_assign(
1194 		__entry->dev = pag->pag_mount->m_super->s_dev;
1195 		__entry->agno = pag->pag_agno;
1196 		__entry->agbno = agbno;
1197 		__entry->len = len;
1198 		__entry->crosslinked = crosslinked;
1199 	),
1200 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
1201 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1202 		  __entry->agno,
1203 		  __entry->agbno,
1204 		  __entry->len,
1205 		  __entry->crosslinked ? 1 : 0)
1206 );
1207 #define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
1208 DEFINE_EVENT(xrep_reap_find_class, name, \
1209 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len, \
1210 		 bool crosslinked), \
1211 	TP_ARGS(pag, agbno, len, crosslinked))
1212 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1213 
1214 DECLARE_EVENT_CLASS(xrep_rmap_class,
1215 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1216 		 xfs_agblock_t agbno, xfs_extlen_t len,
1217 		 uint64_t owner, uint64_t offset, unsigned int flags),
1218 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
1219 	TP_STRUCT__entry(
1220 		__field(dev_t, dev)
1221 		__field(xfs_agnumber_t, agno)
1222 		__field(xfs_agblock_t, agbno)
1223 		__field(xfs_extlen_t, len)
1224 		__field(uint64_t, owner)
1225 		__field(uint64_t, offset)
1226 		__field(unsigned int, flags)
1227 	),
1228 	TP_fast_assign(
1229 		__entry->dev = mp->m_super->s_dev;
1230 		__entry->agno = agno;
1231 		__entry->agbno = agbno;
1232 		__entry->len = len;
1233 		__entry->owner = owner;
1234 		__entry->offset = offset;
1235 		__entry->flags = flags;
1236 	),
1237 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
1238 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1239 		  __entry->agno,
1240 		  __entry->agbno,
1241 		  __entry->len,
1242 		  __entry->owner,
1243 		  __entry->offset,
1244 		  __entry->flags)
1245 );
1246 #define DEFINE_REPAIR_RMAP_EVENT(name) \
1247 DEFINE_EVENT(xrep_rmap_class, name, \
1248 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
1249 		 xfs_agblock_t agbno, xfs_extlen_t len, \
1250 		 uint64_t owner, uint64_t offset, unsigned int flags), \
1251 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
1252 DEFINE_REPAIR_RMAP_EVENT(xrep_ibt_walk_rmap);
1253 DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn);
1254 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_walk_rmap);
1255 
1256 TRACE_EVENT(xrep_abt_found,
1257 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1258 		 const struct xfs_alloc_rec_incore *rec),
1259 	TP_ARGS(mp, agno, rec),
1260 	TP_STRUCT__entry(
1261 		__field(dev_t, dev)
1262 		__field(xfs_agnumber_t, agno)
1263 		__field(xfs_agblock_t, startblock)
1264 		__field(xfs_extlen_t, blockcount)
1265 	),
1266 	TP_fast_assign(
1267 		__entry->dev = mp->m_super->s_dev;
1268 		__entry->agno = agno;
1269 		__entry->startblock = rec->ar_startblock;
1270 		__entry->blockcount = rec->ar_blockcount;
1271 	),
1272 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1273 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1274 		  __entry->agno,
1275 		  __entry->startblock,
1276 		  __entry->blockcount)
1277 )
1278 
1279 TRACE_EVENT(xrep_ibt_found,
1280 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1281 		 const struct xfs_inobt_rec_incore *rec),
1282 	TP_ARGS(mp, agno, rec),
1283 	TP_STRUCT__entry(
1284 		__field(dev_t, dev)
1285 		__field(xfs_agnumber_t, agno)
1286 		__field(xfs_agino_t, startino)
1287 		__field(uint16_t, holemask)
1288 		__field(uint8_t, count)
1289 		__field(uint8_t, freecount)
1290 		__field(uint64_t, freemask)
1291 	),
1292 	TP_fast_assign(
1293 		__entry->dev = mp->m_super->s_dev;
1294 		__entry->agno = agno;
1295 		__entry->startino = rec->ir_startino;
1296 		__entry->holemask = rec->ir_holemask;
1297 		__entry->count = rec->ir_count;
1298 		__entry->freecount = rec->ir_freecount;
1299 		__entry->freemask = rec->ir_free;
1300 	),
1301 	TP_printk("dev %d:%d agno 0x%x agino 0x%x holemask 0x%x count 0x%x freecount 0x%x freemask 0x%llx",
1302 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1303 		  __entry->agno,
1304 		  __entry->startino,
1305 		  __entry->holemask,
1306 		  __entry->count,
1307 		  __entry->freecount,
1308 		  __entry->freemask)
1309 )
1310 
1311 TRACE_EVENT(xrep_refc_found,
1312 	TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *rec),
1313 	TP_ARGS(pag, rec),
1314 	TP_STRUCT__entry(
1315 		__field(dev_t, dev)
1316 		__field(xfs_agnumber_t, agno)
1317 		__field(enum xfs_refc_domain, domain)
1318 		__field(xfs_agblock_t, startblock)
1319 		__field(xfs_extlen_t, blockcount)
1320 		__field(xfs_nlink_t, refcount)
1321 	),
1322 	TP_fast_assign(
1323 		__entry->dev = pag->pag_mount->m_super->s_dev;
1324 		__entry->agno = pag->pag_agno;
1325 		__entry->domain = rec->rc_domain;
1326 		__entry->startblock = rec->rc_startblock;
1327 		__entry->blockcount = rec->rc_blockcount;
1328 		__entry->refcount = rec->rc_refcount;
1329 	),
1330 	TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u",
1331 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1332 		  __entry->agno,
1333 		  __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
1334 		  __entry->startblock,
1335 		  __entry->blockcount,
1336 		  __entry->refcount)
1337 )
1338 
1339 TRACE_EVENT(xrep_bmap_found,
1340 	TP_PROTO(struct xfs_inode *ip, int whichfork,
1341 		 struct xfs_bmbt_irec *irec),
1342 	TP_ARGS(ip, whichfork, irec),
1343 	TP_STRUCT__entry(
1344 		__field(dev_t, dev)
1345 		__field(xfs_ino_t, ino)
1346 		__field(int, whichfork)
1347 		__field(xfs_fileoff_t, lblk)
1348 		__field(xfs_filblks_t, len)
1349 		__field(xfs_fsblock_t, pblk)
1350 		__field(int, state)
1351 	),
1352 	TP_fast_assign(
1353 		__entry->dev = VFS_I(ip)->i_sb->s_dev;
1354 		__entry->ino = ip->i_ino;
1355 		__entry->whichfork = whichfork;
1356 		__entry->lblk = irec->br_startoff;
1357 		__entry->len = irec->br_blockcount;
1358 		__entry->pblk = irec->br_startblock;
1359 		__entry->state = irec->br_state;
1360 	),
1361 	TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
1362 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1363 		  __entry->ino,
1364 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
1365 		  __entry->lblk,
1366 		  __entry->len,
1367 		  __entry->pblk,
1368 		  __entry->state)
1369 );
1370 
1371 TRACE_EVENT(xrep_findroot_block,
1372 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
1373 		 uint32_t magic, uint16_t level),
1374 	TP_ARGS(mp, agno, agbno, magic, level),
1375 	TP_STRUCT__entry(
1376 		__field(dev_t, dev)
1377 		__field(xfs_agnumber_t, agno)
1378 		__field(xfs_agblock_t, agbno)
1379 		__field(uint32_t, magic)
1380 		__field(uint16_t, level)
1381 	),
1382 	TP_fast_assign(
1383 		__entry->dev = mp->m_super->s_dev;
1384 		__entry->agno = agno;
1385 		__entry->agbno = agbno;
1386 		__entry->magic = magic;
1387 		__entry->level = level;
1388 	),
1389 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
1390 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1391 		  __entry->agno,
1392 		  __entry->agbno,
1393 		  __entry->magic,
1394 		  __entry->level)
1395 )
1396 TRACE_EVENT(xrep_calc_ag_resblks,
1397 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1398 		 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
1399 		 xfs_agblock_t usedlen),
1400 	TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
1401 	TP_STRUCT__entry(
1402 		__field(dev_t, dev)
1403 		__field(xfs_agnumber_t, agno)
1404 		__field(xfs_agino_t, icount)
1405 		__field(xfs_agblock_t, aglen)
1406 		__field(xfs_agblock_t, freelen)
1407 		__field(xfs_agblock_t, usedlen)
1408 	),
1409 	TP_fast_assign(
1410 		__entry->dev = mp->m_super->s_dev;
1411 		__entry->agno = agno;
1412 		__entry->icount = icount;
1413 		__entry->aglen = aglen;
1414 		__entry->freelen = freelen;
1415 		__entry->usedlen = usedlen;
1416 	),
1417 	TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
1418 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1419 		  __entry->agno,
1420 		  __entry->icount,
1421 		  __entry->aglen,
1422 		  __entry->freelen,
1423 		  __entry->usedlen)
1424 )
1425 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
1426 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1427 		 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
1428 		 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
1429 	TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
1430 	TP_STRUCT__entry(
1431 		__field(dev_t, dev)
1432 		__field(xfs_agnumber_t, agno)
1433 		__field(xfs_agblock_t, bnobt_sz)
1434 		__field(xfs_agblock_t, inobt_sz)
1435 		__field(xfs_agblock_t, rmapbt_sz)
1436 		__field(xfs_agblock_t, refcbt_sz)
1437 	),
1438 	TP_fast_assign(
1439 		__entry->dev = mp->m_super->s_dev;
1440 		__entry->agno = agno;
1441 		__entry->bnobt_sz = bnobt_sz;
1442 		__entry->inobt_sz = inobt_sz;
1443 		__entry->rmapbt_sz = rmapbt_sz;
1444 		__entry->refcbt_sz = refcbt_sz;
1445 	),
1446 	TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
1447 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1448 		  __entry->agno,
1449 		  __entry->bnobt_sz,
1450 		  __entry->inobt_sz,
1451 		  __entry->rmapbt_sz,
1452 		  __entry->refcbt_sz)
1453 )
1454 TRACE_EVENT(xrep_reset_counters,
1455 	TP_PROTO(struct xfs_mount *mp),
1456 	TP_ARGS(mp),
1457 	TP_STRUCT__entry(
1458 		__field(dev_t, dev)
1459 	),
1460 	TP_fast_assign(
1461 		__entry->dev = mp->m_super->s_dev;
1462 	),
1463 	TP_printk("dev %d:%d",
1464 		  MAJOR(__entry->dev), MINOR(__entry->dev))
1465 )
1466 
1467 DECLARE_EVENT_CLASS(xrep_newbt_extent_class,
1468 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1469 		 xfs_agblock_t agbno, xfs_extlen_t len,
1470 		 int64_t owner),
1471 	TP_ARGS(mp, agno, agbno, len, owner),
1472 	TP_STRUCT__entry(
1473 		__field(dev_t, dev)
1474 		__field(xfs_agnumber_t, agno)
1475 		__field(xfs_agblock_t, agbno)
1476 		__field(xfs_extlen_t, len)
1477 		__field(int64_t, owner)
1478 	),
1479 	TP_fast_assign(
1480 		__entry->dev = mp->m_super->s_dev;
1481 		__entry->agno = agno;
1482 		__entry->agbno = agbno;
1483 		__entry->len = len;
1484 		__entry->owner = owner;
1485 	),
1486 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx",
1487 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1488 		  __entry->agno,
1489 		  __entry->agbno,
1490 		  __entry->len,
1491 		  __entry->owner)
1492 );
1493 #define DEFINE_NEWBT_EXTENT_EVENT(name) \
1494 DEFINE_EVENT(xrep_newbt_extent_class, name, \
1495 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
1496 		 xfs_agblock_t agbno, xfs_extlen_t len, \
1497 		 int64_t owner), \
1498 	TP_ARGS(mp, agno, agbno, len, owner))
1499 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_ag_blocks);
1500 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_file_blocks);
1501 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_free_blocks);
1502 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_claim_block);
1503 
1504 DECLARE_EVENT_CLASS(xrep_dinode_class,
1505 	TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip),
1506 	TP_ARGS(sc, dip),
1507 	TP_STRUCT__entry(
1508 		__field(dev_t, dev)
1509 		__field(xfs_ino_t, ino)
1510 		__field(uint16_t, mode)
1511 		__field(uint8_t, version)
1512 		__field(uint8_t, format)
1513 		__field(uint32_t, uid)
1514 		__field(uint32_t, gid)
1515 		__field(uint64_t, size)
1516 		__field(uint64_t, nblocks)
1517 		__field(uint32_t, extsize)
1518 		__field(uint32_t, nextents)
1519 		__field(uint16_t, anextents)
1520 		__field(uint8_t, forkoff)
1521 		__field(uint8_t, aformat)
1522 		__field(uint16_t, flags)
1523 		__field(uint32_t, gen)
1524 		__field(uint64_t, flags2)
1525 		__field(uint32_t, cowextsize)
1526 	),
1527 	TP_fast_assign(
1528 		__entry->dev = sc->mp->m_super->s_dev;
1529 		__entry->ino = sc->sm->sm_ino;
1530 		__entry->mode = be16_to_cpu(dip->di_mode);
1531 		__entry->version = dip->di_version;
1532 		__entry->format = dip->di_format;
1533 		__entry->uid = be32_to_cpu(dip->di_uid);
1534 		__entry->gid = be32_to_cpu(dip->di_gid);
1535 		__entry->size = be64_to_cpu(dip->di_size);
1536 		__entry->nblocks = be64_to_cpu(dip->di_nblocks);
1537 		__entry->extsize = be32_to_cpu(dip->di_extsize);
1538 		__entry->nextents = be32_to_cpu(dip->di_nextents);
1539 		__entry->anextents = be16_to_cpu(dip->di_anextents);
1540 		__entry->forkoff = dip->di_forkoff;
1541 		__entry->aformat = dip->di_aformat;
1542 		__entry->flags = be16_to_cpu(dip->di_flags);
1543 		__entry->gen = be32_to_cpu(dip->di_gen);
1544 		__entry->flags2 = be64_to_cpu(dip->di_flags2);
1545 		__entry->cowextsize = be32_to_cpu(dip->di_cowextsize);
1546 	),
1547 	TP_printk("dev %d:%d ino 0x%llx mode 0x%x version %u format %u uid %u gid %u disize 0x%llx nblocks 0x%llx extsize %u nextents %u anextents %u forkoff 0x%x aformat %u flags 0x%x gen 0x%x flags2 0x%llx cowextsize %u",
1548 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1549 		  __entry->ino,
1550 		  __entry->mode,
1551 		  __entry->version,
1552 		  __entry->format,
1553 		  __entry->uid,
1554 		  __entry->gid,
1555 		  __entry->size,
1556 		  __entry->nblocks,
1557 		  __entry->extsize,
1558 		  __entry->nextents,
1559 		  __entry->anextents,
1560 		  __entry->forkoff,
1561 		  __entry->aformat,
1562 		  __entry->flags,
1563 		  __entry->gen,
1564 		  __entry->flags2,
1565 		  __entry->cowextsize)
1566 )
1567 
1568 #define DEFINE_REPAIR_DINODE_EVENT(name) \
1569 DEFINE_EVENT(xrep_dinode_class, name, \
1570 	TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip), \
1571 	TP_ARGS(sc, dip))
1572 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_header);
1573 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_mode);
1574 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_flags);
1575 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_size);
1576 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_extsize_hints);
1577 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_symlink);
1578 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dir);
1579 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_fixed);
1580 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_forks);
1581 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dfork);
1582 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_afork);
1583 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_ensure_forkoff);
1584 
1585 DECLARE_EVENT_CLASS(xrep_inode_class,
1586 	TP_PROTO(struct xfs_scrub *sc),
1587 	TP_ARGS(sc),
1588 	TP_STRUCT__entry(
1589 		__field(dev_t, dev)
1590 		__field(xfs_ino_t, ino)
1591 		__field(xfs_fsize_t, size)
1592 		__field(xfs_rfsblock_t, nblocks)
1593 		__field(uint16_t, flags)
1594 		__field(uint64_t, flags2)
1595 		__field(uint32_t, nextents)
1596 		__field(uint8_t, format)
1597 		__field(uint32_t, anextents)
1598 		__field(uint8_t, aformat)
1599 	),
1600 	TP_fast_assign(
1601 		__entry->dev = sc->mp->m_super->s_dev;
1602 		__entry->ino = sc->sm->sm_ino;
1603 		__entry->size = sc->ip->i_disk_size;
1604 		__entry->nblocks = sc->ip->i_nblocks;
1605 		__entry->flags = sc->ip->i_diflags;
1606 		__entry->flags2 = sc->ip->i_diflags2;
1607 		__entry->nextents = sc->ip->i_df.if_nextents;
1608 		__entry->format = sc->ip->i_df.if_format;
1609 		__entry->anextents = sc->ip->i_af.if_nextents;
1610 		__entry->aformat = sc->ip->i_af.if_format;
1611 	),
1612 	TP_printk("dev %d:%d ino 0x%llx disize 0x%llx nblocks 0x%llx flags 0x%x flags2 0x%llx nextents %u format %u anextents %u aformat %u",
1613 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1614 		  __entry->ino,
1615 		  __entry->size,
1616 		  __entry->nblocks,
1617 		  __entry->flags,
1618 		  __entry->flags2,
1619 		  __entry->nextents,
1620 		  __entry->format,
1621 		  __entry->anextents,
1622 		  __entry->aformat)
1623 )
1624 
1625 #define DEFINE_REPAIR_INODE_EVENT(name) \
1626 DEFINE_EVENT(xrep_inode_class, name, \
1627 	TP_PROTO(struct xfs_scrub *sc), \
1628 	TP_ARGS(sc))
1629 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockcounts);
1630 DEFINE_REPAIR_INODE_EVENT(xrep_inode_ids);
1631 DEFINE_REPAIR_INODE_EVENT(xrep_inode_flags);
1632 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockdir_size);
1633 DEFINE_REPAIR_INODE_EVENT(xrep_inode_sfdir_size);
1634 DEFINE_REPAIR_INODE_EVENT(xrep_inode_dir_size);
1635 DEFINE_REPAIR_INODE_EVENT(xrep_inode_fixed);
1636 
1637 TRACE_EVENT(xrep_dinode_count_rmaps,
1638 	TP_PROTO(struct xfs_scrub *sc, xfs_rfsblock_t data_blocks,
1639 		xfs_rfsblock_t rt_blocks, xfs_rfsblock_t attr_blocks,
1640 		xfs_extnum_t data_extents, xfs_extnum_t rt_extents,
1641 		xfs_aextnum_t attr_extents),
1642 	TP_ARGS(sc, data_blocks, rt_blocks, attr_blocks, data_extents,
1643 		rt_extents, attr_extents),
1644 	TP_STRUCT__entry(
1645 		__field(dev_t, dev)
1646 		__field(xfs_ino_t, ino)
1647 		__field(xfs_rfsblock_t, data_blocks)
1648 		__field(xfs_rfsblock_t, rt_blocks)
1649 		__field(xfs_rfsblock_t, attr_blocks)
1650 		__field(xfs_extnum_t, data_extents)
1651 		__field(xfs_extnum_t, rt_extents)
1652 		__field(xfs_aextnum_t, attr_extents)
1653 	),
1654 	TP_fast_assign(
1655 		__entry->dev = sc->mp->m_super->s_dev;
1656 		__entry->ino = sc->sm->sm_ino;
1657 		__entry->data_blocks = data_blocks;
1658 		__entry->rt_blocks = rt_blocks;
1659 		__entry->attr_blocks = attr_blocks;
1660 		__entry->data_extents = data_extents;
1661 		__entry->rt_extents = rt_extents;
1662 		__entry->attr_extents = attr_extents;
1663 	),
1664 	TP_printk("dev %d:%d ino 0x%llx dblocks 0x%llx rtblocks 0x%llx ablocks 0x%llx dextents %llu rtextents %llu aextents %u",
1665 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1666 		  __entry->ino,
1667 		  __entry->data_blocks,
1668 		  __entry->rt_blocks,
1669 		  __entry->attr_blocks,
1670 		  __entry->data_extents,
1671 		  __entry->rt_extents,
1672 		  __entry->attr_extents)
1673 );
1674 
1675 TRACE_EVENT(xrep_cow_mark_file_range,
1676 	TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t startblock,
1677 		 xfs_fileoff_t startoff, xfs_filblks_t blockcount),
1678 	TP_ARGS(ip, startblock, startoff, blockcount),
1679 	TP_STRUCT__entry(
1680 		__field(dev_t, dev)
1681 		__field(xfs_ino_t, ino)
1682 		__field(xfs_fsblock_t, startblock)
1683 		__field(xfs_fileoff_t, startoff)
1684 		__field(xfs_filblks_t, blockcount)
1685 	),
1686 	TP_fast_assign(
1687 		__entry->dev = ip->i_mount->m_super->s_dev;
1688 		__entry->ino = ip->i_ino;
1689 		__entry->startoff = startoff;
1690 		__entry->startblock = startblock;
1691 		__entry->blockcount = blockcount;
1692 	),
1693 	TP_printk("dev %d:%d ino 0x%llx fileoff 0x%llx startblock 0x%llx fsbcount 0x%llx",
1694 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1695 		  __entry->ino,
1696 		  __entry->startoff,
1697 		  __entry->startblock,
1698 		  __entry->blockcount)
1699 );
1700 
1701 TRACE_EVENT(xrep_cow_replace_mapping,
1702 	TP_PROTO(struct xfs_inode *ip, const struct xfs_bmbt_irec *irec,
1703 		 xfs_fsblock_t new_startblock, xfs_extlen_t new_blockcount),
1704 	TP_ARGS(ip, irec, new_startblock, new_blockcount),
1705 	TP_STRUCT__entry(
1706 		__field(dev_t, dev)
1707 		__field(xfs_ino_t, ino)
1708 		__field(xfs_fsblock_t, startblock)
1709 		__field(xfs_fileoff_t, startoff)
1710 		__field(xfs_filblks_t, blockcount)
1711 		__field(xfs_exntst_t, state)
1712 		__field(xfs_fsblock_t, new_startblock)
1713 		__field(xfs_extlen_t, new_blockcount)
1714 	),
1715 	TP_fast_assign(
1716 		__entry->dev = ip->i_mount->m_super->s_dev;
1717 		__entry->ino = ip->i_ino;
1718 		__entry->startoff = irec->br_startoff;
1719 		__entry->startblock = irec->br_startblock;
1720 		__entry->blockcount = irec->br_blockcount;
1721 		__entry->state = irec->br_state;
1722 		__entry->new_startblock = new_startblock;
1723 		__entry->new_blockcount = new_blockcount;
1724 	),
1725 	TP_printk("dev %d:%d ino 0x%llx startoff 0x%llx startblock 0x%llx fsbcount 0x%llx state 0x%x new_startblock 0x%llx new_fsbcount 0x%x",
1726 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1727 		  __entry->ino,
1728 		  __entry->startoff,
1729 		  __entry->startblock,
1730 		  __entry->blockcount,
1731 		  __entry->state,
1732 		  __entry->new_startblock,
1733 		  __entry->new_blockcount)
1734 );
1735 
1736 TRACE_EVENT(xrep_cow_free_staging,
1737 	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno,
1738 		 xfs_extlen_t blockcount),
1739 	TP_ARGS(pag, agbno, blockcount),
1740 	TP_STRUCT__entry(
1741 		__field(dev_t, dev)
1742 		__field(xfs_agnumber_t, agno)
1743 		__field(xfs_agblock_t, agbno)
1744 		__field(xfs_extlen_t, blockcount)
1745 	),
1746 	TP_fast_assign(
1747 		__entry->dev = pag->pag_mount->m_super->s_dev;
1748 		__entry->agno = pag->pag_agno;
1749 		__entry->agbno = agbno;
1750 		__entry->blockcount = blockcount;
1751 	),
1752 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1753 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1754 		  __entry->agno,
1755 		  __entry->agbno,
1756 		  __entry->blockcount)
1757 );
1758 
1759 #ifdef CONFIG_XFS_QUOTA
1760 DECLARE_EVENT_CLASS(xrep_dquot_class,
1761 	TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id),
1762 	TP_ARGS(mp, type, id),
1763 	TP_STRUCT__entry(
1764 		__field(dev_t, dev)
1765 		__field(uint8_t, type)
1766 		__field(uint32_t, id)
1767 	),
1768 	TP_fast_assign(
1769 		__entry->dev = mp->m_super->s_dev;
1770 		__entry->id = id;
1771 		__entry->type = type;
1772 	),
1773 	TP_printk("dev %d:%d type %s id 0x%x",
1774 		  MAJOR(__entry->dev), MINOR(__entry->dev),
1775 		  __print_flags(__entry->type, "|", XFS_DQTYPE_STRINGS),
1776 		  __entry->id)
1777 );
1778 
1779 #define DEFINE_XREP_DQUOT_EVENT(name) \
1780 DEFINE_EVENT(xrep_dquot_class, name, \
1781 	TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id), \
1782 	TP_ARGS(mp, type, id))
1783 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item);
1784 DEFINE_XREP_DQUOT_EVENT(xrep_disk_dquot);
1785 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item_fill_bmap_hole);
1786 #endif /* CONFIG_XFS_QUOTA */
1787 
1788 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
1789 
1790 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
1791 
1792 #undef TRACE_INCLUDE_PATH
1793 #define TRACE_INCLUDE_PATH .
1794 #define TRACE_INCLUDE_FILE scrub/trace
1795 #include <trace/define_trace.h>
1796