xref: /kernel/linux/linux-6.6/fs/xfs/scrub/trace.h (revision 62306a36)
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
19struct xfile;
20struct xfarray;
21struct 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 */
29TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi);
30TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi);
31TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi);
32TRACE_DEFINE_ENUM(XFS_BTNUM_INOi);
33TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
34TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
35TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
36
37TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
38TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
39
40TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
41TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
42TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
43TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
44TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
45TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
46TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
47TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
48TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
49TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
50TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
51TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
52TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
53TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
54TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
55TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
56TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
57TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
58TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
59TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
60TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
61TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
62TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
63TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
64TRACE_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
111DECLARE_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) \
146DEFINE_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
151DEFINE_SCRUB_EVENT(xchk_start);
152DEFINE_SCRUB_EVENT(xchk_done);
153DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
154DEFINE_SCRUB_EVENT(xrep_attempt);
155DEFINE_SCRUB_EVENT(xrep_done);
156
157DECLARE_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) \
177DEFINE_EVENT(xchk_fsgate_class, name, \
178	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
179	TP_ARGS(sc, fsgates_flags))
180
181DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
182DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
183
184TRACE_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
213TRACE_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
245DECLARE_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) \
271DEFINE_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
276DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
277DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
278DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
279
280DECLARE_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) \
303DEFINE_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
308DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
309DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
310DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
311
312DECLARE_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) \
342DEFINE_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
347DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
348DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
349
350TRACE_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
369TRACE_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
409TRACE_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
454TRACE_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
490TRACE_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
532DECLARE_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) \
569DEFINE_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
574DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
575DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
576
577TRACE_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
599TRACE_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
644TRACE_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
666TRACE_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
701TRACE_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
724DECLARE_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) \
743DEFINE_EVENT(xchk_fsfreeze_class, name, \
744	TP_PROTO(struct xfs_scrub *sc, int error), \
745	TP_ARGS(sc, error))
746DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
747DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
748
749TRACE_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
781TRACE_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
805TRACE_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
833DECLARE_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) \
867DEFINE_EVENT(xfile_class, name, \
868	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
869	TP_ARGS(xf, pos, bytecount))
870DEFINE_XFILE_EVENT(xfile_pread);
871DEFINE_XFILE_EVENT(xfile_pwrite);
872DEFINE_XFILE_EVENT(xfile_seek_data);
873DEFINE_XFILE_EVENT(xfile_get_page);
874DEFINE_XFILE_EVENT(xfile_put_page);
875
876TRACE_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
901TRACE_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
921TRACE_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
941TRACE_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
967TRACE_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
992TRACE_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
1038TRACE_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
1074DECLARE_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) \
1096DEFINE_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))
1099DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1100DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1101DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1102DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1103
1104DECLARE_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) \
1130DEFINE_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))
1134DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1135
1136DECLARE_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) \
1169DEFINE_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))
1174DEFINE_REPAIR_RMAP_EVENT(xrep_alloc_extent_fn);
1175DEFINE_REPAIR_RMAP_EVENT(xrep_ialloc_extent_fn);
1176DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn);
1177DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_extent_fn);
1178
1179TRACE_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
1205TRACE_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)
1230TRACE_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)
1259TRACE_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)
1288TRACE_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
1301TRACE_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