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#include "xfs_quota_defs.h"
19
20struct xfs_scrub;
21struct xfile;
22struct xfarray;
23struct xfarray_sortinfo;
24struct xchk_dqiter;
25struct xchk_iscan;
26struct xchk_nlink;
27struct xchk_fscounters;
28struct xfs_rmap_update_params;
29struct xfs_parent_rec;
30enum xchk_dirpath_outcome;
31struct xchk_dirtree;
32struct xchk_dirtree_outcomes;
33
34/*
35 * ftrace's __print_symbolic requires that all enum values be wrapped in the
36 * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
37 * ring buffer.  Somehow this was only worth mentioning in the ftrace sample
38 * code.
39 */
40TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
41TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
42
43TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
44TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
45TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
46TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
47TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
48TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
49TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
50TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
51TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
52TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
53TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
54TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
55TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
56TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
57TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
58TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
59TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
60TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
61TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
62TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
63TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
64TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
65TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
66TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
67TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
68TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_QUOTACHECK);
69TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_NLINKS);
70TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_HEALTHY);
71TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIRTREE);
72TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BARRIER);
73
74#define XFS_SCRUB_TYPE_STRINGS \
75	{ XFS_SCRUB_TYPE_PROBE,		"probe" }, \
76	{ XFS_SCRUB_TYPE_SB,		"sb" }, \
77	{ XFS_SCRUB_TYPE_AGF,		"agf" }, \
78	{ XFS_SCRUB_TYPE_AGFL,		"agfl" }, \
79	{ XFS_SCRUB_TYPE_AGI,		"agi" }, \
80	{ XFS_SCRUB_TYPE_BNOBT,		"bnobt" }, \
81	{ XFS_SCRUB_TYPE_CNTBT,		"cntbt" }, \
82	{ XFS_SCRUB_TYPE_INOBT,		"inobt" }, \
83	{ XFS_SCRUB_TYPE_FINOBT,	"finobt" }, \
84	{ XFS_SCRUB_TYPE_RMAPBT,	"rmapbt" }, \
85	{ XFS_SCRUB_TYPE_REFCNTBT,	"refcountbt" }, \
86	{ XFS_SCRUB_TYPE_INODE,		"inode" }, \
87	{ XFS_SCRUB_TYPE_BMBTD,		"bmapbtd" }, \
88	{ XFS_SCRUB_TYPE_BMBTA,		"bmapbta" }, \
89	{ XFS_SCRUB_TYPE_BMBTC,		"bmapbtc" }, \
90	{ XFS_SCRUB_TYPE_DIR,		"directory" }, \
91	{ XFS_SCRUB_TYPE_XATTR,		"xattr" }, \
92	{ XFS_SCRUB_TYPE_SYMLINK,	"symlink" }, \
93	{ XFS_SCRUB_TYPE_PARENT,	"parent" }, \
94	{ XFS_SCRUB_TYPE_RTBITMAP,	"rtbitmap" }, \
95	{ XFS_SCRUB_TYPE_RTSUM,		"rtsummary" }, \
96	{ XFS_SCRUB_TYPE_UQUOTA,	"usrquota" }, \
97	{ XFS_SCRUB_TYPE_GQUOTA,	"grpquota" }, \
98	{ XFS_SCRUB_TYPE_PQUOTA,	"prjquota" }, \
99	{ XFS_SCRUB_TYPE_FSCOUNTERS,	"fscounters" }, \
100	{ XFS_SCRUB_TYPE_QUOTACHECK,	"quotacheck" }, \
101	{ XFS_SCRUB_TYPE_NLINKS,	"nlinks" }, \
102	{ XFS_SCRUB_TYPE_HEALTHY,	"healthy" }, \
103	{ XFS_SCRUB_TYPE_DIRTREE,	"dirtree" }, \
104	{ XFS_SCRUB_TYPE_BARRIER,	"barrier" }
105
106#define XFS_SCRUB_FLAG_STRINGS \
107	{ XFS_SCRUB_IFLAG_REPAIR,		"repair" }, \
108	{ XFS_SCRUB_OFLAG_CORRUPT,		"corrupt" }, \
109	{ XFS_SCRUB_OFLAG_PREEN,		"preen" }, \
110	{ XFS_SCRUB_OFLAG_XFAIL,		"xfail" }, \
111	{ XFS_SCRUB_OFLAG_XCORRUPT,		"xcorrupt" }, \
112	{ XFS_SCRUB_OFLAG_INCOMPLETE,		"incomplete" }, \
113	{ XFS_SCRUB_OFLAG_WARNING,		"warning" }, \
114	{ XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED,	"norepair" }, \
115	{ XFS_SCRUB_IFLAG_FORCE_REBUILD,	"rebuild" }
116
117#define XFS_SCRUB_STATE_STRINGS \
118	{ XCHK_TRY_HARDER,			"try_harder" }, \
119	{ XCHK_HAVE_FREEZE_PROT,		"nofreeze" }, \
120	{ XCHK_FSGATES_DRAIN,			"fsgates_drain" }, \
121	{ XCHK_NEED_DRAIN,			"need_drain" }, \
122	{ XCHK_FSGATES_QUOTA,			"fsgates_quota" }, \
123	{ XCHK_FSGATES_DIRENTS,			"fsgates_dirents" }, \
124	{ XCHK_FSGATES_RMAP,			"fsgates_rmap" }, \
125	{ XREP_RESET_PERAG_RESV,		"reset_perag_resv" }, \
126	{ XREP_ALREADY_FIXED,			"already_fixed" }
127
128TRACE_DEFINE_ENUM(XFS_RMAP_MAP);
129TRACE_DEFINE_ENUM(XFS_RMAP_MAP_SHARED);
130TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP);
131TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP_SHARED);
132TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT);
133TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT_SHARED);
134TRACE_DEFINE_ENUM(XFS_RMAP_ALLOC);
135TRACE_DEFINE_ENUM(XFS_RMAP_FREE);
136
137DECLARE_EVENT_CLASS(xchk_class,
138	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
139		 int error),
140	TP_ARGS(ip, sm, error),
141	TP_STRUCT__entry(
142		__field(dev_t, dev)
143		__field(xfs_ino_t, ino)
144		__field(unsigned int, type)
145		__field(xfs_agnumber_t, agno)
146		__field(xfs_ino_t, inum)
147		__field(unsigned int, gen)
148		__field(unsigned int, flags)
149		__field(int, error)
150	),
151	TP_fast_assign(
152		__entry->dev = ip->i_mount->m_super->s_dev;
153		__entry->ino = ip->i_ino;
154		__entry->type = sm->sm_type;
155		__entry->agno = sm->sm_agno;
156		__entry->inum = sm->sm_ino;
157		__entry->gen = sm->sm_gen;
158		__entry->flags = sm->sm_flags;
159		__entry->error = error;
160	),
161	TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
162		  MAJOR(__entry->dev), MINOR(__entry->dev),
163		  __entry->ino,
164		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
165		  __entry->agno,
166		  __entry->inum,
167		  __entry->gen,
168		  __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
169		  __entry->error)
170)
171#define DEFINE_SCRUB_EVENT(name) \
172DEFINE_EVENT(xchk_class, name, \
173	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
174		 int error), \
175	TP_ARGS(ip, sm, error))
176
177DEFINE_SCRUB_EVENT(xchk_start);
178DEFINE_SCRUB_EVENT(xchk_done);
179DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
180DEFINE_SCRUB_EVENT(xchk_dirtree_start);
181DEFINE_SCRUB_EVENT(xchk_dirtree_done);
182DEFINE_SCRUB_EVENT(xrep_attempt);
183DEFINE_SCRUB_EVENT(xrep_done);
184
185DECLARE_EVENT_CLASS(xchk_fsgate_class,
186	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
187	TP_ARGS(sc, fsgate_flags),
188	TP_STRUCT__entry(
189		__field(dev_t, dev)
190		__field(unsigned int, type)
191		__field(unsigned int, fsgate_flags)
192	),
193	TP_fast_assign(
194		__entry->dev = sc->mp->m_super->s_dev;
195		__entry->type = sc->sm->sm_type;
196		__entry->fsgate_flags = fsgate_flags;
197	),
198	TP_printk("dev %d:%d type %s fsgates '%s'",
199		  MAJOR(__entry->dev), MINOR(__entry->dev),
200		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
201		  __print_flags(__entry->fsgate_flags, "|", XFS_SCRUB_STATE_STRINGS))
202)
203
204#define DEFINE_SCRUB_FSHOOK_EVENT(name) \
205DEFINE_EVENT(xchk_fsgate_class, name, \
206	TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
207	TP_ARGS(sc, fsgates_flags))
208
209DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
210DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
211
212DECLARE_EVENT_CLASS(xchk_vector_head_class,
213	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead),
214	TP_ARGS(ip, vhead),
215	TP_STRUCT__entry(
216		__field(dev_t, dev)
217		__field(xfs_ino_t, ino)
218		__field(xfs_agnumber_t, agno)
219		__field(xfs_ino_t, inum)
220		__field(unsigned int, gen)
221		__field(unsigned int, flags)
222		__field(unsigned short, rest_us)
223		__field(unsigned short, nr_vecs)
224	),
225	TP_fast_assign(
226		__entry->dev = ip->i_mount->m_super->s_dev;
227		__entry->ino = ip->i_ino;
228		__entry->agno = vhead->svh_agno;
229		__entry->inum = vhead->svh_ino;
230		__entry->gen = vhead->svh_gen;
231		__entry->flags = vhead->svh_flags;
232		__entry->rest_us = vhead->svh_rest_us;
233		__entry->nr_vecs = vhead->svh_nr;
234	),
235	TP_printk("dev %d:%d ino 0x%llx agno 0x%x inum 0x%llx gen 0x%x flags 0x%x rest_us %u nr_vecs %u",
236		  MAJOR(__entry->dev), MINOR(__entry->dev),
237		  __entry->ino,
238		  __entry->agno,
239		  __entry->inum,
240		  __entry->gen,
241		  __entry->flags,
242		  __entry->rest_us,
243		  __entry->nr_vecs)
244)
245#define DEFINE_SCRUBV_HEAD_EVENT(name) \
246DEFINE_EVENT(xchk_vector_head_class, name, \
247	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead), \
248	TP_ARGS(ip, vhead))
249
250DEFINE_SCRUBV_HEAD_EVENT(xchk_scrubv_start);
251
252DECLARE_EVENT_CLASS(xchk_vector_class,
253	TP_PROTO(struct xfs_mount *mp, struct xfs_scrub_vec_head *vhead,
254		 unsigned int vec_nr, struct xfs_scrub_vec *v),
255	TP_ARGS(mp, vhead, vec_nr, v),
256	TP_STRUCT__entry(
257		__field(dev_t, dev)
258		__field(unsigned int, vec_nr)
259		__field(unsigned int, vec_type)
260		__field(unsigned int, vec_flags)
261		__field(int, vec_ret)
262	),
263	TP_fast_assign(
264		__entry->dev = mp->m_super->s_dev;
265		__entry->vec_nr = vec_nr;
266		__entry->vec_type = v->sv_type;
267		__entry->vec_flags = v->sv_flags;
268		__entry->vec_ret = v->sv_ret;
269	),
270	TP_printk("dev %d:%d vec[%u] type %s flags %s ret %d",
271		  MAJOR(__entry->dev), MINOR(__entry->dev),
272		  __entry->vec_nr,
273		  __print_symbolic(__entry->vec_type, XFS_SCRUB_TYPE_STRINGS),
274		  __print_flags(__entry->vec_flags, "|", XFS_SCRUB_FLAG_STRINGS),
275		  __entry->vec_ret)
276)
277#define DEFINE_SCRUBV_EVENT(name) \
278DEFINE_EVENT(xchk_vector_class, name, \
279	TP_PROTO(struct xfs_mount *mp, struct xfs_scrub_vec_head *vhead, \
280		 unsigned int vec_nr, struct xfs_scrub_vec *v), \
281	TP_ARGS(mp, vhead, vec_nr, v))
282
283DEFINE_SCRUBV_EVENT(xchk_scrubv_barrier_fail);
284DEFINE_SCRUBV_EVENT(xchk_scrubv_item);
285DEFINE_SCRUBV_EVENT(xchk_scrubv_outcome);
286
287TRACE_EVENT(xchk_op_error,
288	TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
289		 xfs_agblock_t bno, int error, void *ret_ip),
290	TP_ARGS(sc, agno, bno, error, ret_ip),
291	TP_STRUCT__entry(
292		__field(dev_t, dev)
293		__field(unsigned int, type)
294		__field(xfs_agnumber_t, agno)
295		__field(xfs_agblock_t, bno)
296		__field(int, error)
297		__field(void *, ret_ip)
298	),
299	TP_fast_assign(
300		__entry->dev = sc->mp->m_super->s_dev;
301		__entry->type = sc->sm->sm_type;
302		__entry->agno = agno;
303		__entry->bno = bno;
304		__entry->error = error;
305		__entry->ret_ip = ret_ip;
306	),
307	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
308		  MAJOR(__entry->dev), MINOR(__entry->dev),
309		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
310		  __entry->agno,
311		  __entry->bno,
312		  __entry->error,
313		  __entry->ret_ip)
314);
315
316TRACE_EVENT(xchk_file_op_error,
317	TP_PROTO(struct xfs_scrub *sc, int whichfork,
318		 xfs_fileoff_t offset, int error, void *ret_ip),
319	TP_ARGS(sc, whichfork, offset, error, ret_ip),
320	TP_STRUCT__entry(
321		__field(dev_t, dev)
322		__field(xfs_ino_t, ino)
323		__field(int, whichfork)
324		__field(unsigned int, type)
325		__field(xfs_fileoff_t, offset)
326		__field(int, error)
327		__field(void *, ret_ip)
328	),
329	TP_fast_assign(
330		__entry->dev = sc->ip->i_mount->m_super->s_dev;
331		__entry->ino = sc->ip->i_ino;
332		__entry->whichfork = whichfork;
333		__entry->type = sc->sm->sm_type;
334		__entry->offset = offset;
335		__entry->error = error;
336		__entry->ret_ip = ret_ip;
337	),
338	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
339		  MAJOR(__entry->dev), MINOR(__entry->dev),
340		  __entry->ino,
341		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
342		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
343		  __entry->offset,
344		  __entry->error,
345		  __entry->ret_ip)
346);
347
348DECLARE_EVENT_CLASS(xchk_block_error_class,
349	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
350	TP_ARGS(sc, daddr, ret_ip),
351	TP_STRUCT__entry(
352		__field(dev_t, dev)
353		__field(unsigned int, type)
354		__field(xfs_agnumber_t, agno)
355		__field(xfs_agblock_t, agbno)
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->agno = xfs_daddr_to_agno(sc->mp, daddr);
362		__entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
363		__entry->ret_ip = ret_ip;
364	),
365	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
366		  MAJOR(__entry->dev), MINOR(__entry->dev),
367		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
368		  __entry->agno,
369		  __entry->agbno,
370		  __entry->ret_ip)
371)
372
373#define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
374DEFINE_EVENT(xchk_block_error_class, name, \
375	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
376		 void *ret_ip), \
377	TP_ARGS(sc, daddr, ret_ip))
378
379DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
380DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
381DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
382
383DECLARE_EVENT_CLASS(xchk_ino_error_class,
384	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
385	TP_ARGS(sc, ino, ret_ip),
386	TP_STRUCT__entry(
387		__field(dev_t, dev)
388		__field(xfs_ino_t, ino)
389		__field(unsigned int, type)
390		__field(void *, ret_ip)
391	),
392	TP_fast_assign(
393		__entry->dev = sc->mp->m_super->s_dev;
394		__entry->ino = ino;
395		__entry->type = sc->sm->sm_type;
396		__entry->ret_ip = ret_ip;
397	),
398	TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
399		  MAJOR(__entry->dev), MINOR(__entry->dev),
400		  __entry->ino,
401		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
402		  __entry->ret_ip)
403)
404
405#define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
406DEFINE_EVENT(xchk_ino_error_class, name, \
407	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
408		 void *ret_ip), \
409	TP_ARGS(sc, ino, ret_ip))
410
411DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
412DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
413DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
414
415DECLARE_EVENT_CLASS(xchk_fblock_error_class,
416	TP_PROTO(struct xfs_scrub *sc, int whichfork,
417		 xfs_fileoff_t offset, void *ret_ip),
418	TP_ARGS(sc, whichfork, offset, ret_ip),
419	TP_STRUCT__entry(
420		__field(dev_t, dev)
421		__field(xfs_ino_t, ino)
422		__field(int, whichfork)
423		__field(unsigned int, type)
424		__field(xfs_fileoff_t, offset)
425		__field(void *, ret_ip)
426	),
427	TP_fast_assign(
428		__entry->dev = sc->ip->i_mount->m_super->s_dev;
429		__entry->ino = sc->ip->i_ino;
430		__entry->whichfork = whichfork;
431		__entry->type = sc->sm->sm_type;
432		__entry->offset = offset;
433		__entry->ret_ip = ret_ip;
434	),
435	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
436		  MAJOR(__entry->dev), MINOR(__entry->dev),
437		  __entry->ino,
438		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
439		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
440		  __entry->offset,
441		  __entry->ret_ip)
442);
443
444#define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
445DEFINE_EVENT(xchk_fblock_error_class, name, \
446	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
447		 xfs_fileoff_t offset, void *ret_ip), \
448	TP_ARGS(sc, whichfork, offset, ret_ip))
449
450DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
451DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
452DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_preen);
453
454#ifdef CONFIG_XFS_QUOTA
455DECLARE_EVENT_CLASS(xchk_dqiter_class,
456	TP_PROTO(struct xchk_dqiter *cursor, uint64_t id),
457	TP_ARGS(cursor, id),
458	TP_STRUCT__entry(
459		__field(dev_t, dev)
460		__field(xfs_dqtype_t, dqtype)
461		__field(xfs_ino_t, ino)
462		__field(unsigned long long, cur_id)
463		__field(unsigned long long, id)
464		__field(xfs_fileoff_t, startoff)
465		__field(xfs_fsblock_t, startblock)
466		__field(xfs_filblks_t, blockcount)
467		__field(xfs_exntst_t, state)
468	),
469	TP_fast_assign(
470		__entry->dev = cursor->sc->ip->i_mount->m_super->s_dev;
471		__entry->dqtype = cursor->dqtype;
472		__entry->ino = cursor->quota_ip->i_ino;
473		__entry->cur_id = cursor->id;
474		__entry->startoff = cursor->bmap.br_startoff;
475		__entry->startblock = cursor->bmap.br_startblock;
476		__entry->blockcount = cursor->bmap.br_blockcount;
477		__entry->state = cursor->bmap.br_state;
478		__entry->id = id;
479	),
480	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",
481		  MAJOR(__entry->dev), MINOR(__entry->dev),
482		  __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
483		  __entry->ino,
484		  __entry->cur_id,
485		  __entry->startoff,
486		  __entry->startblock,
487		  __entry->blockcount,
488		  __entry->state,
489		  __entry->id)
490);
491
492#define DEFINE_SCRUB_DQITER_EVENT(name) \
493DEFINE_EVENT(xchk_dqiter_class, name, \
494	TP_PROTO(struct xchk_dqiter *cursor, uint64_t id), \
495	TP_ARGS(cursor, id))
496DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_revalidate_bmap);
497DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_bmap);
498DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_incore);
499DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter);
500
501TRACE_EVENT(xchk_qcheck_error,
502	TP_PROTO(struct xfs_scrub *sc, xfs_dqtype_t dqtype, xfs_dqid_t id,
503		 void *ret_ip),
504	TP_ARGS(sc, dqtype, id, ret_ip),
505	TP_STRUCT__entry(
506		__field(dev_t, dev)
507		__field(xfs_dqtype_t, dqtype)
508		__field(xfs_dqid_t, id)
509		__field(void *, ret_ip)
510	),
511	TP_fast_assign(
512		__entry->dev = sc->mp->m_super->s_dev;
513		__entry->dqtype = dqtype;
514		__entry->id = id;
515		__entry->ret_ip = ret_ip;
516	),
517	TP_printk("dev %d:%d dquot type %s id 0x%x ret_ip %pS",
518		  MAJOR(__entry->dev), MINOR(__entry->dev),
519		  __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
520		  __entry->id,
521		  __entry->ret_ip)
522);
523#endif /* CONFIG_XFS_QUOTA */
524
525TRACE_EVENT(xchk_incomplete,
526	TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
527	TP_ARGS(sc, ret_ip),
528	TP_STRUCT__entry(
529		__field(dev_t, dev)
530		__field(unsigned int, type)
531		__field(void *, ret_ip)
532	),
533	TP_fast_assign(
534		__entry->dev = sc->mp->m_super->s_dev;
535		__entry->type = sc->sm->sm_type;
536		__entry->ret_ip = ret_ip;
537	),
538	TP_printk("dev %d:%d type %s ret_ip %pS",
539		  MAJOR(__entry->dev), MINOR(__entry->dev),
540		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
541		  __entry->ret_ip)
542);
543
544TRACE_EVENT(xchk_btree_op_error,
545	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
546		 int level, int error, void *ret_ip),
547	TP_ARGS(sc, cur, level, error, ret_ip),
548	TP_STRUCT__entry(
549		__field(dev_t, dev)
550		__field(unsigned int, type)
551		__string(name, cur->bc_ops->name)
552		__field(int, level)
553		__field(xfs_agnumber_t, agno)
554		__field(xfs_agblock_t, bno)
555		__field(int, ptr)
556		__field(int, error)
557		__field(void *, ret_ip)
558	),
559	TP_fast_assign(
560		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
561
562		__entry->dev = sc->mp->m_super->s_dev;
563		__entry->type = sc->sm->sm_type;
564		__assign_str(name);
565		__entry->level = level;
566		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
567		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
568		__entry->ptr = cur->bc_levels[level].ptr;
569		__entry->error = error;
570		__entry->ret_ip = ret_ip;
571	),
572	TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
573		  MAJOR(__entry->dev), MINOR(__entry->dev),
574		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
575		  __get_str(name),
576		  __entry->level,
577		  __entry->ptr,
578		  __entry->agno,
579		  __entry->bno,
580		  __entry->error,
581		  __entry->ret_ip)
582);
583
584TRACE_EVENT(xchk_ifork_btree_op_error,
585	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
586		 int level, int error, void *ret_ip),
587	TP_ARGS(sc, cur, level, error, ret_ip),
588	TP_STRUCT__entry(
589		__field(dev_t, dev)
590		__field(xfs_ino_t, ino)
591		__field(int, whichfork)
592		__field(unsigned int, type)
593		__string(name, cur->bc_ops->name)
594		__field(int, level)
595		__field(int, ptr)
596		__field(xfs_agnumber_t, agno)
597		__field(xfs_agblock_t, bno)
598		__field(int, error)
599		__field(void *, ret_ip)
600	),
601	TP_fast_assign(
602		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
603		__entry->dev = sc->mp->m_super->s_dev;
604		__entry->ino = sc->ip->i_ino;
605		__entry->whichfork = cur->bc_ino.whichfork;
606		__entry->type = sc->sm->sm_type;
607		__assign_str(name);
608		__entry->level = level;
609		__entry->ptr = cur->bc_levels[level].ptr;
610		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
611		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
612		__entry->error = error;
613		__entry->ret_ip = ret_ip;
614	),
615	TP_printk("dev %d:%d ino 0x%llx fork %s type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
616		  MAJOR(__entry->dev), MINOR(__entry->dev),
617		  __entry->ino,
618		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
619		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
620		  __get_str(name),
621		  __entry->level,
622		  __entry->ptr,
623		  __entry->agno,
624		  __entry->bno,
625		  __entry->error,
626		  __entry->ret_ip)
627);
628
629TRACE_EVENT(xchk_btree_error,
630	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
631		 int level, void *ret_ip),
632	TP_ARGS(sc, cur, level, ret_ip),
633	TP_STRUCT__entry(
634		__field(dev_t, dev)
635		__field(unsigned int, type)
636		__string(name, cur->bc_ops->name)
637		__field(int, level)
638		__field(xfs_agnumber_t, agno)
639		__field(xfs_agblock_t, bno)
640		__field(int, ptr)
641		__field(void *, ret_ip)
642	),
643	TP_fast_assign(
644		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
645		__entry->dev = sc->mp->m_super->s_dev;
646		__entry->type = sc->sm->sm_type;
647		__assign_str(name);
648		__entry->level = level;
649		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
650		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
651		__entry->ptr = cur->bc_levels[level].ptr;
652		__entry->ret_ip = ret_ip;
653	),
654	TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
655		  MAJOR(__entry->dev), MINOR(__entry->dev),
656		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
657		  __get_str(name),
658		  __entry->level,
659		  __entry->ptr,
660		  __entry->agno,
661		  __entry->bno,
662		  __entry->ret_ip)
663);
664
665TRACE_EVENT(xchk_ifork_btree_error,
666	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
667		 int level, void *ret_ip),
668	TP_ARGS(sc, cur, level, ret_ip),
669	TP_STRUCT__entry(
670		__field(dev_t, dev)
671		__field(xfs_ino_t, ino)
672		__field(int, whichfork)
673		__field(unsigned int, type)
674		__string(name, cur->bc_ops->name)
675		__field(int, level)
676		__field(xfs_agnumber_t, agno)
677		__field(xfs_agblock_t, bno)
678		__field(int, ptr)
679		__field(void *, ret_ip)
680	),
681	TP_fast_assign(
682		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
683		__entry->dev = sc->mp->m_super->s_dev;
684		__entry->ino = sc->ip->i_ino;
685		__entry->whichfork = cur->bc_ino.whichfork;
686		__entry->type = sc->sm->sm_type;
687		__assign_str(name);
688		__entry->level = level;
689		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
690		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
691		__entry->ptr = cur->bc_levels[level].ptr;
692		__entry->ret_ip = ret_ip;
693	),
694	TP_printk("dev %d:%d ino 0x%llx fork %s type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
695		  MAJOR(__entry->dev), MINOR(__entry->dev),
696		  __entry->ino,
697		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
698		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
699		  __get_str(name),
700		  __entry->level,
701		  __entry->ptr,
702		  __entry->agno,
703		  __entry->bno,
704		  __entry->ret_ip)
705);
706
707DECLARE_EVENT_CLASS(xchk_sbtree_class,
708	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
709		 int level),
710	TP_ARGS(sc, cur, level),
711	TP_STRUCT__entry(
712		__field(dev_t, dev)
713		__field(int, type)
714		__string(name, cur->bc_ops->name)
715		__field(xfs_agnumber_t, agno)
716		__field(xfs_agblock_t, bno)
717		__field(int, level)
718		__field(int, nlevels)
719		__field(int, ptr)
720	),
721	TP_fast_assign(
722		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
723
724		__entry->dev = sc->mp->m_super->s_dev;
725		__entry->type = sc->sm->sm_type;
726		__assign_str(name);
727		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
728		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
729		__entry->level = level;
730		__entry->nlevels = cur->bc_nlevels;
731		__entry->ptr = cur->bc_levels[level].ptr;
732	),
733	TP_printk("dev %d:%d type %s %sbt agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
734		  MAJOR(__entry->dev), MINOR(__entry->dev),
735		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
736		  __get_str(name),
737		  __entry->agno,
738		  __entry->bno,
739		  __entry->level,
740		  __entry->nlevels,
741		  __entry->ptr)
742)
743#define DEFINE_SCRUB_SBTREE_EVENT(name) \
744DEFINE_EVENT(xchk_sbtree_class, name, \
745	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
746		 int level), \
747	TP_ARGS(sc, cur, level))
748
749DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
750DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
751
752TRACE_EVENT(xchk_xref_error,
753	TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
754	TP_ARGS(sc, error, ret_ip),
755	TP_STRUCT__entry(
756		__field(dev_t, dev)
757		__field(int, type)
758		__field(int, error)
759		__field(void *, ret_ip)
760	),
761	TP_fast_assign(
762		__entry->dev = sc->mp->m_super->s_dev;
763		__entry->type = sc->sm->sm_type;
764		__entry->error = error;
765		__entry->ret_ip = ret_ip;
766	),
767	TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
768		  MAJOR(__entry->dev), MINOR(__entry->dev),
769		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
770		  __entry->error,
771		  __entry->ret_ip)
772);
773
774TRACE_EVENT(xchk_iallocbt_check_cluster,
775	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
776		 xfs_agino_t startino, xfs_daddr_t map_daddr,
777		 unsigned short map_len, unsigned int chunk_ino,
778		 unsigned int nr_inodes, uint16_t cluster_mask,
779		 uint16_t holemask, unsigned int cluster_ino),
780	TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
781		cluster_mask, holemask, cluster_ino),
782	TP_STRUCT__entry(
783		__field(dev_t, dev)
784		__field(xfs_agnumber_t, agno)
785		__field(xfs_agino_t, startino)
786		__field(xfs_daddr_t, map_daddr)
787		__field(unsigned short, map_len)
788		__field(unsigned int, chunk_ino)
789		__field(unsigned int, nr_inodes)
790		__field(unsigned int, cluster_ino)
791		__field(uint16_t, cluster_mask)
792		__field(uint16_t, holemask)
793	),
794	TP_fast_assign(
795		__entry->dev = mp->m_super->s_dev;
796		__entry->agno = agno;
797		__entry->startino = startino;
798		__entry->map_daddr = map_daddr;
799		__entry->map_len = map_len;
800		__entry->chunk_ino = chunk_ino;
801		__entry->nr_inodes = nr_inodes;
802		__entry->cluster_mask = cluster_mask;
803		__entry->holemask = holemask;
804		__entry->cluster_ino = cluster_ino;
805	),
806	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",
807		  MAJOR(__entry->dev), MINOR(__entry->dev),
808		  __entry->agno,
809		  __entry->startino,
810		  __entry->map_daddr,
811		  __entry->map_len,
812		  __entry->chunk_ino,
813		  __entry->nr_inodes,
814		  __entry->cluster_mask,
815		  __entry->holemask,
816		  __entry->cluster_ino)
817)
818
819TRACE_EVENT(xchk_inode_is_allocated,
820	TP_PROTO(struct xfs_inode *ip),
821	TP_ARGS(ip),
822	TP_STRUCT__entry(
823		__field(dev_t, dev)
824		__field(xfs_ino_t, ino)
825		__field(unsigned long, iflags)
826		__field(umode_t, mode)
827	),
828	TP_fast_assign(
829		__entry->dev = VFS_I(ip)->i_sb->s_dev;
830		__entry->ino = ip->i_ino;
831		__entry->iflags = ip->i_flags;
832		__entry->mode = VFS_I(ip)->i_mode;
833	),
834	TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
835		  MAJOR(__entry->dev), MINOR(__entry->dev),
836		  __entry->ino,
837		  __entry->iflags,
838		  __entry->mode)
839);
840
841TRACE_EVENT(xchk_fscounters_calc,
842	TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
843		 uint64_t fdblocks, uint64_t delalloc),
844	TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
845	TP_STRUCT__entry(
846		__field(dev_t, dev)
847		__field(int64_t, icount_sb)
848		__field(uint64_t, icount_calculated)
849		__field(int64_t, ifree_sb)
850		__field(uint64_t, ifree_calculated)
851		__field(int64_t, fdblocks_sb)
852		__field(uint64_t, fdblocks_calculated)
853		__field(uint64_t, delalloc)
854	),
855	TP_fast_assign(
856		__entry->dev = mp->m_super->s_dev;
857		__entry->icount_sb = mp->m_sb.sb_icount;
858		__entry->icount_calculated = icount;
859		__entry->ifree_sb = mp->m_sb.sb_ifree;
860		__entry->ifree_calculated = ifree;
861		__entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
862		__entry->fdblocks_calculated = fdblocks;
863		__entry->delalloc = delalloc;
864	),
865	TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
866		  MAJOR(__entry->dev), MINOR(__entry->dev),
867		  __entry->icount_sb,
868		  __entry->icount_calculated,
869		  __entry->ifree_sb,
870		  __entry->ifree_calculated,
871		  __entry->fdblocks_sb,
872		  __entry->fdblocks_calculated,
873		  __entry->delalloc)
874)
875
876TRACE_EVENT(xchk_fscounters_within_range,
877	TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
878		 int64_t old_value),
879	TP_ARGS(mp, expected, curr_value, old_value),
880	TP_STRUCT__entry(
881		__field(dev_t, dev)
882		__field(uint64_t, expected)
883		__field(int64_t, curr_value)
884		__field(int64_t, old_value)
885	),
886	TP_fast_assign(
887		__entry->dev = mp->m_super->s_dev;
888		__entry->expected = expected;
889		__entry->curr_value = curr_value;
890		__entry->old_value = old_value;
891	),
892	TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
893		  MAJOR(__entry->dev), MINOR(__entry->dev),
894		  __entry->expected,
895		  __entry->curr_value,
896		  __entry->old_value)
897)
898
899DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
900	TP_PROTO(struct xfs_scrub *sc, int error),
901	TP_ARGS(sc, error),
902	TP_STRUCT__entry(
903		__field(dev_t, dev)
904		__field(unsigned int, type)
905		__field(int, error)
906	),
907	TP_fast_assign(
908		__entry->dev = sc->mp->m_super->s_dev;
909		__entry->type = sc->sm->sm_type;
910		__entry->error = error;
911	),
912	TP_printk("dev %d:%d type %s error %d",
913		  MAJOR(__entry->dev), MINOR(__entry->dev),
914		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
915		  __entry->error)
916);
917#define DEFINE_XCHK_FSFREEZE_EVENT(name) \
918DEFINE_EVENT(xchk_fsfreeze_class, name, \
919	TP_PROTO(struct xfs_scrub *sc, int error), \
920	TP_ARGS(sc, error))
921DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
922DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
923
924TRACE_EVENT(xchk_refcount_incorrect,
925	TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
926		 xfs_nlink_t seen),
927	TP_ARGS(pag, irec, seen),
928	TP_STRUCT__entry(
929		__field(dev_t, dev)
930		__field(xfs_agnumber_t, agno)
931		__field(enum xfs_refc_domain, domain)
932		__field(xfs_agblock_t, startblock)
933		__field(xfs_extlen_t, blockcount)
934		__field(xfs_nlink_t, refcount)
935		__field(xfs_nlink_t, seen)
936	),
937	TP_fast_assign(
938		__entry->dev = pag->pag_mount->m_super->s_dev;
939		__entry->agno = pag->pag_agno;
940		__entry->domain = irec->rc_domain;
941		__entry->startblock = irec->rc_startblock;
942		__entry->blockcount = irec->rc_blockcount;
943		__entry->refcount = irec->rc_refcount;
944		__entry->seen = seen;
945	),
946	TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
947		  MAJOR(__entry->dev), MINOR(__entry->dev),
948		  __entry->agno,
949		  __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
950		  __entry->startblock,
951		  __entry->blockcount,
952		  __entry->refcount,
953		  __entry->seen)
954)
955
956TRACE_EVENT(xfile_create,
957	TP_PROTO(struct xfile *xf),
958	TP_ARGS(xf),
959	TP_STRUCT__entry(
960		__field(dev_t, dev)
961		__field(unsigned long, ino)
962		__array(char, pathname, 256)
963	),
964	TP_fast_assign(
965		char		pathname[257];
966		char		*path;
967
968		__entry->ino = file_inode(xf->file)->i_ino;
969		memset(pathname, 0, sizeof(pathname));
970		path = file_path(xf->file, pathname, sizeof(pathname) - 1);
971		if (IS_ERR(path))
972			path = "(unknown)";
973		strncpy(__entry->pathname, path, sizeof(__entry->pathname));
974	),
975	TP_printk("xfino 0x%lx path '%s'",
976		  __entry->ino,
977		  __entry->pathname)
978);
979
980TRACE_EVENT(xfile_destroy,
981	TP_PROTO(struct xfile *xf),
982	TP_ARGS(xf),
983	TP_STRUCT__entry(
984		__field(unsigned long, ino)
985		__field(unsigned long long, bytes)
986		__field(loff_t, size)
987	),
988	TP_fast_assign(
989		struct inode		*inode = file_inode(xf->file);
990
991		__entry->ino = inode->i_ino;
992		__entry->bytes = inode->i_blocks << SECTOR_SHIFT;
993		__entry->size = i_size_read(inode);
994	),
995	TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
996		  __entry->ino,
997		  __entry->bytes,
998		  __entry->size)
999);
1000
1001DECLARE_EVENT_CLASS(xfile_class,
1002	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
1003	TP_ARGS(xf, pos, bytecount),
1004	TP_STRUCT__entry(
1005		__field(unsigned long, ino)
1006		__field(unsigned long long, bytes_used)
1007		__field(loff_t, pos)
1008		__field(loff_t, size)
1009		__field(unsigned long long, bytecount)
1010	),
1011	TP_fast_assign(
1012		struct inode		*inode = file_inode(xf->file);
1013
1014		__entry->ino = inode->i_ino;
1015		__entry->bytes_used = inode->i_blocks << SECTOR_SHIFT;
1016		__entry->pos = pos;
1017		__entry->size = i_size_read(inode);
1018		__entry->bytecount = bytecount;
1019	),
1020	TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
1021		  __entry->ino,
1022		  __entry->bytes_used,
1023		  __entry->pos,
1024		  __entry->bytecount,
1025		  __entry->size)
1026);
1027#define DEFINE_XFILE_EVENT(name) \
1028DEFINE_EVENT(xfile_class, name, \
1029	TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
1030	TP_ARGS(xf, pos, bytecount))
1031DEFINE_XFILE_EVENT(xfile_load);
1032DEFINE_XFILE_EVENT(xfile_store);
1033DEFINE_XFILE_EVENT(xfile_seek_data);
1034DEFINE_XFILE_EVENT(xfile_get_folio);
1035DEFINE_XFILE_EVENT(xfile_put_folio);
1036DEFINE_XFILE_EVENT(xfile_discard);
1037
1038TRACE_EVENT(xfarray_create,
1039	TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
1040	TP_ARGS(xfa, required_capacity),
1041	TP_STRUCT__entry(
1042		__field(unsigned long, ino)
1043		__field(uint64_t, max_nr)
1044		__field(size_t, obj_size)
1045		__field(int, obj_size_log)
1046		__field(unsigned long long, required_capacity)
1047	),
1048	TP_fast_assign(
1049		__entry->max_nr = xfa->max_nr;
1050		__entry->obj_size = xfa->obj_size;
1051		__entry->obj_size_log = xfa->obj_size_log;
1052		__entry->ino = file_inode(xfa->xfile->file)->i_ino;
1053		__entry->required_capacity = required_capacity;
1054	),
1055	TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
1056		  __entry->ino,
1057		  __entry->max_nr,
1058		  __entry->required_capacity,
1059		  __entry->obj_size,
1060		  __entry->obj_size_log)
1061);
1062
1063TRACE_EVENT(xfarray_isort,
1064	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1065	TP_ARGS(si, lo, hi),
1066	TP_STRUCT__entry(
1067		__field(unsigned long, ino)
1068		__field(unsigned long long, lo)
1069		__field(unsigned long long, hi)
1070	),
1071	TP_fast_assign(
1072		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1073		__entry->lo = lo;
1074		__entry->hi = hi;
1075	),
1076	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1077		  __entry->ino,
1078		  __entry->lo,
1079		  __entry->hi,
1080		  __entry->hi - __entry->lo)
1081);
1082
1083TRACE_EVENT(xfarray_foliosort,
1084	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1085	TP_ARGS(si, lo, hi),
1086	TP_STRUCT__entry(
1087		__field(unsigned long, ino)
1088		__field(unsigned long long, lo)
1089		__field(unsigned long long, hi)
1090	),
1091	TP_fast_assign(
1092		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1093		__entry->lo = lo;
1094		__entry->hi = hi;
1095	),
1096	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1097		  __entry->ino,
1098		  __entry->lo,
1099		  __entry->hi,
1100		  __entry->hi - __entry->lo)
1101);
1102
1103TRACE_EVENT(xfarray_qsort,
1104	TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1105	TP_ARGS(si, lo, hi),
1106	TP_STRUCT__entry(
1107		__field(unsigned long, ino)
1108		__field(unsigned long long, lo)
1109		__field(unsigned long long, hi)
1110		__field(int, stack_depth)
1111		__field(int, max_stack_depth)
1112	),
1113	TP_fast_assign(
1114		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1115		__entry->lo = lo;
1116		__entry->hi = hi;
1117		__entry->stack_depth = si->stack_depth;
1118		__entry->max_stack_depth = si->max_stack_depth;
1119	),
1120	TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
1121		  __entry->ino,
1122		  __entry->lo,
1123		  __entry->hi,
1124		  __entry->hi - __entry->lo,
1125		  __entry->stack_depth,
1126		  __entry->max_stack_depth)
1127);
1128
1129TRACE_EVENT(xfarray_sort,
1130	TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
1131	TP_ARGS(si, bytes),
1132	TP_STRUCT__entry(
1133		__field(unsigned long, ino)
1134		__field(unsigned long long, nr)
1135		__field(size_t, obj_size)
1136		__field(size_t, bytes)
1137		__field(unsigned int, max_stack_depth)
1138	),
1139	TP_fast_assign(
1140		__entry->nr = si->array->nr;
1141		__entry->obj_size = si->array->obj_size;
1142		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1143		__entry->bytes = bytes;
1144		__entry->max_stack_depth = si->max_stack_depth;
1145	),
1146	TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
1147		  __entry->ino,
1148		  __entry->nr,
1149		  __entry->obj_size,
1150		  __entry->max_stack_depth,
1151		  __entry->bytes)
1152);
1153
1154TRACE_EVENT(xfarray_sort_scan,
1155	TP_PROTO(struct xfarray_sortinfo *si, unsigned long long idx),
1156	TP_ARGS(si, idx),
1157	TP_STRUCT__entry(
1158		__field(unsigned long, ino)
1159		__field(unsigned long long, nr)
1160		__field(size_t, obj_size)
1161		__field(unsigned long long, idx)
1162		__field(unsigned long long, folio_pos)
1163		__field(unsigned long, folio_bytes)
1164		__field(unsigned long long, first_idx)
1165		__field(unsigned long long, last_idx)
1166	),
1167	TP_fast_assign(
1168		__entry->nr = si->array->nr;
1169		__entry->obj_size = si->array->obj_size;
1170		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1171		__entry->idx = idx;
1172		if (si->folio) {
1173			__entry->folio_pos = folio_pos(si->folio);
1174			__entry->folio_bytes = folio_size(si->folio);
1175			__entry->first_idx = si->first_folio_idx;
1176			__entry->last_idx = si->last_folio_idx;
1177		} else {
1178			__entry->folio_pos = 0;
1179			__entry->folio_bytes = 0;
1180			__entry->first_idx = 0;
1181			__entry->last_idx = 0;
1182		}
1183	),
1184	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",
1185		  __entry->ino,
1186		  __entry->nr,
1187		  __entry->obj_size,
1188		  __entry->idx,
1189		  __entry->folio_pos,
1190		  __entry->folio_bytes,
1191		  __entry->first_idx,
1192		  __entry->last_idx)
1193);
1194
1195TRACE_EVENT(xfarray_sort_stats,
1196	TP_PROTO(struct xfarray_sortinfo *si, int error),
1197	TP_ARGS(si, error),
1198	TP_STRUCT__entry(
1199		__field(unsigned long, ino)
1200#ifdef DEBUG
1201		__field(unsigned long long, loads)
1202		__field(unsigned long long, stores)
1203		__field(unsigned long long, compares)
1204		__field(unsigned long long, heapsorts)
1205#endif
1206		__field(unsigned int, max_stack_depth)
1207		__field(unsigned int, max_stack_used)
1208		__field(int, error)
1209	),
1210	TP_fast_assign(
1211		__entry->ino = file_inode(si->array->xfile->file)->i_ino;
1212#ifdef DEBUG
1213		__entry->loads = si->loads;
1214		__entry->stores = si->stores;
1215		__entry->compares = si->compares;
1216		__entry->heapsorts = si->heapsorts;
1217#endif
1218		__entry->max_stack_depth = si->max_stack_depth;
1219		__entry->max_stack_used = si->max_stack_used;
1220		__entry->error = error;
1221	),
1222	TP_printk(
1223#ifdef DEBUG
1224		  "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1225#else
1226		  "xfino 0x%lx stack_depth %u/%u error %d",
1227#endif
1228		  __entry->ino,
1229#ifdef DEBUG
1230		  __entry->loads,
1231		  __entry->stores,
1232		  __entry->compares,
1233		  __entry->heapsorts,
1234#endif
1235		  __entry->max_stack_used,
1236		  __entry->max_stack_depth,
1237		  __entry->error)
1238);
1239
1240#ifdef CONFIG_XFS_RT
1241TRACE_EVENT(xchk_rtsum_record_free,
1242	TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
1243		 xfs_rtbxlen_t len, unsigned int log, loff_t pos,
1244		 xfs_suminfo_t value),
1245	TP_ARGS(mp, start, len, log, pos, value),
1246	TP_STRUCT__entry(
1247		__field(dev_t, dev)
1248		__field(dev_t, rtdev)
1249		__field(xfs_rtxnum_t, start)
1250		__field(unsigned long long, len)
1251		__field(unsigned int, log)
1252		__field(loff_t, pos)
1253		__field(xfs_suminfo_t, value)
1254	),
1255	TP_fast_assign(
1256		__entry->dev = mp->m_super->s_dev;
1257		__entry->rtdev = mp->m_rtdev_targp->bt_dev;
1258		__entry->start = start;
1259		__entry->len = len;
1260		__entry->log = log;
1261		__entry->pos = pos;
1262		__entry->value = value;
1263	),
1264	TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
1265		  MAJOR(__entry->dev), MINOR(__entry->dev),
1266		  MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
1267		  __entry->start,
1268		  __entry->len,
1269		  __entry->log,
1270		  __entry->pos,
1271		  __entry->value)
1272);
1273#endif /* CONFIG_XFS_RT */
1274
1275DECLARE_EVENT_CLASS(xchk_iscan_class,
1276	TP_PROTO(struct xchk_iscan *iscan),
1277	TP_ARGS(iscan),
1278	TP_STRUCT__entry(
1279		__field(dev_t, dev)
1280		__field(xfs_ino_t, cursor)
1281		__field(xfs_ino_t, visited)
1282	),
1283	TP_fast_assign(
1284		__entry->dev = iscan->sc->mp->m_super->s_dev;
1285		__entry->cursor = iscan->cursor_ino;
1286		__entry->visited = iscan->__visited_ino;
1287	),
1288	TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx",
1289		  MAJOR(__entry->dev), MINOR(__entry->dev),
1290		  __entry->cursor,
1291		  __entry->visited)
1292)
1293#define DEFINE_ISCAN_EVENT(name) \
1294DEFINE_EVENT(xchk_iscan_class, name, \
1295	TP_PROTO(struct xchk_iscan *iscan), \
1296	TP_ARGS(iscan))
1297DEFINE_ISCAN_EVENT(xchk_iscan_move_cursor);
1298DEFINE_ISCAN_EVENT(xchk_iscan_visit);
1299DEFINE_ISCAN_EVENT(xchk_iscan_skip);
1300DEFINE_ISCAN_EVENT(xchk_iscan_advance_ag);
1301
1302DECLARE_EVENT_CLASS(xchk_iscan_ino_class,
1303	TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino),
1304	TP_ARGS(iscan, ino),
1305	TP_STRUCT__entry(
1306		__field(dev_t, dev)
1307		__field(xfs_ino_t, startino)
1308		__field(xfs_ino_t, cursor)
1309		__field(xfs_ino_t, visited)
1310		__field(xfs_ino_t, ino)
1311	),
1312	TP_fast_assign(
1313		__entry->dev = iscan->sc->mp->m_super->s_dev;
1314		__entry->startino = iscan->scan_start_ino;
1315		__entry->cursor = iscan->cursor_ino;
1316		__entry->visited = iscan->__visited_ino;
1317		__entry->ino = ino;
1318	),
1319	TP_printk("dev %d:%d iscan start 0x%llx cursor 0x%llx visited 0x%llx ino 0x%llx",
1320		  MAJOR(__entry->dev), MINOR(__entry->dev),
1321		  __entry->startino,
1322		  __entry->cursor,
1323		  __entry->visited,
1324		  __entry->ino)
1325)
1326#define DEFINE_ISCAN_INO_EVENT(name) \
1327DEFINE_EVENT(xchk_iscan_ino_class, name, \
1328	TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino), \
1329	TP_ARGS(iscan, ino))
1330DEFINE_ISCAN_INO_EVENT(xchk_iscan_want_live_update);
1331DEFINE_ISCAN_INO_EVENT(xchk_iscan_start);
1332
1333TRACE_EVENT(xchk_iscan_iget,
1334	TP_PROTO(struct xchk_iscan *iscan, int error),
1335	TP_ARGS(iscan, error),
1336	TP_STRUCT__entry(
1337		__field(dev_t, dev)
1338		__field(xfs_ino_t, cursor)
1339		__field(xfs_ino_t, visited)
1340		__field(int, error)
1341	),
1342	TP_fast_assign(
1343		__entry->dev = iscan->sc->mp->m_super->s_dev;
1344		__entry->cursor = iscan->cursor_ino;
1345		__entry->visited = iscan->__visited_ino;
1346		__entry->error = error;
1347	),
1348	TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx error %d",
1349		  MAJOR(__entry->dev), MINOR(__entry->dev),
1350		  __entry->cursor,
1351		  __entry->visited,
1352		  __entry->error)
1353);
1354
1355TRACE_EVENT(xchk_iscan_iget_batch,
1356	TP_PROTO(struct xfs_mount *mp, struct xchk_iscan *iscan,
1357		 unsigned int nr, unsigned int avail),
1358	TP_ARGS(mp, iscan, nr, avail),
1359	TP_STRUCT__entry(
1360		__field(dev_t, dev)
1361		__field(xfs_ino_t, cursor)
1362		__field(xfs_ino_t, visited)
1363		__field(unsigned int, nr)
1364		__field(unsigned int, avail)
1365		__field(unsigned int, unavail)
1366		__field(xfs_ino_t, batch_ino)
1367		__field(unsigned long long, skipmask)
1368	),
1369	TP_fast_assign(
1370		__entry->dev = mp->m_super->s_dev;
1371		__entry->cursor = iscan->cursor_ino;
1372		__entry->visited = iscan->__visited_ino;
1373		__entry->nr = nr;
1374		__entry->avail = avail;
1375		__entry->unavail = hweight64(iscan->__skipped_inomask);
1376		__entry->batch_ino = iscan->__batch_ino;
1377		__entry->skipmask = iscan->__skipped_inomask;
1378	),
1379	TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx batchino 0x%llx skipmask 0x%llx nr %u avail %u unavail %u",
1380		  MAJOR(__entry->dev), MINOR(__entry->dev),
1381		  __entry->cursor,
1382		  __entry->visited,
1383		  __entry->batch_ino,
1384		  __entry->skipmask,
1385		  __entry->nr,
1386		  __entry->avail,
1387		  __entry->unavail)
1388);
1389
1390DECLARE_EVENT_CLASS(xchk_iscan_retry_wait_class,
1391	TP_PROTO(struct xchk_iscan *iscan),
1392	TP_ARGS(iscan),
1393	TP_STRUCT__entry(
1394		__field(dev_t, dev)
1395		__field(xfs_ino_t, cursor)
1396		__field(xfs_ino_t, visited)
1397		__field(unsigned int, retry_delay)
1398		__field(unsigned long, remaining)
1399		__field(unsigned int, iget_timeout)
1400	),
1401	TP_fast_assign(
1402		__entry->dev = iscan->sc->mp->m_super->s_dev;
1403		__entry->cursor = iscan->cursor_ino;
1404		__entry->visited = iscan->__visited_ino;
1405		__entry->retry_delay = iscan->iget_retry_delay;
1406		__entry->remaining = jiffies_to_msecs(iscan->__iget_deadline - jiffies);
1407		__entry->iget_timeout = iscan->iget_timeout;
1408	),
1409	TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx remaining %lu timeout %u delay %u",
1410		  MAJOR(__entry->dev), MINOR(__entry->dev),
1411		  __entry->cursor,
1412		  __entry->visited,
1413		  __entry->remaining,
1414		  __entry->iget_timeout,
1415		  __entry->retry_delay)
1416)
1417#define DEFINE_ISCAN_RETRY_WAIT_EVENT(name) \
1418DEFINE_EVENT(xchk_iscan_retry_wait_class, name, \
1419	TP_PROTO(struct xchk_iscan *iscan), \
1420	TP_ARGS(iscan))
1421DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_iget_retry_wait);
1422DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_agi_retry_wait);
1423
1424TRACE_EVENT(xchk_nlinks_collect_dirent,
1425	TP_PROTO(struct xfs_mount *mp, struct xfs_inode *dp,
1426		 xfs_ino_t ino, const struct xfs_name *name),
1427	TP_ARGS(mp, dp, ino, name),
1428	TP_STRUCT__entry(
1429		__field(dev_t, dev)
1430		__field(xfs_ino_t, dir)
1431		__field(xfs_ino_t, ino)
1432		__field(unsigned int, namelen)
1433		__dynamic_array(char, name, name->len)
1434	),
1435	TP_fast_assign(
1436		__entry->dev = mp->m_super->s_dev;
1437		__entry->dir = dp->i_ino;
1438		__entry->ino = ino;
1439		__entry->namelen = name->len;
1440		memcpy(__get_str(name), name->name, name->len);
1441	),
1442	TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1443		  MAJOR(__entry->dev), MINOR(__entry->dev),
1444		  __entry->dir,
1445		  __entry->ino,
1446		  __entry->namelen,
1447		  __get_str(name))
1448);
1449
1450TRACE_EVENT(xchk_nlinks_collect_pptr,
1451	TP_PROTO(struct xfs_mount *mp, struct xfs_inode *dp,
1452		 const struct xfs_name *name,
1453		 const struct xfs_parent_rec *pptr),
1454	TP_ARGS(mp, dp, name, pptr),
1455	TP_STRUCT__entry(
1456		__field(dev_t, dev)
1457		__field(xfs_ino_t, dir)
1458		__field(xfs_ino_t, ino)
1459		__field(unsigned int, namelen)
1460		__dynamic_array(char, name, name->len)
1461	),
1462	TP_fast_assign(
1463		__entry->dev = mp->m_super->s_dev;
1464		__entry->dir = dp->i_ino;
1465		__entry->ino = be64_to_cpu(pptr->p_ino);
1466		__entry->namelen = name->len;
1467		memcpy(__get_str(name), name->name, name->len);
1468	),
1469	TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1470		  MAJOR(__entry->dev), MINOR(__entry->dev),
1471		  __entry->dir,
1472		  __entry->ino,
1473		  __entry->namelen,
1474		  __get_str(name))
1475);
1476
1477TRACE_EVENT(xchk_nlinks_collect_metafile,
1478	TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino),
1479	TP_ARGS(mp, ino),
1480	TP_STRUCT__entry(
1481		__field(dev_t, dev)
1482		__field(xfs_ino_t, ino)
1483	),
1484	TP_fast_assign(
1485		__entry->dev = mp->m_super->s_dev;
1486		__entry->ino = ino;
1487	),
1488	TP_printk("dev %d:%d ino 0x%llx",
1489		  MAJOR(__entry->dev), MINOR(__entry->dev),
1490		  __entry->ino)
1491);
1492
1493TRACE_EVENT(xchk_nlinks_live_update,
1494	TP_PROTO(struct xfs_mount *mp, const struct xfs_inode *dp,
1495		 int action, xfs_ino_t ino, int delta,
1496		 const char *name, unsigned int namelen),
1497	TP_ARGS(mp, dp, action, ino, delta, name, namelen),
1498	TP_STRUCT__entry(
1499		__field(dev_t, dev)
1500		__field(xfs_ino_t, dir)
1501		__field(int, action)
1502		__field(xfs_ino_t, ino)
1503		__field(int, delta)
1504		__field(unsigned int, namelen)
1505		__dynamic_array(char, name, namelen)
1506	),
1507	TP_fast_assign(
1508		__entry->dev = mp->m_super->s_dev;
1509		__entry->dir = dp ? dp->i_ino : NULLFSINO;
1510		__entry->action = action;
1511		__entry->ino = ino;
1512		__entry->delta = delta;
1513		__entry->namelen = namelen;
1514		memcpy(__get_str(name), name, namelen);
1515	),
1516	TP_printk("dev %d:%d dir 0x%llx ino 0x%llx nlink_delta %d name '%.*s'",
1517		  MAJOR(__entry->dev), MINOR(__entry->dev),
1518		  __entry->dir,
1519		  __entry->ino,
1520		  __entry->delta,
1521		  __entry->namelen,
1522		  __get_str(name))
1523);
1524
1525TRACE_EVENT(xchk_nlinks_check_zero,
1526	TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1527		 const struct xchk_nlink *live),
1528	TP_ARGS(mp, ino, live),
1529	TP_STRUCT__entry(
1530		__field(dev_t, dev)
1531		__field(xfs_ino_t, ino)
1532		__field(xfs_nlink_t, parents)
1533		__field(xfs_nlink_t, backrefs)
1534		__field(xfs_nlink_t, children)
1535	),
1536	TP_fast_assign(
1537		__entry->dev = mp->m_super->s_dev;
1538		__entry->ino = ino;
1539		__entry->parents = live->parents;
1540		__entry->backrefs = live->backrefs;
1541		__entry->children = live->children;
1542	),
1543	TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
1544		  MAJOR(__entry->dev), MINOR(__entry->dev),
1545		  __entry->ino,
1546		  __entry->parents,
1547		  __entry->backrefs,
1548		  __entry->children)
1549);
1550
1551TRACE_EVENT(xchk_nlinks_update_incore,
1552	TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1553		 const struct xchk_nlink *live, int parents_delta,
1554		 int backrefs_delta, int children_delta),
1555	TP_ARGS(mp, ino, live, parents_delta, backrefs_delta, children_delta),
1556	TP_STRUCT__entry(
1557		__field(dev_t, dev)
1558		__field(xfs_ino_t, ino)
1559		__field(xfs_nlink_t, parents)
1560		__field(xfs_nlink_t, backrefs)
1561		__field(xfs_nlink_t, children)
1562		__field(int, parents_delta)
1563		__field(int, backrefs_delta)
1564		__field(int, children_delta)
1565	),
1566	TP_fast_assign(
1567		__entry->dev = mp->m_super->s_dev;
1568		__entry->ino = ino;
1569		__entry->parents = live->parents;
1570		__entry->backrefs = live->backrefs;
1571		__entry->children = live->children;
1572		__entry->parents_delta = parents_delta;
1573		__entry->backrefs_delta = backrefs_delta;
1574		__entry->children_delta = children_delta;
1575	),
1576	TP_printk("dev %d:%d ino 0x%llx parents %d:%u backrefs %d:%u children %d:%u",
1577		  MAJOR(__entry->dev), MINOR(__entry->dev),
1578		  __entry->ino,
1579		  __entry->parents_delta,
1580		  __entry->parents,
1581		  __entry->backrefs_delta,
1582		  __entry->backrefs,
1583		  __entry->children_delta,
1584		  __entry->children)
1585);
1586
1587DECLARE_EVENT_CLASS(xchk_nlinks_diff_class,
1588	TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip,
1589		 const struct xchk_nlink *live),
1590	TP_ARGS(mp, ip, live),
1591	TP_STRUCT__entry(
1592		__field(dev_t, dev)
1593		__field(xfs_ino_t, ino)
1594		__field(uint8_t, ftype)
1595		__field(xfs_nlink_t, nlink)
1596		__field(xfs_nlink_t, parents)
1597		__field(xfs_nlink_t, backrefs)
1598		__field(xfs_nlink_t, children)
1599	),
1600	TP_fast_assign(
1601		__entry->dev = mp->m_super->s_dev;
1602		__entry->ino = ip->i_ino;
1603		__entry->ftype = xfs_mode_to_ftype(VFS_I(ip)->i_mode);
1604		__entry->nlink = VFS_I(ip)->i_nlink;
1605		__entry->parents = live->parents;
1606		__entry->backrefs = live->backrefs;
1607		__entry->children = live->children;
1608	),
1609	TP_printk("dev %d:%d ino 0x%llx ftype %s nlink %u parents %u backrefs %u children %u",
1610		  MAJOR(__entry->dev), MINOR(__entry->dev),
1611		  __entry->ino,
1612		  __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
1613		  __entry->nlink,
1614		  __entry->parents,
1615		  __entry->backrefs,
1616		  __entry->children)
1617);
1618#define DEFINE_SCRUB_NLINKS_DIFF_EVENT(name) \
1619DEFINE_EVENT(xchk_nlinks_diff_class, name, \
1620	TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip, \
1621		 const struct xchk_nlink *live), \
1622	TP_ARGS(mp, ip, live))
1623DEFINE_SCRUB_NLINKS_DIFF_EVENT(xchk_nlinks_compare_inode);
1624
1625DECLARE_EVENT_CLASS(xchk_pptr_class,
1626	TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name,
1627		 xfs_ino_t far_ino),
1628	TP_ARGS(ip, name, far_ino),
1629	TP_STRUCT__entry(
1630		__field(dev_t, dev)
1631		__field(xfs_ino_t, ino)
1632		__field(unsigned int, namelen)
1633		__dynamic_array(char, name, name->len)
1634		__field(xfs_ino_t, far_ino)
1635	),
1636	TP_fast_assign(
1637		__entry->dev = ip->i_mount->m_super->s_dev;
1638		__entry->ino = ip->i_ino;
1639		__entry->namelen = name->len;
1640		memcpy(__get_str(name), name, name->len);
1641		__entry->far_ino = far_ino;
1642	),
1643	TP_printk("dev %d:%d ino 0x%llx name '%.*s' far_ino 0x%llx",
1644		  MAJOR(__entry->dev), MINOR(__entry->dev),
1645		  __entry->ino,
1646		  __entry->namelen,
1647		  __get_str(name),
1648		  __entry->far_ino)
1649)
1650#define DEFINE_XCHK_PPTR_EVENT(name) \
1651DEFINE_EVENT(xchk_pptr_class, name, \
1652	TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name, \
1653		 xfs_ino_t far_ino), \
1654	TP_ARGS(ip, name, far_ino))
1655DEFINE_XCHK_PPTR_EVENT(xchk_dir_defer);
1656DEFINE_XCHK_PPTR_EVENT(xchk_dir_slowpath);
1657DEFINE_XCHK_PPTR_EVENT(xchk_dir_ultraslowpath);
1658DEFINE_XCHK_PPTR_EVENT(xchk_parent_defer);
1659DEFINE_XCHK_PPTR_EVENT(xchk_parent_slowpath);
1660DEFINE_XCHK_PPTR_EVENT(xchk_parent_ultraslowpath);
1661
1662DECLARE_EVENT_CLASS(xchk_dirtree_class,
1663	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip,
1664		 unsigned int path_nr, const struct xfs_name *name,
1665		 const struct xfs_parent_rec *pptr),
1666	TP_ARGS(sc, ip, path_nr, name, pptr),
1667	TP_STRUCT__entry(
1668		__field(dev_t, dev)
1669		__field(unsigned int, path_nr)
1670		__field(xfs_ino_t, child_ino)
1671		__field(unsigned int, child_gen)
1672		__field(xfs_ino_t, parent_ino)
1673		__field(unsigned int, parent_gen)
1674		__field(unsigned int, namelen)
1675		__dynamic_array(char, name, name->len)
1676	),
1677	TP_fast_assign(
1678		__entry->dev = sc->mp->m_super->s_dev;
1679		__entry->path_nr = path_nr;
1680		__entry->child_ino = ip->i_ino;
1681		__entry->child_gen = VFS_I(ip)->i_generation;
1682		__entry->parent_ino = be64_to_cpu(pptr->p_ino);
1683		__entry->parent_gen = be32_to_cpu(pptr->p_gen);
1684		__entry->namelen = name->len;
1685		memcpy(__get_str(name), name->name, name->len);
1686	),
1687	TP_printk("dev %d:%d path %u child_ino 0x%llx child_gen 0x%x parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
1688		  MAJOR(__entry->dev), MINOR(__entry->dev),
1689		  __entry->path_nr,
1690		  __entry->child_ino,
1691		  __entry->child_gen,
1692		  __entry->parent_ino,
1693		  __entry->parent_gen,
1694		  __entry->namelen,
1695		  __get_str(name))
1696);
1697#define DEFINE_XCHK_DIRTREE_EVENT(name) \
1698DEFINE_EVENT(xchk_dirtree_class, name, \
1699	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, \
1700		 unsigned int path_nr, const struct xfs_name *name, \
1701		 const struct xfs_parent_rec *pptr), \
1702	TP_ARGS(sc, ip, path_nr, name, pptr))
1703DEFINE_XCHK_DIRTREE_EVENT(xchk_dirtree_create_path);
1704DEFINE_XCHK_DIRTREE_EVENT(xchk_dirpath_walk_upwards);
1705
1706DECLARE_EVENT_CLASS(xchk_dirpath_class,
1707	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip,
1708		 unsigned int path_nr, unsigned int step_nr,
1709		 const struct xfs_name *name,
1710		 const struct xfs_parent_rec *pptr),
1711	TP_ARGS(sc, ip, path_nr, step_nr, name, pptr),
1712	TP_STRUCT__entry(
1713		__field(dev_t, dev)
1714		__field(unsigned int, path_nr)
1715		__field(unsigned int, step_nr)
1716		__field(xfs_ino_t, child_ino)
1717		__field(unsigned int, child_gen)
1718		__field(xfs_ino_t, parent_ino)
1719		__field(unsigned int, parent_gen)
1720		__field(unsigned int, namelen)
1721		__dynamic_array(char, name, name->len)
1722	),
1723	TP_fast_assign(
1724		__entry->dev = sc->mp->m_super->s_dev;
1725		__entry->path_nr = path_nr;
1726		__entry->step_nr = step_nr;
1727		__entry->child_ino = ip->i_ino;
1728		__entry->child_gen = VFS_I(ip)->i_generation;
1729		__entry->parent_ino = be64_to_cpu(pptr->p_ino);
1730		__entry->parent_gen = be32_to_cpu(pptr->p_gen);
1731		__entry->namelen = name->len;
1732		memcpy(__get_str(name), name->name, name->len);
1733	),
1734	TP_printk("dev %d:%d path %u step %u child_ino 0x%llx child_gen 0x%x parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
1735		  MAJOR(__entry->dev), MINOR(__entry->dev),
1736		  __entry->path_nr,
1737		  __entry->step_nr,
1738		  __entry->child_ino,
1739		  __entry->child_gen,
1740		  __entry->parent_ino,
1741		  __entry->parent_gen,
1742		  __entry->namelen,
1743		  __get_str(name))
1744);
1745#define DEFINE_XCHK_DIRPATH_EVENT(name) \
1746DEFINE_EVENT(xchk_dirpath_class, name, \
1747	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, \
1748		 unsigned int path_nr, unsigned int step_nr, \
1749		 const struct xfs_name *name, \
1750		 const struct xfs_parent_rec *pptr), \
1751	TP_ARGS(sc, ip, path_nr, step_nr, name, pptr))
1752DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_disappeared);
1753DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_badgen);
1754DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_nondir_parent);
1755DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_unlinked_parent);
1756DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_found_next_step);
1757
1758TRACE_DEFINE_ENUM(XCHK_DIRPATH_SCANNING);
1759TRACE_DEFINE_ENUM(XCHK_DIRPATH_DELETE);
1760TRACE_DEFINE_ENUM(XCHK_DIRPATH_CORRUPT);
1761TRACE_DEFINE_ENUM(XCHK_DIRPATH_LOOP);
1762TRACE_DEFINE_ENUM(XCHK_DIRPATH_STALE);
1763TRACE_DEFINE_ENUM(XCHK_DIRPATH_OK);
1764TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETING);
1765TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETED);
1766TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTING);
1767TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTED);
1768
1769#define XCHK_DIRPATH_OUTCOME_STRINGS \
1770	{ XCHK_DIRPATH_SCANNING,	"scanning" }, \
1771	{ XCHK_DIRPATH_DELETE,		"delete" }, \
1772	{ XCHK_DIRPATH_CORRUPT,		"corrupt" }, \
1773	{ XCHK_DIRPATH_LOOP,		"loop" }, \
1774	{ XCHK_DIRPATH_STALE,		"stale" }, \
1775	{ XCHK_DIRPATH_OK,		"ok" }, \
1776	{ XREP_DIRPATH_DELETING,	"deleting" }, \
1777	{ XREP_DIRPATH_DELETED,		"deleted" }, \
1778	{ XREP_DIRPATH_ADOPTING,	"adopting" }, \
1779	{ XREP_DIRPATH_ADOPTED,		"adopted" }
1780
1781DECLARE_EVENT_CLASS(xchk_dirpath_outcome_class,
1782	TP_PROTO(struct xfs_scrub *sc, unsigned long long path_nr,
1783		 unsigned int nr_steps, \
1784		 unsigned int outcome),
1785	TP_ARGS(sc, path_nr, nr_steps, outcome),
1786	TP_STRUCT__entry(
1787		__field(dev_t, dev)
1788		__field(unsigned long long, path_nr)
1789		__field(unsigned int, nr_steps)
1790		__field(unsigned int, outcome)
1791	),
1792	TP_fast_assign(
1793		__entry->dev = sc->mp->m_super->s_dev;
1794		__entry->path_nr = path_nr;
1795		__entry->nr_steps = nr_steps;
1796		__entry->outcome = outcome;
1797	),
1798	TP_printk("dev %d:%d path %llu steps %u outcome %s",
1799		  MAJOR(__entry->dev), MINOR(__entry->dev),
1800		  __entry->path_nr,
1801		  __entry->nr_steps,
1802		  __print_symbolic(__entry->outcome, XCHK_DIRPATH_OUTCOME_STRINGS))
1803);
1804#define DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(name) \
1805DEFINE_EVENT(xchk_dirpath_outcome_class, name, \
1806	TP_PROTO(struct xfs_scrub *sc, unsigned long long path_nr, \
1807		 unsigned int nr_steps, \
1808		 unsigned int outcome), \
1809	TP_ARGS(sc, path_nr, nr_steps, outcome))
1810DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_set_outcome);
1811DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_evaluate_path);
1812
1813DECLARE_EVENT_CLASS(xchk_dirtree_evaluate_class,
1814	TP_PROTO(const struct xchk_dirtree *dl,
1815		 const struct xchk_dirtree_outcomes *oc),
1816	TP_ARGS(dl, oc),
1817	TP_STRUCT__entry(
1818		__field(dev_t, dev)
1819		__field(xfs_ino_t, ino)
1820		__field(xfs_ino_t, rootino)
1821		__field(unsigned int, nr_paths)
1822		__field(unsigned int, bad)
1823		__field(unsigned int, suspect)
1824		__field(unsigned int, good)
1825		__field(bool, needs_adoption)
1826	),
1827	TP_fast_assign(
1828		__entry->dev = dl->sc->mp->m_super->s_dev;
1829		__entry->ino = dl->sc->ip->i_ino;
1830		__entry->rootino = dl->root_ino;
1831		__entry->nr_paths = dl->nr_paths;
1832		__entry->bad = oc->bad;
1833		__entry->suspect = oc->suspect;
1834		__entry->good = oc->good;
1835		__entry->needs_adoption = oc->needs_adoption ? 1 : 0;
1836	),
1837	TP_printk("dev %d:%d ino 0x%llx rootino 0x%llx nr_paths %u bad %u suspect %u good %u adopt? %d",
1838		  MAJOR(__entry->dev), MINOR(__entry->dev),
1839		  __entry->ino,
1840		  __entry->rootino,
1841		  __entry->nr_paths,
1842		  __entry->bad,
1843		  __entry->suspect,
1844		  __entry->good,
1845		  __entry->needs_adoption)
1846);
1847#define DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(name) \
1848DEFINE_EVENT(xchk_dirtree_evaluate_class, name, \
1849	TP_PROTO(const struct xchk_dirtree *dl, \
1850		 const struct xchk_dirtree_outcomes *oc), \
1851	TP_ARGS(dl, oc))
1852DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xchk_dirtree_evaluate);
1853
1854TRACE_EVENT(xchk_dirpath_changed,
1855	TP_PROTO(struct xfs_scrub *sc, unsigned int path_nr,
1856		 unsigned int step_nr, const struct xfs_inode *dp,
1857		 const struct xfs_inode *ip, const struct xfs_name *xname),
1858	TP_ARGS(sc, path_nr, step_nr, dp, ip, xname),
1859	TP_STRUCT__entry(
1860		__field(dev_t, dev)
1861		__field(unsigned int, path_nr)
1862		__field(unsigned int, step_nr)
1863		__field(xfs_ino_t, child_ino)
1864		__field(xfs_ino_t, parent_ino)
1865		__field(unsigned int, namelen)
1866		__dynamic_array(char, name, xname->len)
1867	),
1868	TP_fast_assign(
1869		__entry->dev = sc->mp->m_super->s_dev;
1870		__entry->path_nr = path_nr;
1871		__entry->step_nr = step_nr;
1872		__entry->child_ino = ip->i_ino;
1873		__entry->parent_ino = dp->i_ino;
1874		__entry->namelen = xname->len;
1875		memcpy(__get_str(name), xname->name, xname->len);
1876	),
1877	TP_printk("dev %d:%d path %u step %u child_ino 0x%llx parent_ino 0x%llx name '%.*s'",
1878		  MAJOR(__entry->dev), MINOR(__entry->dev),
1879		  __entry->path_nr,
1880		  __entry->step_nr,
1881		  __entry->child_ino,
1882		  __entry->parent_ino,
1883		  __entry->namelen,
1884		  __get_str(name))
1885);
1886
1887TRACE_EVENT(xchk_dirtree_live_update,
1888	TP_PROTO(struct xfs_scrub *sc, const struct xfs_inode *dp,
1889		 int action, const struct xfs_inode *ip, int delta,
1890		 const struct xfs_name *xname),
1891	TP_ARGS(sc, dp, action, ip, delta, xname),
1892	TP_STRUCT__entry(
1893		__field(dev_t, dev)
1894		__field(xfs_ino_t, parent_ino)
1895		__field(int, action)
1896		__field(xfs_ino_t, child_ino)
1897		__field(int, delta)
1898		__field(unsigned int, namelen)
1899		__dynamic_array(char, name, xname->len)
1900	),
1901	TP_fast_assign(
1902		__entry->dev = sc->mp->m_super->s_dev;
1903		__entry->parent_ino = dp->i_ino;
1904		__entry->action = action;
1905		__entry->child_ino = ip->i_ino;
1906		__entry->delta = delta;
1907		__entry->namelen = xname->len;
1908		memcpy(__get_str(name), xname->name, xname->len);
1909	),
1910	TP_printk("dev %d:%d parent_ino 0x%llx child_ino 0x%llx nlink_delta %d name '%.*s'",
1911		  MAJOR(__entry->dev), MINOR(__entry->dev),
1912		  __entry->parent_ino,
1913		  __entry->child_ino,
1914		  __entry->delta,
1915		  __entry->namelen,
1916		  __get_str(name))
1917);
1918
1919/* repair tracepoints */
1920#if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1921
1922DECLARE_EVENT_CLASS(xrep_extent_class,
1923	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len),
1924	TP_ARGS(pag, agbno, len),
1925	TP_STRUCT__entry(
1926		__field(dev_t, dev)
1927		__field(xfs_agnumber_t, agno)
1928		__field(xfs_agblock_t, agbno)
1929		__field(xfs_extlen_t, len)
1930	),
1931	TP_fast_assign(
1932		__entry->dev = pag->pag_mount->m_super->s_dev;
1933		__entry->agno = pag->pag_agno;
1934		__entry->agbno = agbno;
1935		__entry->len = len;
1936	),
1937	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1938		  MAJOR(__entry->dev), MINOR(__entry->dev),
1939		  __entry->agno,
1940		  __entry->agbno,
1941		  __entry->len)
1942);
1943#define DEFINE_REPAIR_EXTENT_EVENT(name) \
1944DEFINE_EVENT(xrep_extent_class, name, \
1945	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len), \
1946	TP_ARGS(pag, agbno, len))
1947DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1948DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1949DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1950DEFINE_REPAIR_EXTENT_EVENT(xreap_bmapi_binval);
1951DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1952
1953DECLARE_EVENT_CLASS(xrep_reap_find_class,
1954	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len,
1955		bool crosslinked),
1956	TP_ARGS(pag, agbno, len, crosslinked),
1957	TP_STRUCT__entry(
1958		__field(dev_t, dev)
1959		__field(xfs_agnumber_t, agno)
1960		__field(xfs_agblock_t, agbno)
1961		__field(xfs_extlen_t, len)
1962		__field(bool, crosslinked)
1963	),
1964	TP_fast_assign(
1965		__entry->dev = pag->pag_mount->m_super->s_dev;
1966		__entry->agno = pag->pag_agno;
1967		__entry->agbno = agbno;
1968		__entry->len = len;
1969		__entry->crosslinked = crosslinked;
1970	),
1971	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
1972		  MAJOR(__entry->dev), MINOR(__entry->dev),
1973		  __entry->agno,
1974		  __entry->agbno,
1975		  __entry->len,
1976		  __entry->crosslinked ? 1 : 0)
1977);
1978#define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
1979DEFINE_EVENT(xrep_reap_find_class, name, \
1980	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len, \
1981		 bool crosslinked), \
1982	TP_ARGS(pag, agbno, len, crosslinked))
1983DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1984DEFINE_REPAIR_REAP_FIND_EVENT(xreap_bmapi_select);
1985
1986DECLARE_EVENT_CLASS(xrep_rmap_class,
1987	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1988		 xfs_agblock_t agbno, xfs_extlen_t len,
1989		 uint64_t owner, uint64_t offset, unsigned int flags),
1990	TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
1991	TP_STRUCT__entry(
1992		__field(dev_t, dev)
1993		__field(xfs_agnumber_t, agno)
1994		__field(xfs_agblock_t, agbno)
1995		__field(xfs_extlen_t, len)
1996		__field(uint64_t, owner)
1997		__field(uint64_t, offset)
1998		__field(unsigned int, flags)
1999	),
2000	TP_fast_assign(
2001		__entry->dev = mp->m_super->s_dev;
2002		__entry->agno = agno;
2003		__entry->agbno = agbno;
2004		__entry->len = len;
2005		__entry->owner = owner;
2006		__entry->offset = offset;
2007		__entry->flags = flags;
2008	),
2009	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
2010		  MAJOR(__entry->dev), MINOR(__entry->dev),
2011		  __entry->agno,
2012		  __entry->agbno,
2013		  __entry->len,
2014		  __entry->owner,
2015		  __entry->offset,
2016		  __entry->flags)
2017);
2018#define DEFINE_REPAIR_RMAP_EVENT(name) \
2019DEFINE_EVENT(xrep_rmap_class, name, \
2020	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
2021		 xfs_agblock_t agbno, xfs_extlen_t len, \
2022		 uint64_t owner, uint64_t offset, unsigned int flags), \
2023	TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
2024DEFINE_REPAIR_RMAP_EVENT(xrep_ibt_walk_rmap);
2025DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_walk_rmap);
2026
2027TRACE_EVENT(xrep_abt_found,
2028	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2029		 const struct xfs_alloc_rec_incore *rec),
2030	TP_ARGS(mp, agno, rec),
2031	TP_STRUCT__entry(
2032		__field(dev_t, dev)
2033		__field(xfs_agnumber_t, agno)
2034		__field(xfs_agblock_t, startblock)
2035		__field(xfs_extlen_t, blockcount)
2036	),
2037	TP_fast_assign(
2038		__entry->dev = mp->m_super->s_dev;
2039		__entry->agno = agno;
2040		__entry->startblock = rec->ar_startblock;
2041		__entry->blockcount = rec->ar_blockcount;
2042	),
2043	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2044		  MAJOR(__entry->dev), MINOR(__entry->dev),
2045		  __entry->agno,
2046		  __entry->startblock,
2047		  __entry->blockcount)
2048)
2049
2050TRACE_EVENT(xrep_ibt_found,
2051	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2052		 const struct xfs_inobt_rec_incore *rec),
2053	TP_ARGS(mp, agno, rec),
2054	TP_STRUCT__entry(
2055		__field(dev_t, dev)
2056		__field(xfs_agnumber_t, agno)
2057		__field(xfs_agino_t, startino)
2058		__field(uint16_t, holemask)
2059		__field(uint8_t, count)
2060		__field(uint8_t, freecount)
2061		__field(uint64_t, freemask)
2062	),
2063	TP_fast_assign(
2064		__entry->dev = mp->m_super->s_dev;
2065		__entry->agno = agno;
2066		__entry->startino = rec->ir_startino;
2067		__entry->holemask = rec->ir_holemask;
2068		__entry->count = rec->ir_count;
2069		__entry->freecount = rec->ir_freecount;
2070		__entry->freemask = rec->ir_free;
2071	),
2072	TP_printk("dev %d:%d agno 0x%x agino 0x%x holemask 0x%x count 0x%x freecount 0x%x freemask 0x%llx",
2073		  MAJOR(__entry->dev), MINOR(__entry->dev),
2074		  __entry->agno,
2075		  __entry->startino,
2076		  __entry->holemask,
2077		  __entry->count,
2078		  __entry->freecount,
2079		  __entry->freemask)
2080)
2081
2082TRACE_EVENT(xrep_refc_found,
2083	TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *rec),
2084	TP_ARGS(pag, rec),
2085	TP_STRUCT__entry(
2086		__field(dev_t, dev)
2087		__field(xfs_agnumber_t, agno)
2088		__field(enum xfs_refc_domain, domain)
2089		__field(xfs_agblock_t, startblock)
2090		__field(xfs_extlen_t, blockcount)
2091		__field(xfs_nlink_t, refcount)
2092	),
2093	TP_fast_assign(
2094		__entry->dev = pag->pag_mount->m_super->s_dev;
2095		__entry->agno = pag->pag_agno;
2096		__entry->domain = rec->rc_domain;
2097		__entry->startblock = rec->rc_startblock;
2098		__entry->blockcount = rec->rc_blockcount;
2099		__entry->refcount = rec->rc_refcount;
2100	),
2101	TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u",
2102		  MAJOR(__entry->dev), MINOR(__entry->dev),
2103		  __entry->agno,
2104		  __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
2105		  __entry->startblock,
2106		  __entry->blockcount,
2107		  __entry->refcount)
2108)
2109
2110TRACE_EVENT(xrep_bmap_found,
2111	TP_PROTO(struct xfs_inode *ip, int whichfork,
2112		 struct xfs_bmbt_irec *irec),
2113	TP_ARGS(ip, whichfork, irec),
2114	TP_STRUCT__entry(
2115		__field(dev_t, dev)
2116		__field(xfs_ino_t, ino)
2117		__field(int, whichfork)
2118		__field(xfs_fileoff_t, lblk)
2119		__field(xfs_filblks_t, len)
2120		__field(xfs_fsblock_t, pblk)
2121		__field(int, state)
2122	),
2123	TP_fast_assign(
2124		__entry->dev = VFS_I(ip)->i_sb->s_dev;
2125		__entry->ino = ip->i_ino;
2126		__entry->whichfork = whichfork;
2127		__entry->lblk = irec->br_startoff;
2128		__entry->len = irec->br_blockcount;
2129		__entry->pblk = irec->br_startblock;
2130		__entry->state = irec->br_state;
2131	),
2132	TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
2133		  MAJOR(__entry->dev), MINOR(__entry->dev),
2134		  __entry->ino,
2135		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2136		  __entry->lblk,
2137		  __entry->len,
2138		  __entry->pblk,
2139		  __entry->state)
2140);
2141
2142TRACE_EVENT(xrep_rmap_found,
2143	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2144		 const struct xfs_rmap_irec *rec),
2145	TP_ARGS(mp, agno, rec),
2146	TP_STRUCT__entry(
2147		__field(dev_t, dev)
2148		__field(xfs_agnumber_t, agno)
2149		__field(xfs_agblock_t, agbno)
2150		__field(xfs_extlen_t, len)
2151		__field(uint64_t, owner)
2152		__field(uint64_t, offset)
2153		__field(unsigned int, flags)
2154	),
2155	TP_fast_assign(
2156		__entry->dev = mp->m_super->s_dev;
2157		__entry->agno = agno;
2158		__entry->agbno = rec->rm_startblock;
2159		__entry->len = rec->rm_blockcount;
2160		__entry->owner = rec->rm_owner;
2161		__entry->offset = rec->rm_offset;
2162		__entry->flags = rec->rm_flags;
2163	),
2164	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
2165		  MAJOR(__entry->dev), MINOR(__entry->dev),
2166		  __entry->agno,
2167		  __entry->agbno,
2168		  __entry->len,
2169		  __entry->owner,
2170		  __entry->offset,
2171		  __entry->flags)
2172);
2173
2174TRACE_EVENT(xrep_findroot_block,
2175	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
2176		 uint32_t magic, uint16_t level),
2177	TP_ARGS(mp, agno, agbno, magic, level),
2178	TP_STRUCT__entry(
2179		__field(dev_t, dev)
2180		__field(xfs_agnumber_t, agno)
2181		__field(xfs_agblock_t, agbno)
2182		__field(uint32_t, magic)
2183		__field(uint16_t, level)
2184	),
2185	TP_fast_assign(
2186		__entry->dev = mp->m_super->s_dev;
2187		__entry->agno = agno;
2188		__entry->agbno = agbno;
2189		__entry->magic = magic;
2190		__entry->level = level;
2191	),
2192	TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
2193		  MAJOR(__entry->dev), MINOR(__entry->dev),
2194		  __entry->agno,
2195		  __entry->agbno,
2196		  __entry->magic,
2197		  __entry->level)
2198)
2199TRACE_EVENT(xrep_calc_ag_resblks,
2200	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2201		 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
2202		 xfs_agblock_t usedlen),
2203	TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
2204	TP_STRUCT__entry(
2205		__field(dev_t, dev)
2206		__field(xfs_agnumber_t, agno)
2207		__field(xfs_agino_t, icount)
2208		__field(xfs_agblock_t, aglen)
2209		__field(xfs_agblock_t, freelen)
2210		__field(xfs_agblock_t, usedlen)
2211	),
2212	TP_fast_assign(
2213		__entry->dev = mp->m_super->s_dev;
2214		__entry->agno = agno;
2215		__entry->icount = icount;
2216		__entry->aglen = aglen;
2217		__entry->freelen = freelen;
2218		__entry->usedlen = usedlen;
2219	),
2220	TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
2221		  MAJOR(__entry->dev), MINOR(__entry->dev),
2222		  __entry->agno,
2223		  __entry->icount,
2224		  __entry->aglen,
2225		  __entry->freelen,
2226		  __entry->usedlen)
2227)
2228TRACE_EVENT(xrep_calc_ag_resblks_btsize,
2229	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2230		 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
2231		 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
2232	TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
2233	TP_STRUCT__entry(
2234		__field(dev_t, dev)
2235		__field(xfs_agnumber_t, agno)
2236		__field(xfs_agblock_t, bnobt_sz)
2237		__field(xfs_agblock_t, inobt_sz)
2238		__field(xfs_agblock_t, rmapbt_sz)
2239		__field(xfs_agblock_t, refcbt_sz)
2240	),
2241	TP_fast_assign(
2242		__entry->dev = mp->m_super->s_dev;
2243		__entry->agno = agno;
2244		__entry->bnobt_sz = bnobt_sz;
2245		__entry->inobt_sz = inobt_sz;
2246		__entry->rmapbt_sz = rmapbt_sz;
2247		__entry->refcbt_sz = refcbt_sz;
2248	),
2249	TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
2250		  MAJOR(__entry->dev), MINOR(__entry->dev),
2251		  __entry->agno,
2252		  __entry->bnobt_sz,
2253		  __entry->inobt_sz,
2254		  __entry->rmapbt_sz,
2255		  __entry->refcbt_sz)
2256)
2257TRACE_EVENT(xrep_reset_counters,
2258	TP_PROTO(struct xfs_mount *mp, struct xchk_fscounters *fsc),
2259	TP_ARGS(mp, fsc),
2260	TP_STRUCT__entry(
2261		__field(dev_t, dev)
2262		__field(uint64_t, icount)
2263		__field(uint64_t, ifree)
2264		__field(uint64_t, fdblocks)
2265		__field(uint64_t, frextents)
2266	),
2267	TP_fast_assign(
2268		__entry->dev = mp->m_super->s_dev;
2269		__entry->icount = fsc->icount;
2270		__entry->ifree = fsc->ifree;
2271		__entry->fdblocks = fsc->fdblocks;
2272		__entry->frextents = fsc->frextents;
2273	),
2274	TP_printk("dev %d:%d icount %llu ifree %llu fdblocks %llu frextents %llu",
2275		  MAJOR(__entry->dev), MINOR(__entry->dev),
2276		  __entry->icount,
2277		  __entry->ifree,
2278		  __entry->fdblocks,
2279		  __entry->frextents)
2280)
2281
2282DECLARE_EVENT_CLASS(xrep_newbt_extent_class,
2283	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
2284		 xfs_agblock_t agbno, xfs_extlen_t len,
2285		 int64_t owner),
2286	TP_ARGS(mp, agno, agbno, len, owner),
2287	TP_STRUCT__entry(
2288		__field(dev_t, dev)
2289		__field(xfs_agnumber_t, agno)
2290		__field(xfs_agblock_t, agbno)
2291		__field(xfs_extlen_t, len)
2292		__field(int64_t, owner)
2293	),
2294	TP_fast_assign(
2295		__entry->dev = mp->m_super->s_dev;
2296		__entry->agno = agno;
2297		__entry->agbno = agbno;
2298		__entry->len = len;
2299		__entry->owner = owner;
2300	),
2301	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx",
2302		  MAJOR(__entry->dev), MINOR(__entry->dev),
2303		  __entry->agno,
2304		  __entry->agbno,
2305		  __entry->len,
2306		  __entry->owner)
2307);
2308#define DEFINE_NEWBT_EXTENT_EVENT(name) \
2309DEFINE_EVENT(xrep_newbt_extent_class, name, \
2310	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
2311		 xfs_agblock_t agbno, xfs_extlen_t len, \
2312		 int64_t owner), \
2313	TP_ARGS(mp, agno, agbno, len, owner))
2314DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_ag_blocks);
2315DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_file_blocks);
2316DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_free_blocks);
2317DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_claim_block);
2318
2319DECLARE_EVENT_CLASS(xrep_dinode_class,
2320	TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip),
2321	TP_ARGS(sc, dip),
2322	TP_STRUCT__entry(
2323		__field(dev_t, dev)
2324		__field(xfs_ino_t, ino)
2325		__field(uint16_t, mode)
2326		__field(uint8_t, version)
2327		__field(uint8_t, format)
2328		__field(uint32_t, uid)
2329		__field(uint32_t, gid)
2330		__field(uint64_t, size)
2331		__field(uint64_t, nblocks)
2332		__field(uint32_t, extsize)
2333		__field(uint32_t, nextents)
2334		__field(uint16_t, anextents)
2335		__field(uint8_t, forkoff)
2336		__field(uint8_t, aformat)
2337		__field(uint16_t, flags)
2338		__field(uint32_t, gen)
2339		__field(uint64_t, flags2)
2340		__field(uint32_t, cowextsize)
2341	),
2342	TP_fast_assign(
2343		__entry->dev = sc->mp->m_super->s_dev;
2344		__entry->ino = sc->sm->sm_ino;
2345		__entry->mode = be16_to_cpu(dip->di_mode);
2346		__entry->version = dip->di_version;
2347		__entry->format = dip->di_format;
2348		__entry->uid = be32_to_cpu(dip->di_uid);
2349		__entry->gid = be32_to_cpu(dip->di_gid);
2350		__entry->size = be64_to_cpu(dip->di_size);
2351		__entry->nblocks = be64_to_cpu(dip->di_nblocks);
2352		__entry->extsize = be32_to_cpu(dip->di_extsize);
2353		__entry->nextents = be32_to_cpu(dip->di_nextents);
2354		__entry->anextents = be16_to_cpu(dip->di_anextents);
2355		__entry->forkoff = dip->di_forkoff;
2356		__entry->aformat = dip->di_aformat;
2357		__entry->flags = be16_to_cpu(dip->di_flags);
2358		__entry->gen = be32_to_cpu(dip->di_gen);
2359		__entry->flags2 = be64_to_cpu(dip->di_flags2);
2360		__entry->cowextsize = be32_to_cpu(dip->di_cowextsize);
2361	),
2362	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",
2363		  MAJOR(__entry->dev), MINOR(__entry->dev),
2364		  __entry->ino,
2365		  __entry->mode,
2366		  __entry->version,
2367		  __entry->format,
2368		  __entry->uid,
2369		  __entry->gid,
2370		  __entry->size,
2371		  __entry->nblocks,
2372		  __entry->extsize,
2373		  __entry->nextents,
2374		  __entry->anextents,
2375		  __entry->forkoff,
2376		  __entry->aformat,
2377		  __entry->flags,
2378		  __entry->gen,
2379		  __entry->flags2,
2380		  __entry->cowextsize)
2381)
2382
2383#define DEFINE_REPAIR_DINODE_EVENT(name) \
2384DEFINE_EVENT(xrep_dinode_class, name, \
2385	TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip), \
2386	TP_ARGS(sc, dip))
2387DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_header);
2388DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_mode);
2389DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_flags);
2390DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_size);
2391DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_extsize_hints);
2392DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_symlink);
2393DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dir);
2394DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_fixed);
2395DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_forks);
2396DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dfork);
2397DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_afork);
2398DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_ensure_forkoff);
2399
2400DECLARE_EVENT_CLASS(xrep_inode_class,
2401	TP_PROTO(struct xfs_scrub *sc),
2402	TP_ARGS(sc),
2403	TP_STRUCT__entry(
2404		__field(dev_t, dev)
2405		__field(xfs_ino_t, ino)
2406		__field(xfs_fsize_t, size)
2407		__field(xfs_rfsblock_t, nblocks)
2408		__field(uint16_t, flags)
2409		__field(uint64_t, flags2)
2410		__field(uint32_t, nextents)
2411		__field(uint8_t, format)
2412		__field(uint32_t, anextents)
2413		__field(uint8_t, aformat)
2414	),
2415	TP_fast_assign(
2416		__entry->dev = sc->mp->m_super->s_dev;
2417		__entry->ino = sc->sm->sm_ino;
2418		__entry->size = sc->ip->i_disk_size;
2419		__entry->nblocks = sc->ip->i_nblocks;
2420		__entry->flags = sc->ip->i_diflags;
2421		__entry->flags2 = sc->ip->i_diflags2;
2422		__entry->nextents = sc->ip->i_df.if_nextents;
2423		__entry->format = sc->ip->i_df.if_format;
2424		__entry->anextents = sc->ip->i_af.if_nextents;
2425		__entry->aformat = sc->ip->i_af.if_format;
2426	),
2427	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",
2428		  MAJOR(__entry->dev), MINOR(__entry->dev),
2429		  __entry->ino,
2430		  __entry->size,
2431		  __entry->nblocks,
2432		  __entry->flags,
2433		  __entry->flags2,
2434		  __entry->nextents,
2435		  __entry->format,
2436		  __entry->anextents,
2437		  __entry->aformat)
2438)
2439
2440#define DEFINE_REPAIR_INODE_EVENT(name) \
2441DEFINE_EVENT(xrep_inode_class, name, \
2442	TP_PROTO(struct xfs_scrub *sc), \
2443	TP_ARGS(sc))
2444DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockcounts);
2445DEFINE_REPAIR_INODE_EVENT(xrep_inode_ids);
2446DEFINE_REPAIR_INODE_EVENT(xrep_inode_flags);
2447DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockdir_size);
2448DEFINE_REPAIR_INODE_EVENT(xrep_inode_sfdir_size);
2449DEFINE_REPAIR_INODE_EVENT(xrep_inode_dir_size);
2450DEFINE_REPAIR_INODE_EVENT(xrep_inode_fixed);
2451
2452TRACE_EVENT(xrep_dinode_count_rmaps,
2453	TP_PROTO(struct xfs_scrub *sc, xfs_rfsblock_t data_blocks,
2454		xfs_rfsblock_t rt_blocks, xfs_rfsblock_t attr_blocks,
2455		xfs_extnum_t data_extents, xfs_extnum_t rt_extents,
2456		xfs_aextnum_t attr_extents),
2457	TP_ARGS(sc, data_blocks, rt_blocks, attr_blocks, data_extents,
2458		rt_extents, attr_extents),
2459	TP_STRUCT__entry(
2460		__field(dev_t, dev)
2461		__field(xfs_ino_t, ino)
2462		__field(xfs_rfsblock_t, data_blocks)
2463		__field(xfs_rfsblock_t, rt_blocks)
2464		__field(xfs_rfsblock_t, attr_blocks)
2465		__field(xfs_extnum_t, data_extents)
2466		__field(xfs_extnum_t, rt_extents)
2467		__field(xfs_aextnum_t, attr_extents)
2468	),
2469	TP_fast_assign(
2470		__entry->dev = sc->mp->m_super->s_dev;
2471		__entry->ino = sc->sm->sm_ino;
2472		__entry->data_blocks = data_blocks;
2473		__entry->rt_blocks = rt_blocks;
2474		__entry->attr_blocks = attr_blocks;
2475		__entry->data_extents = data_extents;
2476		__entry->rt_extents = rt_extents;
2477		__entry->attr_extents = attr_extents;
2478	),
2479	TP_printk("dev %d:%d ino 0x%llx dblocks 0x%llx rtblocks 0x%llx ablocks 0x%llx dextents %llu rtextents %llu aextents %u",
2480		  MAJOR(__entry->dev), MINOR(__entry->dev),
2481		  __entry->ino,
2482		  __entry->data_blocks,
2483		  __entry->rt_blocks,
2484		  __entry->attr_blocks,
2485		  __entry->data_extents,
2486		  __entry->rt_extents,
2487		  __entry->attr_extents)
2488);
2489
2490TRACE_EVENT(xrep_dinode_findmode_dirent,
2491	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2492		 unsigned int ftype),
2493	TP_ARGS(sc, dp, ftype),
2494	TP_STRUCT__entry(
2495		__field(dev_t, dev)
2496		__field(xfs_ino_t, ino)
2497		__field(xfs_ino_t, parent_ino)
2498		__field(unsigned int, ftype)
2499	),
2500	TP_fast_assign(
2501		__entry->dev = sc->mp->m_super->s_dev;
2502		__entry->ino = sc->sm->sm_ino;
2503		__entry->parent_ino = dp->i_ino;
2504		__entry->ftype = ftype;
2505	),
2506	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s'",
2507		  MAJOR(__entry->dev), MINOR(__entry->dev),
2508		  __entry->ino,
2509		  __entry->parent_ino,
2510		  __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR))
2511);
2512
2513TRACE_EVENT(xrep_dinode_findmode_dirent_inval,
2514	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2515		 unsigned int ftype, unsigned int found_ftype),
2516	TP_ARGS(sc, dp, ftype, found_ftype),
2517	TP_STRUCT__entry(
2518		__field(dev_t, dev)
2519		__field(xfs_ino_t, ino)
2520		__field(xfs_ino_t, parent_ino)
2521		__field(unsigned int, ftype)
2522		__field(unsigned int, found_ftype)
2523	),
2524	TP_fast_assign(
2525		__entry->dev = sc->mp->m_super->s_dev;
2526		__entry->ino = sc->sm->sm_ino;
2527		__entry->parent_ino = dp->i_ino;
2528		__entry->ftype = ftype;
2529		__entry->found_ftype = found_ftype;
2530	),
2531	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s' found_ftype '%s'",
2532		  MAJOR(__entry->dev), MINOR(__entry->dev),
2533		  __entry->ino,
2534		  __entry->parent_ino,
2535		  __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
2536		  __print_symbolic(__entry->found_ftype, XFS_DIR3_FTYPE_STR))
2537);
2538
2539TRACE_EVENT(xrep_cow_mark_file_range,
2540	TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t startblock,
2541		 xfs_fileoff_t startoff, xfs_filblks_t blockcount),
2542	TP_ARGS(ip, startblock, startoff, blockcount),
2543	TP_STRUCT__entry(
2544		__field(dev_t, dev)
2545		__field(xfs_ino_t, ino)
2546		__field(xfs_fsblock_t, startblock)
2547		__field(xfs_fileoff_t, startoff)
2548		__field(xfs_filblks_t, blockcount)
2549	),
2550	TP_fast_assign(
2551		__entry->dev = ip->i_mount->m_super->s_dev;
2552		__entry->ino = ip->i_ino;
2553		__entry->startoff = startoff;
2554		__entry->startblock = startblock;
2555		__entry->blockcount = blockcount;
2556	),
2557	TP_printk("dev %d:%d ino 0x%llx fileoff 0x%llx startblock 0x%llx fsbcount 0x%llx",
2558		  MAJOR(__entry->dev), MINOR(__entry->dev),
2559		  __entry->ino,
2560		  __entry->startoff,
2561		  __entry->startblock,
2562		  __entry->blockcount)
2563);
2564
2565TRACE_EVENT(xrep_cow_replace_mapping,
2566	TP_PROTO(struct xfs_inode *ip, const struct xfs_bmbt_irec *irec,
2567		 xfs_fsblock_t new_startblock, xfs_extlen_t new_blockcount),
2568	TP_ARGS(ip, irec, new_startblock, new_blockcount),
2569	TP_STRUCT__entry(
2570		__field(dev_t, dev)
2571		__field(xfs_ino_t, ino)
2572		__field(xfs_fsblock_t, startblock)
2573		__field(xfs_fileoff_t, startoff)
2574		__field(xfs_filblks_t, blockcount)
2575		__field(xfs_exntst_t, state)
2576		__field(xfs_fsblock_t, new_startblock)
2577		__field(xfs_extlen_t, new_blockcount)
2578	),
2579	TP_fast_assign(
2580		__entry->dev = ip->i_mount->m_super->s_dev;
2581		__entry->ino = ip->i_ino;
2582		__entry->startoff = irec->br_startoff;
2583		__entry->startblock = irec->br_startblock;
2584		__entry->blockcount = irec->br_blockcount;
2585		__entry->state = irec->br_state;
2586		__entry->new_startblock = new_startblock;
2587		__entry->new_blockcount = new_blockcount;
2588	),
2589	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",
2590		  MAJOR(__entry->dev), MINOR(__entry->dev),
2591		  __entry->ino,
2592		  __entry->startoff,
2593		  __entry->startblock,
2594		  __entry->blockcount,
2595		  __entry->state,
2596		  __entry->new_startblock,
2597		  __entry->new_blockcount)
2598);
2599
2600TRACE_EVENT(xrep_cow_free_staging,
2601	TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno,
2602		 xfs_extlen_t blockcount),
2603	TP_ARGS(pag, agbno, blockcount),
2604	TP_STRUCT__entry(
2605		__field(dev_t, dev)
2606		__field(xfs_agnumber_t, agno)
2607		__field(xfs_agblock_t, agbno)
2608		__field(xfs_extlen_t, blockcount)
2609	),
2610	TP_fast_assign(
2611		__entry->dev = pag->pag_mount->m_super->s_dev;
2612		__entry->agno = pag->pag_agno;
2613		__entry->agbno = agbno;
2614		__entry->blockcount = blockcount;
2615	),
2616	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2617		  MAJOR(__entry->dev), MINOR(__entry->dev),
2618		  __entry->agno,
2619		  __entry->agbno,
2620		  __entry->blockcount)
2621);
2622
2623#ifdef CONFIG_XFS_QUOTA
2624DECLARE_EVENT_CLASS(xrep_dquot_class,
2625	TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id),
2626	TP_ARGS(mp, type, id),
2627	TP_STRUCT__entry(
2628		__field(dev_t, dev)
2629		__field(uint8_t, type)
2630		__field(uint32_t, id)
2631	),
2632	TP_fast_assign(
2633		__entry->dev = mp->m_super->s_dev;
2634		__entry->id = id;
2635		__entry->type = type;
2636	),
2637	TP_printk("dev %d:%d type %s id 0x%x",
2638		  MAJOR(__entry->dev), MINOR(__entry->dev),
2639		  __print_flags(__entry->type, "|", XFS_DQTYPE_STRINGS),
2640		  __entry->id)
2641);
2642
2643#define DEFINE_XREP_DQUOT_EVENT(name) \
2644DEFINE_EVENT(xrep_dquot_class, name, \
2645	TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id), \
2646	TP_ARGS(mp, type, id))
2647DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item);
2648DEFINE_XREP_DQUOT_EVENT(xrep_disk_dquot);
2649DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item_fill_bmap_hole);
2650DEFINE_XREP_DQUOT_EVENT(xrep_quotacheck_dquot);
2651#endif /* CONFIG_XFS_QUOTA */
2652
2653DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_update_inode);
2654DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_unfixable_inode);
2655
2656TRACE_EVENT(xrep_rmap_live_update,
2657	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, unsigned int op,
2658		 const struct xfs_rmap_update_params *p),
2659	TP_ARGS(mp, agno, op, p),
2660	TP_STRUCT__entry(
2661		__field(dev_t, dev)
2662		__field(xfs_agnumber_t, agno)
2663		__field(unsigned int, op)
2664		__field(xfs_agblock_t, agbno)
2665		__field(xfs_extlen_t, len)
2666		__field(uint64_t, owner)
2667		__field(uint64_t, offset)
2668		__field(unsigned int, flags)
2669	),
2670	TP_fast_assign(
2671		__entry->dev = mp->m_super->s_dev;
2672		__entry->agno = agno;
2673		__entry->op = op;
2674		__entry->agbno = p->startblock;
2675		__entry->len = p->blockcount;
2676		xfs_owner_info_unpack(&p->oinfo, &__entry->owner,
2677				&__entry->offset, &__entry->flags);
2678		if (p->unwritten)
2679			__entry->flags |= XFS_RMAP_UNWRITTEN;
2680	),
2681	TP_printk("dev %d:%d agno 0x%x op %d agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
2682		  MAJOR(__entry->dev), MINOR(__entry->dev),
2683		  __entry->agno,
2684		  __entry->op,
2685		  __entry->agbno,
2686		  __entry->len,
2687		  __entry->owner,
2688		  __entry->offset,
2689		  __entry->flags)
2690);
2691
2692TRACE_EVENT(xrep_tempfile_create,
2693	TP_PROTO(struct xfs_scrub *sc),
2694	TP_ARGS(sc),
2695	TP_STRUCT__entry(
2696		__field(dev_t, dev)
2697		__field(xfs_ino_t, ino)
2698		__field(unsigned int, type)
2699		__field(xfs_agnumber_t, agno)
2700		__field(xfs_ino_t, inum)
2701		__field(unsigned int, gen)
2702		__field(unsigned int, flags)
2703		__field(xfs_ino_t, temp_inum)
2704	),
2705	TP_fast_assign(
2706		__entry->dev = sc->mp->m_super->s_dev;
2707		__entry->ino = sc->file ? XFS_I(file_inode(sc->file))->i_ino : 0;
2708		__entry->type = sc->sm->sm_type;
2709		__entry->agno = sc->sm->sm_agno;
2710		__entry->inum = sc->sm->sm_ino;
2711		__entry->gen = sc->sm->sm_gen;
2712		__entry->flags = sc->sm->sm_flags;
2713		__entry->temp_inum = sc->tempip->i_ino;
2714	),
2715	TP_printk("dev %d:%d ino 0x%llx type %s inum 0x%llx gen 0x%x flags 0x%x temp_inum 0x%llx",
2716		  MAJOR(__entry->dev), MINOR(__entry->dev),
2717		  __entry->ino,
2718		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
2719		  __entry->inum,
2720		  __entry->gen,
2721		  __entry->flags,
2722		  __entry->temp_inum)
2723);
2724
2725DECLARE_EVENT_CLASS(xrep_tempfile_class,
2726	TP_PROTO(struct xfs_scrub *sc, int whichfork,
2727		 struct xfs_bmbt_irec *irec),
2728	TP_ARGS(sc, whichfork, irec),
2729	TP_STRUCT__entry(
2730		__field(dev_t, dev)
2731		__field(xfs_ino_t, ino)
2732		__field(int, whichfork)
2733		__field(xfs_fileoff_t, lblk)
2734		__field(xfs_filblks_t, len)
2735		__field(xfs_fsblock_t, pblk)
2736		__field(int, state)
2737	),
2738	TP_fast_assign(
2739		__entry->dev = sc->mp->m_super->s_dev;
2740		__entry->ino = sc->tempip->i_ino;
2741		__entry->whichfork = whichfork;
2742		__entry->lblk = irec->br_startoff;
2743		__entry->len = irec->br_blockcount;
2744		__entry->pblk = irec->br_startblock;
2745		__entry->state = irec->br_state;
2746	),
2747	TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
2748		  MAJOR(__entry->dev), MINOR(__entry->dev),
2749		  __entry->ino,
2750		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2751		  __entry->lblk,
2752		  __entry->len,
2753		  __entry->pblk,
2754		  __entry->state)
2755);
2756#define DEFINE_XREP_TEMPFILE_EVENT(name) \
2757DEFINE_EVENT(xrep_tempfile_class, name, \
2758	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
2759		 struct xfs_bmbt_irec *irec), \
2760	TP_ARGS(sc, whichfork, irec))
2761DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_prealloc);
2762DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_copyin);
2763
2764TRACE_EVENT(xreap_ifork_extent,
2765	TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, int whichfork,
2766		 const struct xfs_bmbt_irec *irec),
2767	TP_ARGS(sc, ip, whichfork, irec),
2768	TP_STRUCT__entry(
2769		__field(dev_t, dev)
2770		__field(xfs_ino_t, ino)
2771		__field(int, whichfork)
2772		__field(xfs_fileoff_t, fileoff)
2773		__field(xfs_filblks_t, len)
2774		__field(xfs_agnumber_t, agno)
2775		__field(xfs_agblock_t, agbno)
2776		__field(int, state)
2777	),
2778	TP_fast_assign(
2779		__entry->dev = sc->mp->m_super->s_dev;
2780		__entry->ino = ip->i_ino;
2781		__entry->whichfork = whichfork;
2782		__entry->fileoff = irec->br_startoff;
2783		__entry->len = irec->br_blockcount;
2784		__entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2785		__entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2786		__entry->state = irec->br_state;
2787	),
2788	TP_printk("dev %d:%d ip 0x%llx whichfork %s agno 0x%x agbno 0x%x fileoff 0x%llx fsbcount 0x%llx state 0x%x",
2789		  MAJOR(__entry->dev), MINOR(__entry->dev),
2790		  __entry->ino,
2791		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2792		  __entry->agno,
2793		  __entry->agbno,
2794		  __entry->fileoff,
2795		  __entry->len,
2796		  __entry->state)
2797);
2798
2799TRACE_EVENT(xreap_bmapi_binval_scan,
2800	TP_PROTO(struct xfs_scrub *sc, const struct xfs_bmbt_irec *irec,
2801		 xfs_extlen_t scan_blocks),
2802	TP_ARGS(sc, irec, scan_blocks),
2803	TP_STRUCT__entry(
2804		__field(dev_t, dev)
2805		__field(xfs_filblks_t, len)
2806		__field(xfs_agnumber_t, agno)
2807		__field(xfs_agblock_t, agbno)
2808		__field(xfs_extlen_t, scan_blocks)
2809	),
2810	TP_fast_assign(
2811		__entry->dev = sc->mp->m_super->s_dev;
2812		__entry->len = irec->br_blockcount;
2813		__entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2814		__entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2815		__entry->scan_blocks = scan_blocks;
2816	),
2817	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%llx scan_blocks 0x%x",
2818		  MAJOR(__entry->dev), MINOR(__entry->dev),
2819		  __entry->agno,
2820		  __entry->agbno,
2821		  __entry->len,
2822		  __entry->scan_blocks)
2823);
2824
2825TRACE_EVENT(xrep_xattr_recover_leafblock,
2826	TP_PROTO(struct xfs_inode *ip, xfs_dablk_t dabno, uint16_t magic),
2827	TP_ARGS(ip, dabno, magic),
2828	TP_STRUCT__entry(
2829		__field(dev_t, dev)
2830		__field(xfs_ino_t, ino)
2831		__field(xfs_dablk_t, dabno)
2832		__field(uint16_t, magic)
2833	),
2834	TP_fast_assign(
2835		__entry->dev = ip->i_mount->m_super->s_dev;
2836		__entry->ino = ip->i_ino;
2837		__entry->dabno = dabno;
2838		__entry->magic = magic;
2839	),
2840	TP_printk("dev %d:%d ino 0x%llx dablk 0x%x magic 0x%x",
2841		  MAJOR(__entry->dev), MINOR(__entry->dev),
2842		  __entry->ino,
2843		  __entry->dabno,
2844		  __entry->magic)
2845);
2846
2847DECLARE_EVENT_CLASS(xrep_xattr_salvage_class,
2848	TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name,
2849		 unsigned int namelen, unsigned int valuelen),
2850	TP_ARGS(ip, flags, name, namelen, valuelen),
2851	TP_STRUCT__entry(
2852		__field(dev_t, dev)
2853		__field(xfs_ino_t, ino)
2854		__field(unsigned int, flags)
2855		__field(unsigned int, namelen)
2856		__dynamic_array(char, name, namelen)
2857		__field(unsigned int, valuelen)
2858	),
2859	TP_fast_assign(
2860		__entry->dev = ip->i_mount->m_super->s_dev;
2861		__entry->ino = ip->i_ino;
2862		__entry->flags = flags;
2863		__entry->namelen = namelen;
2864		memcpy(__get_str(name), name, namelen);
2865		__entry->valuelen = valuelen;
2866	),
2867	TP_printk("dev %d:%d ino 0x%llx flags %s name '%.*s' valuelen 0x%x",
2868		  MAJOR(__entry->dev), MINOR(__entry->dev),
2869		  __entry->ino,
2870		   __print_flags(__entry->flags, "|", XFS_ATTR_NAMESPACE_STR),
2871		  __entry->namelen,
2872		  __get_str(name),
2873		  __entry->valuelen)
2874);
2875#define DEFINE_XREP_XATTR_SALVAGE_EVENT(name) \
2876DEFINE_EVENT(xrep_xattr_salvage_class, name, \
2877	TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name, \
2878		 unsigned int namelen, unsigned int valuelen), \
2879	TP_ARGS(ip, flags, name, namelen, valuelen))
2880DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec);
2881DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec);
2882DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_stash_xattr);
2883DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_insert_xattr);
2884
2885DECLARE_EVENT_CLASS(xrep_pptr_salvage_class,
2886	TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name,
2887		 unsigned int namelen, const void *value, unsigned int valuelen),
2888	TP_ARGS(ip, flags, name, namelen, value, valuelen),
2889	TP_STRUCT__entry(
2890		__field(dev_t, dev)
2891		__field(xfs_ino_t, ino)
2892		__field(xfs_ino_t, parent_ino)
2893		__field(unsigned int, parent_gen)
2894		__field(unsigned int, namelen)
2895		__dynamic_array(char, name, namelen)
2896	),
2897	TP_fast_assign(
2898		const struct xfs_parent_rec	*rec = value;
2899
2900		__entry->dev = ip->i_mount->m_super->s_dev;
2901		__entry->ino = ip->i_ino;
2902		__entry->parent_ino = be64_to_cpu(rec->p_ino);
2903		__entry->parent_gen = be32_to_cpu(rec->p_gen);
2904		__entry->namelen = namelen;
2905		memcpy(__get_str(name), name, namelen);
2906	),
2907	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
2908		  MAJOR(__entry->dev), MINOR(__entry->dev),
2909		  __entry->ino,
2910		  __entry->parent_ino,
2911		  __entry->parent_gen,
2912		  __entry->namelen,
2913		  __get_str(name))
2914)
2915#define DEFINE_XREP_PPTR_SALVAGE_EVENT(name) \
2916DEFINE_EVENT(xrep_pptr_salvage_class, name, \
2917	TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name, \
2918		 unsigned int namelen, const void *value, unsigned int valuelen), \
2919	TP_ARGS(ip, flags, name, namelen, value, valuelen))
2920DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_salvage_pptr);
2921DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_insert_pptr);
2922
2923TRACE_EVENT(xrep_xattr_class,
2924	TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip),
2925	TP_ARGS(ip, arg_ip),
2926	TP_STRUCT__entry(
2927		__field(dev_t, dev)
2928		__field(xfs_ino_t, ino)
2929		__field(xfs_ino_t, src_ino)
2930	),
2931	TP_fast_assign(
2932		__entry->dev = ip->i_mount->m_super->s_dev;
2933		__entry->ino = ip->i_ino;
2934		__entry->src_ino = arg_ip->i_ino;
2935	),
2936	TP_printk("dev %d:%d ino 0x%llx src 0x%llx",
2937		  MAJOR(__entry->dev), MINOR(__entry->dev),
2938		  __entry->ino,
2939		  __entry->src_ino)
2940)
2941#define DEFINE_XREP_XATTR_EVENT(name) \
2942DEFINE_EVENT(xrep_xattr_class, name, \
2943	TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip), \
2944	TP_ARGS(ip, arg_ip))
2945DEFINE_XREP_XATTR_EVENT(xrep_xattr_rebuild_tree);
2946DEFINE_XREP_XATTR_EVENT(xrep_xattr_reset_fork);
2947DEFINE_XREP_XATTR_EVENT(xrep_xattr_full_reset);
2948
2949DECLARE_EVENT_CLASS(xrep_xattr_pptr_scan_class,
2950	TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp,
2951		 const struct xfs_name *name),
2952	TP_ARGS(ip, dp, name),
2953	TP_STRUCT__entry(
2954		__field(dev_t, dev)
2955		__field(xfs_ino_t, ino)
2956		__field(xfs_ino_t, parent_ino)
2957		__field(unsigned int, parent_gen)
2958		__field(unsigned int, namelen)
2959		__dynamic_array(char, name, name->len)
2960	),
2961	TP_fast_assign(
2962		__entry->dev = ip->i_mount->m_super->s_dev;
2963		__entry->ino = ip->i_ino;
2964		__entry->parent_ino = dp->i_ino;
2965		__entry->parent_gen = VFS_IC(dp)->i_generation;
2966		__entry->namelen = name->len;
2967		memcpy(__get_str(name), name->name, name->len);
2968	),
2969	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
2970		  MAJOR(__entry->dev), MINOR(__entry->dev),
2971		  __entry->ino,
2972		  __entry->parent_ino,
2973		  __entry->parent_gen,
2974		  __entry->namelen,
2975		  __get_str(name))
2976)
2977#define DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(name) \
2978DEFINE_EVENT(xrep_xattr_pptr_scan_class, name, \
2979	TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp, \
2980		 const struct xfs_name *name), \
2981	TP_ARGS(ip, dp, name))
2982DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentadd);
2983DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentremove);
2984
2985TRACE_EVENT(xrep_dir_recover_dirblock,
2986	TP_PROTO(struct xfs_inode *dp, xfs_dablk_t dabno, uint32_t magic,
2987		 uint32_t magic_guess),
2988	TP_ARGS(dp, dabno, magic, magic_guess),
2989	TP_STRUCT__entry(
2990		__field(dev_t, dev)
2991		__field(xfs_ino_t, dir_ino)
2992		__field(xfs_dablk_t, dabno)
2993		__field(uint32_t, magic)
2994		__field(uint32_t, magic_guess)
2995	),
2996	TP_fast_assign(
2997		__entry->dev = dp->i_mount->m_super->s_dev;
2998		__entry->dir_ino = dp->i_ino;
2999		__entry->dabno = dabno;
3000		__entry->magic = magic;
3001		__entry->magic_guess = magic_guess;
3002	),
3003	TP_printk("dev %d:%d dir 0x%llx dablk 0x%x magic 0x%x magic_guess 0x%x",
3004		  MAJOR(__entry->dev), MINOR(__entry->dev),
3005		  __entry->dir_ino,
3006		  __entry->dabno,
3007		  __entry->magic,
3008		  __entry->magic_guess)
3009);
3010
3011DECLARE_EVENT_CLASS(xrep_dir_class,
3012	TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino),
3013	TP_ARGS(dp, parent_ino),
3014	TP_STRUCT__entry(
3015		__field(dev_t, dev)
3016		__field(xfs_ino_t, dir_ino)
3017		__field(xfs_ino_t, parent_ino)
3018	),
3019	TP_fast_assign(
3020		__entry->dev = dp->i_mount->m_super->s_dev;
3021		__entry->dir_ino = dp->i_ino;
3022		__entry->parent_ino = parent_ino;
3023	),
3024	TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3025		  MAJOR(__entry->dev), MINOR(__entry->dev),
3026		  __entry->dir_ino,
3027		  __entry->parent_ino)
3028)
3029#define DEFINE_XREP_DIR_EVENT(name) \
3030DEFINE_EVENT(xrep_dir_class, name, \
3031	TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino), \
3032	TP_ARGS(dp, parent_ino))
3033DEFINE_XREP_DIR_EVENT(xrep_dir_rebuild_tree);
3034DEFINE_XREP_DIR_EVENT(xrep_dir_reset_fork);
3035DEFINE_XREP_DIR_EVENT(xrep_parent_reset_dotdot);
3036
3037DECLARE_EVENT_CLASS(xrep_dirent_class,
3038	TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name,
3039		 xfs_ino_t ino),
3040	TP_ARGS(dp, name, ino),
3041	TP_STRUCT__entry(
3042		__field(dev_t, dev)
3043		__field(xfs_ino_t, dir_ino)
3044		__field(unsigned int, namelen)
3045		__dynamic_array(char, name, name->len)
3046		__field(xfs_ino_t, ino)
3047		__field(uint8_t, ftype)
3048	),
3049	TP_fast_assign(
3050		__entry->dev = dp->i_mount->m_super->s_dev;
3051		__entry->dir_ino = dp->i_ino;
3052		__entry->namelen = name->len;
3053		memcpy(__get_str(name), name->name, name->len);
3054		__entry->ino = ino;
3055		__entry->ftype = name->type;
3056	),
3057	TP_printk("dev %d:%d dir 0x%llx ftype %s name '%.*s' ino 0x%llx",
3058		  MAJOR(__entry->dev), MINOR(__entry->dev),
3059		  __entry->dir_ino,
3060		  __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
3061		  __entry->namelen,
3062		  __get_str(name),
3063		  __entry->ino)
3064)
3065#define DEFINE_XREP_DIRENT_EVENT(name) \
3066DEFINE_EVENT(xrep_dirent_class, name, \
3067	TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name, \
3068		 xfs_ino_t ino), \
3069	TP_ARGS(dp, name, ino))
3070DEFINE_XREP_DIRENT_EVENT(xrep_dir_salvage_entry);
3071DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_createname);
3072DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_createname);
3073DEFINE_XREP_DIRENT_EVENT(xrep_adoption_reparent);
3074DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_removename);
3075DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_removename);
3076
3077DECLARE_EVENT_CLASS(xrep_adoption_class,
3078	TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved),
3079	TP_ARGS(dp, ip, moved),
3080	TP_STRUCT__entry(
3081		__field(dev_t, dev)
3082		__field(xfs_ino_t, dir_ino)
3083		__field(xfs_ino_t, child_ino)
3084		__field(bool, moved)
3085	),
3086	TP_fast_assign(
3087		__entry->dev = dp->i_mount->m_super->s_dev;
3088		__entry->dir_ino = dp->i_ino;
3089		__entry->child_ino = ip->i_ino;
3090		__entry->moved = moved;
3091	),
3092	TP_printk("dev %d:%d dir 0x%llx child 0x%llx moved? %d",
3093		  MAJOR(__entry->dev), MINOR(__entry->dev),
3094		  __entry->dir_ino,
3095		  __entry->child_ino,
3096		  __entry->moved)
3097);
3098#define DEFINE_XREP_ADOPTION_EVENT(name) \
3099DEFINE_EVENT(xrep_adoption_class, name, \
3100	TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved), \
3101	TP_ARGS(dp, ip, moved))
3102DEFINE_XREP_ADOPTION_EVENT(xrep_adoption_trans_roll);
3103
3104DECLARE_EVENT_CLASS(xrep_parent_salvage_class,
3105	TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino),
3106	TP_ARGS(dp, ino),
3107	TP_STRUCT__entry(
3108		__field(dev_t, dev)
3109		__field(xfs_ino_t, dir_ino)
3110		__field(xfs_ino_t, ino)
3111	),
3112	TP_fast_assign(
3113		__entry->dev = dp->i_mount->m_super->s_dev;
3114		__entry->dir_ino = dp->i_ino;
3115		__entry->ino = ino;
3116	),
3117	TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3118		  MAJOR(__entry->dev), MINOR(__entry->dev),
3119		  __entry->dir_ino,
3120		  __entry->ino)
3121)
3122#define DEFINE_XREP_PARENT_SALVAGE_EVENT(name) \
3123DEFINE_EVENT(xrep_parent_salvage_class, name, \
3124	TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino), \
3125	TP_ARGS(dp, ino))
3126DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_dir_salvaged_parent);
3127DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_dirent);
3128DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_from_dcache);
3129
3130DECLARE_EVENT_CLASS(xrep_pptr_class,
3131	TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name,
3132		 const struct xfs_parent_rec *pptr),
3133	TP_ARGS(ip, name, pptr),
3134	TP_STRUCT__entry(
3135		__field(dev_t, dev)
3136		__field(xfs_ino_t, ino)
3137		__field(xfs_ino_t, parent_ino)
3138		__field(unsigned int, parent_gen)
3139		__field(unsigned int, namelen)
3140		__dynamic_array(char, name, name->len)
3141	),
3142	TP_fast_assign(
3143		__entry->dev = ip->i_mount->m_super->s_dev;
3144		__entry->ino = ip->i_ino;
3145		__entry->parent_ino = be64_to_cpu(pptr->p_ino);
3146		__entry->parent_gen = be32_to_cpu(pptr->p_gen);
3147		__entry->namelen = name->len;
3148		memcpy(__get_str(name), name->name, name->len);
3149	),
3150	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
3151		  MAJOR(__entry->dev), MINOR(__entry->dev),
3152		  __entry->ino,
3153		  __entry->parent_ino,
3154		  __entry->parent_gen,
3155		  __entry->namelen,
3156		  __get_str(name))
3157)
3158#define DEFINE_XREP_PPTR_EVENT(name) \
3159DEFINE_EVENT(xrep_pptr_class, name, \
3160	TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name, \
3161		 const struct xfs_parent_rec *pptr), \
3162	TP_ARGS(ip, name, pptr))
3163DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentadd);
3164DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentremove);
3165DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentadd);
3166DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentremove);
3167
3168DECLARE_EVENT_CLASS(xrep_pptr_scan_class,
3169	TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp,
3170		 const struct xfs_name *name),
3171	TP_ARGS(ip, dp, name),
3172	TP_STRUCT__entry(
3173		__field(dev_t, dev)
3174		__field(xfs_ino_t, ino)
3175		__field(xfs_ino_t, parent_ino)
3176		__field(unsigned int, parent_gen)
3177		__field(unsigned int, namelen)
3178		__dynamic_array(char, name, name->len)
3179	),
3180	TP_fast_assign(
3181		__entry->dev = ip->i_mount->m_super->s_dev;
3182		__entry->ino = ip->i_ino;
3183		__entry->parent_ino = dp->i_ino;
3184		__entry->parent_gen = VFS_IC(dp)->i_generation;
3185		__entry->namelen = name->len;
3186		memcpy(__get_str(name), name->name, name->len);
3187	),
3188	TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
3189		  MAJOR(__entry->dev), MINOR(__entry->dev),
3190		  __entry->ino,
3191		  __entry->parent_ino,
3192		  __entry->parent_gen,
3193		  __entry->namelen,
3194		  __get_str(name))
3195)
3196#define DEFINE_XREP_PPTR_SCAN_EVENT(name) \
3197DEFINE_EVENT(xrep_pptr_scan_class, name, \
3198	TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp, \
3199		 const struct xfs_name *name), \
3200	TP_ARGS(ip, dp, name))
3201DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentadd);
3202DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentremove);
3203
3204TRACE_EVENT(xrep_nlinks_set_record,
3205	TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
3206		 const struct xchk_nlink *obs),
3207	TP_ARGS(mp, ino, obs),
3208	TP_STRUCT__entry(
3209		__field(dev_t, dev)
3210		__field(xfs_ino_t, ino)
3211		__field(xfs_nlink_t, parents)
3212		__field(xfs_nlink_t, backrefs)
3213		__field(xfs_nlink_t, children)
3214	),
3215	TP_fast_assign(
3216		__entry->dev = mp->m_super->s_dev;
3217		__entry->ino = ino;
3218		__entry->parents = obs->parents;
3219		__entry->backrefs = obs->backrefs;
3220		__entry->children = obs->children;
3221	),
3222	TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
3223		  MAJOR(__entry->dev), MINOR(__entry->dev),
3224		  __entry->ino,
3225		  __entry->parents,
3226		  __entry->backrefs,
3227		  __entry->children)
3228);
3229
3230DECLARE_EVENT_CLASS(xrep_dentry_class,
3231	TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry),
3232	TP_ARGS(mp, dentry),
3233	TP_STRUCT__entry(
3234		__field(dev_t, dev)
3235		__field(unsigned int, flags)
3236		__field(unsigned long, ino)
3237		__field(bool, positive)
3238		__field(unsigned long, parent_ino)
3239		__field(unsigned int, namelen)
3240		__dynamic_array(char, name, dentry->d_name.len)
3241	),
3242	TP_fast_assign(
3243		__entry->dev = mp->m_super->s_dev;
3244		__entry->flags = dentry->d_flags;
3245		__entry->positive = d_is_positive(dentry);
3246		if (dentry->d_parent && d_inode(dentry->d_parent))
3247			__entry->parent_ino = d_inode(dentry->d_parent)->i_ino;
3248		else
3249			__entry->parent_ino = -1UL;
3250		__entry->ino = d_inode(dentry) ? d_inode(dentry)->i_ino : 0;
3251		__entry->namelen = dentry->d_name.len;
3252		memcpy(__get_str(name), dentry->d_name.name, dentry->d_name.len);
3253	),
3254	TP_printk("dev %d:%d flags 0x%x positive? %d parent_ino 0x%lx ino 0x%lx name '%.*s'",
3255		  MAJOR(__entry->dev), MINOR(__entry->dev),
3256		  __entry->flags,
3257		  __entry->positive,
3258		  __entry->parent_ino,
3259		  __entry->ino,
3260		  __entry->namelen,
3261		  __get_str(name))
3262);
3263#define DEFINE_REPAIR_DENTRY_EVENT(name) \
3264DEFINE_EVENT(xrep_dentry_class, name, \
3265	TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry), \
3266	TP_ARGS(mp, dentry))
3267DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_child);
3268DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_invalidate_child);
3269DEFINE_REPAIR_DENTRY_EVENT(xrep_dirtree_delete_child);
3270
3271TRACE_EVENT(xrep_symlink_salvage_target,
3272	TP_PROTO(struct xfs_inode *ip, char *target, unsigned int targetlen),
3273	TP_ARGS(ip, target, targetlen),
3274	TP_STRUCT__entry(
3275		__field(dev_t, dev)
3276		__field(xfs_ino_t, ino)
3277		__field(unsigned int, targetlen)
3278		__dynamic_array(char, target, targetlen + 1)
3279	),
3280	TP_fast_assign(
3281		__entry->dev = ip->i_mount->m_super->s_dev;
3282		__entry->ino = ip->i_ino;
3283		__entry->targetlen = targetlen;
3284		memcpy(__get_str(target), target, targetlen);
3285		__get_str(target)[targetlen] = 0;
3286	),
3287	TP_printk("dev %d:%d ip 0x%llx target '%.*s'",
3288		  MAJOR(__entry->dev), MINOR(__entry->dev),
3289		  __entry->ino,
3290		  __entry->targetlen,
3291		  __get_str(target))
3292);
3293
3294DECLARE_EVENT_CLASS(xrep_symlink_class,
3295	TP_PROTO(struct xfs_inode *ip),
3296	TP_ARGS(ip),
3297	TP_STRUCT__entry(
3298		__field(dev_t, dev)
3299		__field(xfs_ino_t, ino)
3300	),
3301	TP_fast_assign(
3302		__entry->dev = ip->i_mount->m_super->s_dev;
3303		__entry->ino = ip->i_ino;
3304	),
3305	TP_printk("dev %d:%d ip 0x%llx",
3306		  MAJOR(__entry->dev), MINOR(__entry->dev),
3307		  __entry->ino)
3308);
3309
3310#define DEFINE_XREP_SYMLINK_EVENT(name) \
3311DEFINE_EVENT(xrep_symlink_class, name, \
3312	TP_PROTO(struct xfs_inode *ip), \
3313	TP_ARGS(ip))
3314DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_rebuild);
3315DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_reset_fork);
3316
3317TRACE_EVENT(xrep_iunlink_visit,
3318	TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
3319		 xfs_agino_t bucket_agino, struct xfs_inode *ip),
3320	TP_ARGS(pag, bucket, bucket_agino, ip),
3321	TP_STRUCT__entry(
3322		__field(dev_t, dev)
3323		__field(xfs_agnumber_t, agno)
3324		__field(xfs_agino_t, agino)
3325		__field(unsigned int, bucket)
3326		__field(xfs_agino_t, bucket_agino)
3327		__field(xfs_agino_t, prev_agino)
3328		__field(xfs_agino_t, next_agino)
3329	),
3330	TP_fast_assign(
3331		__entry->dev = pag->pag_mount->m_super->s_dev;
3332		__entry->agno = pag->pag_agno;
3333		__entry->agino = XFS_INO_TO_AGINO(pag->pag_mount, ip->i_ino);
3334		__entry->bucket = bucket;
3335		__entry->bucket_agino = bucket_agino;
3336		__entry->prev_agino = ip->i_prev_unlinked;
3337		__entry->next_agino = ip->i_next_unlinked;
3338	),
3339	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x bucket_agino 0x%x prev_agino 0x%x next_agino 0x%x",
3340		  MAJOR(__entry->dev), MINOR(__entry->dev),
3341		  __entry->agno,
3342		  __entry->bucket,
3343		  __entry->agino,
3344		  __entry->bucket_agino,
3345		  __entry->prev_agino,
3346		  __entry->next_agino)
3347);
3348
3349TRACE_EVENT(xrep_iunlink_reload_next,
3350	TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3351	TP_ARGS(ip, prev_agino),
3352	TP_STRUCT__entry(
3353		__field(dev_t, dev)
3354		__field(xfs_agnumber_t, agno)
3355		__field(xfs_agino_t, agino)
3356		__field(xfs_agino_t, old_prev_agino)
3357		__field(xfs_agino_t, prev_agino)
3358		__field(xfs_agino_t, next_agino)
3359		__field(unsigned int, nlink)
3360	),
3361	TP_fast_assign(
3362		__entry->dev = ip->i_mount->m_super->s_dev;
3363		__entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3364		__entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3365		__entry->old_prev_agino = ip->i_prev_unlinked;
3366		__entry->prev_agino = prev_agino;
3367		__entry->next_agino = ip->i_next_unlinked;
3368		__entry->nlink = VFS_I(ip)->i_nlink;
3369	),
3370	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x nlink %u old_prev_agino %u prev_agino 0x%x next_agino 0x%x",
3371		  MAJOR(__entry->dev), MINOR(__entry->dev),
3372		  __entry->agno,
3373		  __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3374		  __entry->agino,
3375		  __entry->nlink,
3376		  __entry->old_prev_agino,
3377		  __entry->prev_agino,
3378		  __entry->next_agino)
3379);
3380
3381TRACE_EVENT(xrep_iunlink_reload_ondisk,
3382	TP_PROTO(struct xfs_inode *ip),
3383	TP_ARGS(ip),
3384	TP_STRUCT__entry(
3385		__field(dev_t, dev)
3386		__field(xfs_agnumber_t, agno)
3387		__field(xfs_agino_t, agino)
3388		__field(unsigned int, nlink)
3389		__field(xfs_agino_t, next_agino)
3390	),
3391	TP_fast_assign(
3392		__entry->dev = ip->i_mount->m_super->s_dev;
3393		__entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3394		__entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3395		__entry->nlink = VFS_I(ip)->i_nlink;
3396		__entry->next_agino = ip->i_next_unlinked;
3397	),
3398	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x nlink %u next_agino 0x%x",
3399		  MAJOR(__entry->dev), MINOR(__entry->dev),
3400		  __entry->agno,
3401		  __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3402		  __entry->agino,
3403		  __entry->nlink,
3404		  __entry->next_agino)
3405);
3406
3407TRACE_EVENT(xrep_iunlink_walk_ondisk_bucket,
3408	TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
3409		 xfs_agino_t prev_agino, xfs_agino_t next_agino),
3410	TP_ARGS(pag, bucket, prev_agino, next_agino),
3411	TP_STRUCT__entry(
3412		__field(dev_t, dev)
3413		__field(xfs_agnumber_t, agno)
3414		__field(unsigned int, bucket)
3415		__field(xfs_agino_t, prev_agino)
3416		__field(xfs_agino_t, next_agino)
3417	),
3418	TP_fast_assign(
3419		__entry->dev = pag->pag_mount->m_super->s_dev;
3420		__entry->agno = pag->pag_agno;
3421		__entry->bucket = bucket;
3422		__entry->prev_agino = prev_agino;
3423		__entry->next_agino = next_agino;
3424	),
3425	TP_printk("dev %d:%d agno 0x%x bucket %u prev_agino 0x%x next_agino 0x%x",
3426		  MAJOR(__entry->dev), MINOR(__entry->dev),
3427		  __entry->agno,
3428		  __entry->bucket,
3429		  __entry->prev_agino,
3430		  __entry->next_agino)
3431);
3432
3433DECLARE_EVENT_CLASS(xrep_iunlink_resolve_class,
3434	TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
3435		 xfs_agino_t prev_agino, xfs_agino_t next_agino),
3436	TP_ARGS(pag, bucket, prev_agino, next_agino),
3437	TP_STRUCT__entry(
3438		__field(dev_t, dev)
3439		__field(xfs_agnumber_t, agno)
3440		__field(unsigned int, bucket)
3441		__field(xfs_agino_t, prev_agino)
3442		__field(xfs_agino_t, next_agino)
3443	),
3444	TP_fast_assign(
3445		__entry->dev = pag->pag_mount->m_super->s_dev;
3446		__entry->agno = pag->pag_agno;
3447		__entry->bucket = bucket;
3448		__entry->prev_agino = prev_agino;
3449		__entry->next_agino = next_agino;
3450	),
3451	TP_printk("dev %d:%d agno 0x%x bucket %u prev_agino 0x%x next_agino 0x%x",
3452		  MAJOR(__entry->dev), MINOR(__entry->dev),
3453		  __entry->agno,
3454		  __entry->bucket,
3455		  __entry->prev_agino,
3456		  __entry->next_agino)
3457);
3458#define DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(name) \
3459DEFINE_EVENT(xrep_iunlink_resolve_class, name, \
3460	TP_PROTO(struct xfs_perag *pag, unsigned int bucket, \
3461		 xfs_agino_t prev_agino, xfs_agino_t next_agino), \
3462	TP_ARGS(pag, bucket, prev_agino, next_agino))
3463DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_uncached);
3464DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_wronglist);
3465DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_nolist);
3466DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_ok);
3467
3468TRACE_EVENT(xrep_iunlink_relink_next,
3469	TP_PROTO(struct xfs_inode *ip, xfs_agino_t next_agino),
3470	TP_ARGS(ip, next_agino),
3471	TP_STRUCT__entry(
3472		__field(dev_t, dev)
3473		__field(xfs_agnumber_t, agno)
3474		__field(xfs_agino_t, agino)
3475		__field(xfs_agino_t, next_agino)
3476		__field(xfs_agino_t, new_next_agino)
3477	),
3478	TP_fast_assign(
3479		__entry->dev = ip->i_mount->m_super->s_dev;
3480		__entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3481		__entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3482		__entry->next_agino = ip->i_next_unlinked;
3483		__entry->new_next_agino = next_agino;
3484	),
3485	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x -> 0x%x",
3486		  MAJOR(__entry->dev), MINOR(__entry->dev),
3487		  __entry->agno,
3488		  __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3489		  __entry->agino,
3490		  __entry->next_agino,
3491		  __entry->new_next_agino)
3492);
3493
3494TRACE_EVENT(xrep_iunlink_relink_prev,
3495	TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3496	TP_ARGS(ip, prev_agino),
3497	TP_STRUCT__entry(
3498		__field(dev_t, dev)
3499		__field(xfs_agnumber_t, agno)
3500		__field(xfs_agino_t, agino)
3501		__field(xfs_agino_t, prev_agino)
3502		__field(xfs_agino_t, new_prev_agino)
3503	),
3504	TP_fast_assign(
3505		__entry->dev = ip->i_mount->m_super->s_dev;
3506		__entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3507		__entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3508		__entry->prev_agino = ip->i_prev_unlinked;
3509		__entry->new_prev_agino = prev_agino;
3510	),
3511	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x prev_agino 0x%x -> 0x%x",
3512		  MAJOR(__entry->dev), MINOR(__entry->dev),
3513		  __entry->agno,
3514		  __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3515		  __entry->agino,
3516		  __entry->prev_agino,
3517		  __entry->new_prev_agino)
3518);
3519
3520TRACE_EVENT(xrep_iunlink_add_to_bucket,
3521	TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
3522		 xfs_agino_t agino, xfs_agino_t curr_head),
3523	TP_ARGS(pag, bucket, agino, curr_head),
3524	TP_STRUCT__entry(
3525		__field(dev_t, dev)
3526		__field(xfs_agnumber_t, agno)
3527		__field(unsigned int, bucket)
3528		__field(xfs_agino_t, agino)
3529		__field(xfs_agino_t, next_agino)
3530	),
3531	TP_fast_assign(
3532		__entry->dev = pag->pag_mount->m_super->s_dev;
3533		__entry->agno = pag->pag_agno;
3534		__entry->bucket = bucket;
3535		__entry->agino = agino;
3536		__entry->next_agino = curr_head;
3537	),
3538	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x",
3539		  MAJOR(__entry->dev), MINOR(__entry->dev),
3540		  __entry->agno,
3541		  __entry->bucket,
3542		  __entry->agino,
3543		  __entry->next_agino)
3544);
3545
3546TRACE_EVENT(xrep_iunlink_commit_bucket,
3547	TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
3548		 xfs_agino_t old_agino, xfs_agino_t agino),
3549	TP_ARGS(pag, bucket, old_agino, agino),
3550	TP_STRUCT__entry(
3551		__field(dev_t, dev)
3552		__field(xfs_agnumber_t, agno)
3553		__field(unsigned int, bucket)
3554		__field(xfs_agino_t, old_agino)
3555		__field(xfs_agino_t, agino)
3556	),
3557	TP_fast_assign(
3558		__entry->dev = pag->pag_mount->m_super->s_dev;
3559		__entry->agno = pag->pag_agno;
3560		__entry->bucket = bucket;
3561		__entry->old_agino = old_agino;
3562		__entry->agino = agino;
3563	),
3564	TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x -> 0x%x",
3565		  MAJOR(__entry->dev), MINOR(__entry->dev),
3566		  __entry->agno,
3567		  __entry->bucket,
3568		  __entry->old_agino,
3569		  __entry->agino)
3570);
3571
3572DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xrep_dirpath_set_outcome);
3573DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_delete_path);
3574DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_create_adoption);
3575DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xrep_dirtree_decided_fate);
3576
3577#endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
3578
3579#endif /* _TRACE_XFS_SCRUB_TRACE_H */
3580
3581#undef TRACE_INCLUDE_PATH
3582#define TRACE_INCLUDE_PATH .
3583#define TRACE_INCLUDE_FILE scrub/trace
3584#include <trace/define_trace.h>
3585