1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017-2023 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <djwong@kernel.org>
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.
11 #define TRACE_SYSTEM xfs_scrub
13 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define _TRACE_XFS_SCRUB_TRACE_H
16 #include <linux/tracepoint.h>
18 #include "xfs_quota_defs.h"
23 struct xfarray_sortinfo;
27 struct xchk_fscounters;
28 struct xfs_rmap_update_params;
29 struct xfs_parent_rec;
30 enum xchk_dirpath_outcome;
32 struct xchk_dirtree_outcomes;
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
40 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
41 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
54 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
55 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
56 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
57 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
58 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
59 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
60 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
61 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
62 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
63 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
64 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
65 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
66 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
67 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
68 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_QUOTACHECK);
69 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_NLINKS);
70 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_HEALTHY);
71 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIRTREE);
72 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BARRIER);
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" }
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" }
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" }
128 TRACE_DEFINE_ENUM(XFS_RMAP_MAP);
129 TRACE_DEFINE_ENUM(XFS_RMAP_MAP_SHARED);
130 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP);
131 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP_SHARED);
132 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT);
133 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT_SHARED);
134 TRACE_DEFINE_ENUM(XFS_RMAP_ALLOC);
135 TRACE_DEFINE_ENUM(XFS_RMAP_FREE);
137 DECLARE_EVENT_CLASS(xchk_class,
138 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
140 TP_ARGS(ip, sm, error),
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)
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;
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),
164 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
168 __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
171 #define DEFINE_SCRUB_EVENT(name) \
172 DEFINE_EVENT(xchk_class, name, \
173 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
175 TP_ARGS(ip, sm, error))
177 DEFINE_SCRUB_EVENT(xchk_start);
178 DEFINE_SCRUB_EVENT(xchk_done);
179 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
180 DEFINE_SCRUB_EVENT(xchk_dirtree_start);
181 DEFINE_SCRUB_EVENT(xchk_dirtree_done);
182 DEFINE_SCRUB_EVENT(xrep_attempt);
183 DEFINE_SCRUB_EVENT(xrep_done);
185 DECLARE_EVENT_CLASS(xchk_fsgate_class,
186 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
187 TP_ARGS(sc, fsgate_flags),
190 __field(unsigned int, type)
191 __field(unsigned int, fsgate_flags)
194 __entry->dev = sc->mp->m_super->s_dev;
195 __entry->type = sc->sm->sm_type;
196 __entry->fsgate_flags = fsgate_flags;
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))
204 #define DEFINE_SCRUB_FSHOOK_EVENT(name) \
205 DEFINE_EVENT(xchk_fsgate_class, name, \
206 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
207 TP_ARGS(sc, fsgates_flags))
209 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
210 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
212 DECLARE_EVENT_CLASS(xchk_vector_head_class,
213 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead),
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)
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;
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),
245 #define DEFINE_SCRUBV_HEAD_EVENT(name) \
246 DEFINE_EVENT(xchk_vector_head_class, name, \
247 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead), \
250 DEFINE_SCRUBV_HEAD_EVENT(xchk_scrubv_start);
252 DECLARE_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),
258 __field(unsigned int, vec_nr)
259 __field(unsigned int, vec_type)
260 __field(unsigned int, vec_flags)
261 __field(int, vec_ret)
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;
270 TP_printk("dev %d:%d vec[%u] type %s flags %s ret %d",
271 MAJOR(__entry->dev), MINOR(__entry->dev),
273 __print_symbolic(__entry->vec_type, XFS_SCRUB_TYPE_STRINGS),
274 __print_flags(__entry->vec_flags, "|", XFS_SCRUB_FLAG_STRINGS),
277 #define DEFINE_SCRUBV_EVENT(name) \
278 DEFINE_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))
283 DEFINE_SCRUBV_EVENT(xchk_scrubv_barrier_fail);
284 DEFINE_SCRUBV_EVENT(xchk_scrubv_item);
285 DEFINE_SCRUBV_EVENT(xchk_scrubv_outcome);
287 TRACE_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),
293 __field(unsigned int, type)
294 __field(xfs_agnumber_t, agno)
295 __field(xfs_agblock_t, bno)
297 __field(void *, ret_ip)
300 __entry->dev = sc->mp->m_super->s_dev;
301 __entry->type = sc->sm->sm_type;
302 __entry->agno = agno;
304 __entry->error = error;
305 __entry->ret_ip = ret_ip;
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),
316 TRACE_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),
322 __field(xfs_ino_t, ino)
323 __field(int, whichfork)
324 __field(unsigned int, type)
325 __field(xfs_fileoff_t, offset)
327 __field(void *, ret_ip)
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;
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),
341 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
342 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
348 DECLARE_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),
353 __field(unsigned int, type)
354 __field(xfs_agnumber_t, agno)
355 __field(xfs_agblock_t, agbno)
356 __field(void *, ret_ip)
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;
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),
373 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
374 DEFINE_EVENT(xchk_block_error_class, name, \
375 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
377 TP_ARGS(sc, daddr, ret_ip))
379 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
380 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
381 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
383 DECLARE_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),
388 __field(xfs_ino_t, ino)
389 __field(unsigned int, type)
390 __field(void *, ret_ip)
393 __entry->dev = sc->mp->m_super->s_dev;
395 __entry->type = sc->sm->sm_type;
396 __entry->ret_ip = ret_ip;
398 TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
399 MAJOR(__entry->dev), MINOR(__entry->dev),
401 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
405 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
406 DEFINE_EVENT(xchk_ino_error_class, name, \
407 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
409 TP_ARGS(sc, ino, ret_ip))
411 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
412 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
413 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
415 DECLARE_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),
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)
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;
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),
438 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
439 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
444 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
445 DEFINE_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))
450 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
451 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
452 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_preen);
454 #ifdef CONFIG_XFS_QUOTA
455 DECLARE_EVENT_CLASS(xchk_dqiter_class,
456 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id),
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)
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;
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),
492 #define DEFINE_SCRUB_DQITER_EVENT(name) \
493 DEFINE_EVENT(xchk_dqiter_class, name, \
494 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id), \
496 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_revalidate_bmap);
497 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_bmap);
498 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_incore);
499 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter);
501 TRACE_EVENT(xchk_qcheck_error,
502 TP_PROTO(struct xfs_scrub *sc, xfs_dqtype_t dqtype, xfs_dqid_t id,
504 TP_ARGS(sc, dqtype, id, ret_ip),
507 __field(xfs_dqtype_t, dqtype)
508 __field(xfs_dqid_t, id)
509 __field(void *, ret_ip)
512 __entry->dev = sc->mp->m_super->s_dev;
513 __entry->dqtype = dqtype;
515 __entry->ret_ip = ret_ip;
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),
523 #endif /* CONFIG_XFS_QUOTA */
525 TRACE_EVENT(xchk_incomplete,
526 TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
530 __field(unsigned int, type)
531 __field(void *, ret_ip)
534 __entry->dev = sc->mp->m_super->s_dev;
535 __entry->type = sc->sm->sm_type;
536 __entry->ret_ip = ret_ip;
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),
544 TRACE_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),
550 __field(unsigned int, type)
551 __string(name, cur->bc_ops->name)
553 __field(xfs_agnumber_t, agno)
554 __field(xfs_agblock_t, bno)
557 __field(void *, ret_ip)
560 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
562 __entry->dev = sc->mp->m_super->s_dev;
563 __entry->type = sc->sm->sm_type;
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;
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),
584 TRACE_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),
590 __field(xfs_ino_t, ino)
591 __field(int, whichfork)
592 __field(unsigned int, type)
593 __string(name, cur->bc_ops->name)
596 __field(xfs_agnumber_t, agno)
597 __field(xfs_agblock_t, bno)
599 __field(void *, ret_ip)
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;
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;
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),
618 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
619 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
629 TRACE_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),
635 __field(unsigned int, type)
636 __string(name, cur->bc_ops->name)
638 __field(xfs_agnumber_t, agno)
639 __field(xfs_agblock_t, bno)
641 __field(void *, ret_ip)
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;
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;
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),
665 TRACE_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),
671 __field(xfs_ino_t, ino)
672 __field(int, whichfork)
673 __field(unsigned int, type)
674 __string(name, cur->bc_ops->name)
676 __field(xfs_agnumber_t, agno)
677 __field(xfs_agblock_t, bno)
679 __field(void *, ret_ip)
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;
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;
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),
697 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
698 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
707 DECLARE_EVENT_CLASS(xchk_sbtree_class,
708 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
710 TP_ARGS(sc, cur, level),
714 __string(name, cur->bc_ops->name)
715 __field(xfs_agnumber_t, agno)
716 __field(xfs_agblock_t, bno)
718 __field(int, nlevels)
722 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
724 __entry->dev = sc->mp->m_super->s_dev;
725 __entry->type = sc->sm->sm_type;
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;
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),
743 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
744 DEFINE_EVENT(xchk_sbtree_class, name, \
745 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
747 TP_ARGS(sc, cur, level))
749 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
750 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
752 TRACE_EVENT(xchk_xref_error,
753 TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
754 TP_ARGS(sc, error, ret_ip),
759 __field(void *, ret_ip)
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;
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),
774 TRACE_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),
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)
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;
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),
814 __entry->cluster_mask,
816 __entry->cluster_ino)
819 TRACE_EVENT(xchk_inode_is_allocated,
820 TP_PROTO(struct xfs_inode *ip),
824 __field(xfs_ino_t, ino)
825 __field(unsigned long, iflags)
826 __field(umode_t, mode)
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;
834 TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
835 MAJOR(__entry->dev), MINOR(__entry->dev),
841 TRACE_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),
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)
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;
865 TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
866 MAJOR(__entry->dev), MINOR(__entry->dev),
868 __entry->icount_calculated,
870 __entry->ifree_calculated,
871 __entry->fdblocks_sb,
872 __entry->fdblocks_calculated,
876 TRACE_EVENT(xchk_fscounters_within_range,
877 TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
879 TP_ARGS(mp, expected, curr_value, old_value),
882 __field(uint64_t, expected)
883 __field(int64_t, curr_value)
884 __field(int64_t, old_value)
887 __entry->dev = mp->m_super->s_dev;
888 __entry->expected = expected;
889 __entry->curr_value = curr_value;
890 __entry->old_value = old_value;
892 TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
893 MAJOR(__entry->dev), MINOR(__entry->dev),
899 DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
900 TP_PROTO(struct xfs_scrub *sc, int error),
904 __field(unsigned int, type)
908 __entry->dev = sc->mp->m_super->s_dev;
909 __entry->type = sc->sm->sm_type;
910 __entry->error = error;
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),
917 #define DEFINE_XCHK_FSFREEZE_EVENT(name) \
918 DEFINE_EVENT(xchk_fsfreeze_class, name, \
919 TP_PROTO(struct xfs_scrub *sc, int error), \
921 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
922 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
924 TRACE_EVENT(xchk_refcount_incorrect,
925 TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
927 TP_ARGS(pag, irec, seen),
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)
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;
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),
949 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
956 TRACE_EVENT(xfile_create,
957 TP_PROTO(struct xfile *xf),
961 __field(unsigned long, ino)
962 __array(char, pathname, 256)
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);
973 strncpy(__entry->pathname, path, sizeof(__entry->pathname));
975 TP_printk("xfino 0x%lx path '%s'",
980 TRACE_EVENT(xfile_destroy,
981 TP_PROTO(struct xfile *xf),
984 __field(unsigned long, ino)
985 __field(unsigned long long, bytes)
986 __field(loff_t, size)
989 struct inode *inode = file_inode(xf->file);
991 __entry->ino = inode->i_ino;
992 __entry->bytes = inode->i_blocks << SECTOR_SHIFT;
993 __entry->size = i_size_read(inode);
995 TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
1001 DECLARE_EVENT_CLASS(xfile_class,
1002 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
1003 TP_ARGS(xf, pos, bytecount),
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)
1012 struct inode *inode = file_inode(xf->file);
1014 __entry->ino = inode->i_ino;
1015 __entry->bytes_used = inode->i_blocks << SECTOR_SHIFT;
1017 __entry->size = i_size_read(inode);
1018 __entry->bytecount = bytecount;
1020 TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
1022 __entry->bytes_used,
1027 #define DEFINE_XFILE_EVENT(name) \
1028 DEFINE_EVENT(xfile_class, name, \
1029 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
1030 TP_ARGS(xf, pos, bytecount))
1031 DEFINE_XFILE_EVENT(xfile_load);
1032 DEFINE_XFILE_EVENT(xfile_store);
1033 DEFINE_XFILE_EVENT(xfile_seek_data);
1034 DEFINE_XFILE_EVENT(xfile_get_folio);
1035 DEFINE_XFILE_EVENT(xfile_put_folio);
1036 DEFINE_XFILE_EVENT(xfile_discard);
1038 TRACE_EVENT(xfarray_create,
1039 TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
1040 TP_ARGS(xfa, required_capacity),
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)
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;
1055 TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
1058 __entry->required_capacity,
1060 __entry->obj_size_log)
1063 TRACE_EVENT(xfarray_isort,
1064 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1065 TP_ARGS(si, lo, hi),
1067 __field(unsigned long, ino)
1068 __field(unsigned long long, lo)
1069 __field(unsigned long long, hi)
1072 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1076 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1080 __entry->hi - __entry->lo)
1083 TRACE_EVENT(xfarray_foliosort,
1084 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1085 TP_ARGS(si, lo, hi),
1087 __field(unsigned long, ino)
1088 __field(unsigned long long, lo)
1089 __field(unsigned long long, hi)
1092 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1096 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1100 __entry->hi - __entry->lo)
1103 TRACE_EVENT(xfarray_qsort,
1104 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1105 TP_ARGS(si, lo, hi),
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)
1114 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1117 __entry->stack_depth = si->stack_depth;
1118 __entry->max_stack_depth = si->max_stack_depth;
1120 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
1124 __entry->hi - __entry->lo,
1125 __entry->stack_depth,
1126 __entry->max_stack_depth)
1129 TRACE_EVENT(xfarray_sort,
1130 TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
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)
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;
1146 TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
1150 __entry->max_stack_depth,
1154 TRACE_EVENT(xfarray_sort_scan,
1155 TP_PROTO(struct xfarray_sortinfo *si, unsigned long long idx),
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)
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;
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;
1178 __entry->folio_pos = 0;
1179 __entry->folio_bytes = 0;
1180 __entry->first_idx = 0;
1181 __entry->last_idx = 0;
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",
1190 __entry->folio_bytes,
1195 TRACE_EVENT(xfarray_sort_stats,
1196 TP_PROTO(struct xfarray_sortinfo *si, int error),
1199 __field(unsigned long, ino)
1201 __field(unsigned long long, loads)
1202 __field(unsigned long long, stores)
1203 __field(unsigned long long, compares)
1204 __field(unsigned long long, heapsorts)
1206 __field(unsigned int, max_stack_depth)
1207 __field(unsigned int, max_stack_used)
1211 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1213 __entry->loads = si->loads;
1214 __entry->stores = si->stores;
1215 __entry->compares = si->compares;
1216 __entry->heapsorts = si->heapsorts;
1218 __entry->max_stack_depth = si->max_stack_depth;
1219 __entry->max_stack_used = si->max_stack_used;
1220 __entry->error = error;
1224 "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1226 "xfino 0x%lx stack_depth %u/%u error %d",
1235 __entry->max_stack_used,
1236 __entry->max_stack_depth,
1240 #ifdef CONFIG_XFS_RT
1241 TRACE_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),
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)
1256 __entry->dev = mp->m_super->s_dev;
1257 __entry->rtdev = mp->m_rtdev_targp->bt_dev;
1258 __entry->start = start;
1262 __entry->value = value;
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),
1273 #endif /* CONFIG_XFS_RT */
1275 DECLARE_EVENT_CLASS(xchk_iscan_class,
1276 TP_PROTO(struct xchk_iscan *iscan),
1280 __field(xfs_ino_t, cursor)
1281 __field(xfs_ino_t, visited)
1284 __entry->dev = iscan->sc->mp->m_super->s_dev;
1285 __entry->cursor = iscan->cursor_ino;
1286 __entry->visited = iscan->__visited_ino;
1288 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx",
1289 MAJOR(__entry->dev), MINOR(__entry->dev),
1293 #define DEFINE_ISCAN_EVENT(name) \
1294 DEFINE_EVENT(xchk_iscan_class, name, \
1295 TP_PROTO(struct xchk_iscan *iscan), \
1297 DEFINE_ISCAN_EVENT(xchk_iscan_move_cursor);
1298 DEFINE_ISCAN_EVENT(xchk_iscan_visit);
1299 DEFINE_ISCAN_EVENT(xchk_iscan_skip);
1300 DEFINE_ISCAN_EVENT(xchk_iscan_advance_ag);
1302 DECLARE_EVENT_CLASS(xchk_iscan_ino_class,
1303 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino),
1304 TP_ARGS(iscan, ino),
1307 __field(xfs_ino_t, startino)
1308 __field(xfs_ino_t, cursor)
1309 __field(xfs_ino_t, visited)
1310 __field(xfs_ino_t, ino)
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;
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),
1326 #define DEFINE_ISCAN_INO_EVENT(name) \
1327 DEFINE_EVENT(xchk_iscan_ino_class, name, \
1328 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino), \
1329 TP_ARGS(iscan, ino))
1330 DEFINE_ISCAN_INO_EVENT(xchk_iscan_want_live_update);
1331 DEFINE_ISCAN_INO_EVENT(xchk_iscan_start);
1333 TRACE_EVENT(xchk_iscan_iget,
1334 TP_PROTO(struct xchk_iscan *iscan, int error),
1335 TP_ARGS(iscan, error),
1338 __field(xfs_ino_t, cursor)
1339 __field(xfs_ino_t, visited)
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;
1348 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx error %d",
1349 MAJOR(__entry->dev), MINOR(__entry->dev),
1355 TRACE_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),
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)
1370 __entry->dev = mp->m_super->s_dev;
1371 __entry->cursor = iscan->cursor_ino;
1372 __entry->visited = iscan->__visited_ino;
1374 __entry->avail = avail;
1375 __entry->unavail = hweight64(iscan->__skipped_inomask);
1376 __entry->batch_ino = iscan->__batch_ino;
1377 __entry->skipmask = iscan->__skipped_inomask;
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),
1390 DECLARE_EVENT_CLASS(xchk_iscan_retry_wait_class,
1391 TP_PROTO(struct xchk_iscan *iscan),
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)
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;
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),
1414 __entry->iget_timeout,
1415 __entry->retry_delay)
1417 #define DEFINE_ISCAN_RETRY_WAIT_EVENT(name) \
1418 DEFINE_EVENT(xchk_iscan_retry_wait_class, name, \
1419 TP_PROTO(struct xchk_iscan *iscan), \
1421 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_iget_retry_wait);
1422 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_agi_retry_wait);
1424 TRACE_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),
1430 __field(xfs_ino_t, dir)
1431 __field(xfs_ino_t, ino)
1432 __field(unsigned int, namelen)
1433 __dynamic_array(char, name, name->len)
1436 __entry->dev = mp->m_super->s_dev;
1437 __entry->dir = dp->i_ino;
1439 __entry->namelen = name->len;
1440 memcpy(__get_str(name), name->name, name->len);
1442 TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1443 MAJOR(__entry->dev), MINOR(__entry->dev),
1450 TRACE_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),
1457 __field(xfs_ino_t, dir)
1458 __field(xfs_ino_t, ino)
1459 __field(unsigned int, namelen)
1460 __dynamic_array(char, name, name->len)
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);
1469 TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1470 MAJOR(__entry->dev), MINOR(__entry->dev),
1477 TRACE_EVENT(xchk_nlinks_collect_metafile,
1478 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino),
1482 __field(xfs_ino_t, ino)
1485 __entry->dev = mp->m_super->s_dev;
1488 TP_printk("dev %d:%d ino 0x%llx",
1489 MAJOR(__entry->dev), MINOR(__entry->dev),
1493 TRACE_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),
1500 __field(xfs_ino_t, dir)
1501 __field(int, action)
1502 __field(xfs_ino_t, ino)
1504 __field(unsigned int, namelen)
1505 __dynamic_array(char, name, namelen)
1508 __entry->dev = mp->m_super->s_dev;
1509 __entry->dir = dp ? dp->i_ino : NULLFSINO;
1510 __entry->action = action;
1512 __entry->delta = delta;
1513 __entry->namelen = namelen;
1514 memcpy(__get_str(name), name, namelen);
1516 TP_printk("dev %d:%d dir 0x%llx ino 0x%llx nlink_delta %d name '%.*s'",
1517 MAJOR(__entry->dev), MINOR(__entry->dev),
1525 TRACE_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),
1531 __field(xfs_ino_t, ino)
1532 __field(xfs_nlink_t, parents)
1533 __field(xfs_nlink_t, backrefs)
1534 __field(xfs_nlink_t, children)
1537 __entry->dev = mp->m_super->s_dev;
1539 __entry->parents = live->parents;
1540 __entry->backrefs = live->backrefs;
1541 __entry->children = live->children;
1543 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
1544 MAJOR(__entry->dev), MINOR(__entry->dev),
1551 TRACE_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),
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)
1567 __entry->dev = mp->m_super->s_dev;
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;
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),
1579 __entry->parents_delta,
1581 __entry->backrefs_delta,
1583 __entry->children_delta,
1587 DECLARE_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),
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)
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;
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),
1612 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
1618 #define DEFINE_SCRUB_NLINKS_DIFF_EVENT(name) \
1619 DEFINE_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))
1623 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xchk_nlinks_compare_inode);
1625 DECLARE_EVENT_CLASS(xchk_pptr_class,
1626 TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name,
1628 TP_ARGS(ip, name, far_ino),
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)
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;
1643 TP_printk("dev %d:%d ino 0x%llx name '%.*s' far_ino 0x%llx",
1644 MAJOR(__entry->dev), MINOR(__entry->dev),
1650 #define DEFINE_XCHK_PPTR_EVENT(name) \
1651 DEFINE_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))
1655 DEFINE_XCHK_PPTR_EVENT(xchk_dir_defer);
1656 DEFINE_XCHK_PPTR_EVENT(xchk_dir_slowpath);
1657 DEFINE_XCHK_PPTR_EVENT(xchk_dir_ultraslowpath);
1658 DEFINE_XCHK_PPTR_EVENT(xchk_parent_defer);
1659 DEFINE_XCHK_PPTR_EVENT(xchk_parent_slowpath);
1660 DEFINE_XCHK_PPTR_EVENT(xchk_parent_ultraslowpath);
1662 DECLARE_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),
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)
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);
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),
1692 __entry->parent_ino,
1693 __entry->parent_gen,
1697 #define DEFINE_XCHK_DIRTREE_EVENT(name) \
1698 DEFINE_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))
1703 DEFINE_XCHK_DIRTREE_EVENT(xchk_dirtree_create_path);
1704 DEFINE_XCHK_DIRTREE_EVENT(xchk_dirpath_walk_upwards);
1706 DECLARE_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),
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)
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);
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),
1740 __entry->parent_ino,
1741 __entry->parent_gen,
1745 #define DEFINE_XCHK_DIRPATH_EVENT(name) \
1746 DEFINE_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))
1752 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_disappeared);
1753 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_badgen);
1754 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_nondir_parent);
1755 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_unlinked_parent);
1756 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_found_next_step);
1758 TRACE_DEFINE_ENUM(XCHK_DIRPATH_SCANNING);
1759 TRACE_DEFINE_ENUM(XCHK_DIRPATH_DELETE);
1760 TRACE_DEFINE_ENUM(XCHK_DIRPATH_CORRUPT);
1761 TRACE_DEFINE_ENUM(XCHK_DIRPATH_LOOP);
1762 TRACE_DEFINE_ENUM(XCHK_DIRPATH_STALE);
1763 TRACE_DEFINE_ENUM(XCHK_DIRPATH_OK);
1764 TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETING);
1765 TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETED);
1766 TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTING);
1767 TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTED);
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" }
1781 DECLARE_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),
1788 __field(unsigned long long, path_nr)
1789 __field(unsigned int, nr_steps)
1790 __field(unsigned int, outcome)
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;
1798 TP_printk("dev %d:%d path %llu steps %u outcome %s",
1799 MAJOR(__entry->dev), MINOR(__entry->dev),
1802 __print_symbolic(__entry->outcome, XCHK_DIRPATH_OUTCOME_STRINGS))
1804 #define DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(name) \
1805 DEFINE_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))
1810 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_set_outcome);
1811 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_evaluate_path);
1813 DECLARE_EVENT_CLASS(xchk_dirtree_evaluate_class,
1814 TP_PROTO(const struct xchk_dirtree *dl,
1815 const struct xchk_dirtree_outcomes *oc),
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)
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;
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),
1845 __entry->needs_adoption)
1847 #define DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(name) \
1848 DEFINE_EVENT(xchk_dirtree_evaluate_class, name, \
1849 TP_PROTO(const struct xchk_dirtree *dl, \
1850 const struct xchk_dirtree_outcomes *oc), \
1852 DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xchk_dirtree_evaluate);
1854 TRACE_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),
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)
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);
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),
1882 __entry->parent_ino,
1887 TRACE_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),
1894 __field(xfs_ino_t, parent_ino)
1895 __field(int, action)
1896 __field(xfs_ino_t, child_ino)
1898 __field(unsigned int, namelen)
1899 __dynamic_array(char, name, xname->len)
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);
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,
1919 /* repair tracepoints */
1920 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1922 DECLARE_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),
1927 __field(xfs_agnumber_t, agno)
1928 __field(xfs_agblock_t, agbno)
1929 __field(xfs_extlen_t, len)
1932 __entry->dev = pag->pag_mount->m_super->s_dev;
1933 __entry->agno = pag->pag_agno;
1934 __entry->agbno = agbno;
1937 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1938 MAJOR(__entry->dev), MINOR(__entry->dev),
1943 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
1944 DEFINE_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))
1947 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1948 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1949 DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1950 DEFINE_REPAIR_EXTENT_EVENT(xreap_bmapi_binval);
1951 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1953 DECLARE_EVENT_CLASS(xrep_reap_find_class,
1954 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len,
1956 TP_ARGS(pag, agbno, len, crosslinked),
1959 __field(xfs_agnumber_t, agno)
1960 __field(xfs_agblock_t, agbno)
1961 __field(xfs_extlen_t, len)
1962 __field(bool, crosslinked)
1965 __entry->dev = pag->pag_mount->m_super->s_dev;
1966 __entry->agno = pag->pag_agno;
1967 __entry->agbno = agbno;
1969 __entry->crosslinked = crosslinked;
1971 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
1972 MAJOR(__entry->dev), MINOR(__entry->dev),
1976 __entry->crosslinked ? 1 : 0)
1978 #define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
1979 DEFINE_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))
1983 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1984 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_bmapi_select);
1986 DECLARE_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),
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)
2001 __entry->dev = mp->m_super->s_dev;
2002 __entry->agno = agno;
2003 __entry->agbno = agbno;
2005 __entry->owner = owner;
2006 __entry->offset = offset;
2007 __entry->flags = flags;
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),
2018 #define DEFINE_REPAIR_RMAP_EVENT(name) \
2019 DEFINE_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))
2024 DEFINE_REPAIR_RMAP_EVENT(xrep_ibt_walk_rmap);
2025 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_walk_rmap);
2027 TRACE_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),
2033 __field(xfs_agnumber_t, agno)
2034 __field(xfs_agblock_t, startblock)
2035 __field(xfs_extlen_t, blockcount)
2038 __entry->dev = mp->m_super->s_dev;
2039 __entry->agno = agno;
2040 __entry->startblock = rec->ar_startblock;
2041 __entry->blockcount = rec->ar_blockcount;
2043 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2044 MAJOR(__entry->dev), MINOR(__entry->dev),
2046 __entry->startblock,
2047 __entry->blockcount)
2050 TRACE_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),
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)
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;
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),
2082 TRACE_EVENT(xrep_refc_found,
2083 TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *rec),
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)
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;
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),
2104 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
2105 __entry->startblock,
2106 __entry->blockcount,
2110 TRACE_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),
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)
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;
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),
2135 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2142 TRACE_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),
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)
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;
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),
2174 TRACE_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),
2180 __field(xfs_agnumber_t, agno)
2181 __field(xfs_agblock_t, agbno)
2182 __field(uint32_t, magic)
2183 __field(uint16_t, level)
2186 __entry->dev = mp->m_super->s_dev;
2187 __entry->agno = agno;
2188 __entry->agbno = agbno;
2189 __entry->magic = magic;
2190 __entry->level = level;
2192 TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
2193 MAJOR(__entry->dev), MINOR(__entry->dev),
2199 TRACE_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),
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)
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;
2220 TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
2221 MAJOR(__entry->dev), MINOR(__entry->dev),
2228 TRACE_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),
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)
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;
2249 TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
2250 MAJOR(__entry->dev), MINOR(__entry->dev),
2257 TRACE_EVENT(xrep_reset_counters,
2258 TP_PROTO(struct xfs_mount *mp, struct xchk_fscounters *fsc),
2262 __field(uint64_t, icount)
2263 __field(uint64_t, ifree)
2264 __field(uint64_t, fdblocks)
2265 __field(uint64_t, frextents)
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;
2274 TP_printk("dev %d:%d icount %llu ifree %llu fdblocks %llu frextents %llu",
2275 MAJOR(__entry->dev), MINOR(__entry->dev),
2282 DECLARE_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,
2286 TP_ARGS(mp, agno, agbno, len, owner),
2289 __field(xfs_agnumber_t, agno)
2290 __field(xfs_agblock_t, agbno)
2291 __field(xfs_extlen_t, len)
2292 __field(int64_t, owner)
2295 __entry->dev = mp->m_super->s_dev;
2296 __entry->agno = agno;
2297 __entry->agbno = agbno;
2299 __entry->owner = owner;
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),
2308 #define DEFINE_NEWBT_EXTENT_EVENT(name) \
2309 DEFINE_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, \
2313 TP_ARGS(mp, agno, agbno, len, owner))
2314 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_ag_blocks);
2315 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_file_blocks);
2316 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_free_blocks);
2317 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_claim_block);
2319 DECLARE_EVENT_CLASS(xrep_dinode_class,
2320 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip),
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)
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);
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),
2380 __entry->cowextsize)
2383 #define DEFINE_REPAIR_DINODE_EVENT(name) \
2384 DEFINE_EVENT(xrep_dinode_class, name, \
2385 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip), \
2387 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_header);
2388 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_mode);
2389 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_flags);
2390 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_size);
2391 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_extsize_hints);
2392 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_symlink);
2393 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dir);
2394 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_fixed);
2395 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_forks);
2396 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dfork);
2397 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_afork);
2398 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_ensure_forkoff);
2400 DECLARE_EVENT_CLASS(xrep_inode_class,
2401 TP_PROTO(struct xfs_scrub *sc),
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)
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;
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),
2440 #define DEFINE_REPAIR_INODE_EVENT(name) \
2441 DEFINE_EVENT(xrep_inode_class, name, \
2442 TP_PROTO(struct xfs_scrub *sc), \
2444 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockcounts);
2445 DEFINE_REPAIR_INODE_EVENT(xrep_inode_ids);
2446 DEFINE_REPAIR_INODE_EVENT(xrep_inode_flags);
2447 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockdir_size);
2448 DEFINE_REPAIR_INODE_EVENT(xrep_inode_sfdir_size);
2449 DEFINE_REPAIR_INODE_EVENT(xrep_inode_dir_size);
2450 DEFINE_REPAIR_INODE_EVENT(xrep_inode_fixed);
2452 TRACE_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),
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)
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;
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),
2482 __entry->data_blocks,
2484 __entry->attr_blocks,
2485 __entry->data_extents,
2486 __entry->rt_extents,
2487 __entry->attr_extents)
2490 TRACE_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),
2496 __field(xfs_ino_t, ino)
2497 __field(xfs_ino_t, parent_ino)
2498 __field(unsigned int, ftype)
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;
2506 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s'",
2507 MAJOR(__entry->dev), MINOR(__entry->dev),
2509 __entry->parent_ino,
2510 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR))
2513 TRACE_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),
2519 __field(xfs_ino_t, ino)
2520 __field(xfs_ino_t, parent_ino)
2521 __field(unsigned int, ftype)
2522 __field(unsigned int, found_ftype)
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;
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),
2534 __entry->parent_ino,
2535 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
2536 __print_symbolic(__entry->found_ftype, XFS_DIR3_FTYPE_STR))
2539 TRACE_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),
2545 __field(xfs_ino_t, ino)
2546 __field(xfs_fsblock_t, startblock)
2547 __field(xfs_fileoff_t, startoff)
2548 __field(xfs_filblks_t, blockcount)
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;
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),
2561 __entry->startblock,
2562 __entry->blockcount)
2565 TRACE_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),
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)
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;
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),
2593 __entry->startblock,
2594 __entry->blockcount,
2596 __entry->new_startblock,
2597 __entry->new_blockcount)
2600 TRACE_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),
2606 __field(xfs_agnumber_t, agno)
2607 __field(xfs_agblock_t, agbno)
2608 __field(xfs_extlen_t, blockcount)
2611 __entry->dev = pag->pag_mount->m_super->s_dev;
2612 __entry->agno = pag->pag_agno;
2613 __entry->agbno = agbno;
2614 __entry->blockcount = blockcount;
2616 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2617 MAJOR(__entry->dev), MINOR(__entry->dev),
2620 __entry->blockcount)
2623 #ifdef CONFIG_XFS_QUOTA
2624 DECLARE_EVENT_CLASS(xrep_dquot_class,
2625 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id),
2626 TP_ARGS(mp, type, id),
2629 __field(uint8_t, type)
2630 __field(uint32_t, id)
2633 __entry->dev = mp->m_super->s_dev;
2635 __entry->type = type;
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),
2643 #define DEFINE_XREP_DQUOT_EVENT(name) \
2644 DEFINE_EVENT(xrep_dquot_class, name, \
2645 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id), \
2646 TP_ARGS(mp, type, id))
2647 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item);
2648 DEFINE_XREP_DQUOT_EVENT(xrep_disk_dquot);
2649 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item_fill_bmap_hole);
2650 DEFINE_XREP_DQUOT_EVENT(xrep_quotacheck_dquot);
2651 #endif /* CONFIG_XFS_QUOTA */
2653 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_update_inode);
2654 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_unfixable_inode);
2656 TRACE_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),
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)
2671 __entry->dev = mp->m_super->s_dev;
2672 __entry->agno = agno;
2674 __entry->agbno = p->startblock;
2675 __entry->len = p->blockcount;
2676 xfs_owner_info_unpack(&p->oinfo, &__entry->owner,
2677 &__entry->offset, &__entry->flags);
2679 __entry->flags |= XFS_RMAP_UNWRITTEN;
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),
2692 TRACE_EVENT(xrep_tempfile_create,
2693 TP_PROTO(struct xfs_scrub *sc),
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)
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;
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),
2718 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
2725 DECLARE_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),
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)
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;
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),
2750 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2756 #define DEFINE_XREP_TEMPFILE_EVENT(name) \
2757 DEFINE_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))
2761 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_prealloc);
2762 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_copyin);
2764 TRACE_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),
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)
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;
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),
2791 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2799 TRACE_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),
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)
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;
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),
2822 __entry->scan_blocks)
2825 TRACE_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),
2830 __field(xfs_ino_t, ino)
2831 __field(xfs_dablk_t, dabno)
2832 __field(uint16_t, magic)
2835 __entry->dev = ip->i_mount->m_super->s_dev;
2836 __entry->ino = ip->i_ino;
2837 __entry->dabno = dabno;
2838 __entry->magic = magic;
2840 TP_printk("dev %d:%d ino 0x%llx dablk 0x%x magic 0x%x",
2841 MAJOR(__entry->dev), MINOR(__entry->dev),
2847 DECLARE_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),
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)
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;
2867 TP_printk("dev %d:%d ino 0x%llx flags %s name '%.*s' valuelen 0x%x",
2868 MAJOR(__entry->dev), MINOR(__entry->dev),
2870 __print_flags(__entry->flags, "|", XFS_ATTR_NAMESPACE_STR),
2875 #define DEFINE_XREP_XATTR_SALVAGE_EVENT(name) \
2876 DEFINE_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))
2880 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec);
2881 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec);
2882 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_stash_xattr);
2883 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_insert_xattr);
2885 DECLARE_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),
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)
2898 const struct xfs_parent_rec *rec = value;
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);
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),
2910 __entry->parent_ino,
2911 __entry->parent_gen,
2915 #define DEFINE_XREP_PPTR_SALVAGE_EVENT(name) \
2916 DEFINE_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))
2920 DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_salvage_pptr);
2921 DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_insert_pptr);
2923 TRACE_EVENT(xrep_xattr_class,
2924 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip),
2925 TP_ARGS(ip, arg_ip),
2928 __field(xfs_ino_t, ino)
2929 __field(xfs_ino_t, src_ino)
2932 __entry->dev = ip->i_mount->m_super->s_dev;
2933 __entry->ino = ip->i_ino;
2934 __entry->src_ino = arg_ip->i_ino;
2936 TP_printk("dev %d:%d ino 0x%llx src 0x%llx",
2937 MAJOR(__entry->dev), MINOR(__entry->dev),
2941 #define DEFINE_XREP_XATTR_EVENT(name) \
2942 DEFINE_EVENT(xrep_xattr_class, name, \
2943 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip), \
2944 TP_ARGS(ip, arg_ip))
2945 DEFINE_XREP_XATTR_EVENT(xrep_xattr_rebuild_tree);
2946 DEFINE_XREP_XATTR_EVENT(xrep_xattr_reset_fork);
2947 DEFINE_XREP_XATTR_EVENT(xrep_xattr_full_reset);
2949 DECLARE_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),
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)
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);
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),
2972 __entry->parent_ino,
2973 __entry->parent_gen,
2977 #define DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(name) \
2978 DEFINE_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))
2982 DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentadd);
2983 DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentremove);
2985 TRACE_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),
2991 __field(xfs_ino_t, dir_ino)
2992 __field(xfs_dablk_t, dabno)
2993 __field(uint32_t, magic)
2994 __field(uint32_t, magic_guess)
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;
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),
3008 __entry->magic_guess)
3011 DECLARE_EVENT_CLASS(xrep_dir_class,
3012 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino),
3013 TP_ARGS(dp, parent_ino),
3016 __field(xfs_ino_t, dir_ino)
3017 __field(xfs_ino_t, parent_ino)
3020 __entry->dev = dp->i_mount->m_super->s_dev;
3021 __entry->dir_ino = dp->i_ino;
3022 __entry->parent_ino = parent_ino;
3024 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3025 MAJOR(__entry->dev), MINOR(__entry->dev),
3027 __entry->parent_ino)
3029 #define DEFINE_XREP_DIR_EVENT(name) \
3030 DEFINE_EVENT(xrep_dir_class, name, \
3031 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino), \
3032 TP_ARGS(dp, parent_ino))
3033 DEFINE_XREP_DIR_EVENT(xrep_dir_rebuild_tree);
3034 DEFINE_XREP_DIR_EVENT(xrep_dir_reset_fork);
3035 DEFINE_XREP_DIR_EVENT(xrep_parent_reset_dotdot);
3037 DECLARE_EVENT_CLASS(xrep_dirent_class,
3038 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name,
3040 TP_ARGS(dp, name, ino),
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)
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);
3055 __entry->ftype = name->type;
3057 TP_printk("dev %d:%d dir 0x%llx ftype %s name '%.*s' ino 0x%llx",
3058 MAJOR(__entry->dev), MINOR(__entry->dev),
3060 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
3065 #define DEFINE_XREP_DIRENT_EVENT(name) \
3066 DEFINE_EVENT(xrep_dirent_class, name, \
3067 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name, \
3069 TP_ARGS(dp, name, ino))
3070 DEFINE_XREP_DIRENT_EVENT(xrep_dir_salvage_entry);
3071 DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_createname);
3072 DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_createname);
3073 DEFINE_XREP_DIRENT_EVENT(xrep_adoption_reparent);
3074 DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_removename);
3075 DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_removename);
3077 DECLARE_EVENT_CLASS(xrep_adoption_class,
3078 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved),
3079 TP_ARGS(dp, ip, moved),
3082 __field(xfs_ino_t, dir_ino)
3083 __field(xfs_ino_t, child_ino)
3084 __field(bool, moved)
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;
3092 TP_printk("dev %d:%d dir 0x%llx child 0x%llx moved? %d",
3093 MAJOR(__entry->dev), MINOR(__entry->dev),
3098 #define DEFINE_XREP_ADOPTION_EVENT(name) \
3099 DEFINE_EVENT(xrep_adoption_class, name, \
3100 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved), \
3101 TP_ARGS(dp, ip, moved))
3102 DEFINE_XREP_ADOPTION_EVENT(xrep_adoption_trans_roll);
3104 DECLARE_EVENT_CLASS(xrep_parent_salvage_class,
3105 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino),
3109 __field(xfs_ino_t, dir_ino)
3110 __field(xfs_ino_t, ino)
3113 __entry->dev = dp->i_mount->m_super->s_dev;
3114 __entry->dir_ino = dp->i_ino;
3117 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3118 MAJOR(__entry->dev), MINOR(__entry->dev),
3122 #define DEFINE_XREP_PARENT_SALVAGE_EVENT(name) \
3123 DEFINE_EVENT(xrep_parent_salvage_class, name, \
3124 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino), \
3126 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_dir_salvaged_parent);
3127 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_dirent);
3128 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_from_dcache);
3130 DECLARE_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),
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)
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);
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),
3153 __entry->parent_ino,
3154 __entry->parent_gen,
3158 #define DEFINE_XREP_PPTR_EVENT(name) \
3159 DEFINE_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))
3163 DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentadd);
3164 DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentremove);
3165 DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentadd);
3166 DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentremove);
3168 DECLARE_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),
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)
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);
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),
3191 __entry->parent_ino,
3192 __entry->parent_gen,
3196 #define DEFINE_XREP_PPTR_SCAN_EVENT(name) \
3197 DEFINE_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))
3201 DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentadd);
3202 DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentremove);
3204 TRACE_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),
3210 __field(xfs_ino_t, ino)
3211 __field(xfs_nlink_t, parents)
3212 __field(xfs_nlink_t, backrefs)
3213 __field(xfs_nlink_t, children)
3216 __entry->dev = mp->m_super->s_dev;
3218 __entry->parents = obs->parents;
3219 __entry->backrefs = obs->backrefs;
3220 __entry->children = obs->children;
3222 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
3223 MAJOR(__entry->dev), MINOR(__entry->dev),
3230 DECLARE_EVENT_CLASS(xrep_dentry_class,
3231 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry),
3232 TP_ARGS(mp, dentry),
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)
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;
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);
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),
3258 __entry->parent_ino,
3263 #define DEFINE_REPAIR_DENTRY_EVENT(name) \
3264 DEFINE_EVENT(xrep_dentry_class, name, \
3265 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry), \
3266 TP_ARGS(mp, dentry))
3267 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_child);
3268 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_invalidate_child);
3269 DEFINE_REPAIR_DENTRY_EVENT(xrep_dirtree_delete_child);
3271 TRACE_EVENT(xrep_symlink_salvage_target,
3272 TP_PROTO(struct xfs_inode *ip, char *target, unsigned int targetlen),
3273 TP_ARGS(ip, target, targetlen),
3276 __field(xfs_ino_t, ino)
3277 __field(unsigned int, targetlen)
3278 __dynamic_array(char, target, targetlen + 1)
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;
3287 TP_printk("dev %d:%d ip 0x%llx target '%.*s'",
3288 MAJOR(__entry->dev), MINOR(__entry->dev),
3294 DECLARE_EVENT_CLASS(xrep_symlink_class,
3295 TP_PROTO(struct xfs_inode *ip),
3299 __field(xfs_ino_t, ino)
3302 __entry->dev = ip->i_mount->m_super->s_dev;
3303 __entry->ino = ip->i_ino;
3305 TP_printk("dev %d:%d ip 0x%llx",
3306 MAJOR(__entry->dev), MINOR(__entry->dev),
3310 #define DEFINE_XREP_SYMLINK_EVENT(name) \
3311 DEFINE_EVENT(xrep_symlink_class, name, \
3312 TP_PROTO(struct xfs_inode *ip), \
3314 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_rebuild);
3315 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_reset_fork);
3317 TRACE_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),
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)
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;
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),
3344 __entry->bucket_agino,
3345 __entry->prev_agino,
3346 __entry->next_agino)
3349 TRACE_EVENT(xrep_iunlink_reload_next,
3350 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3351 TP_ARGS(ip, prev_agino),
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)
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;
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),
3373 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3376 __entry->old_prev_agino,
3377 __entry->prev_agino,
3378 __entry->next_agino)
3381 TRACE_EVENT(xrep_iunlink_reload_ondisk,
3382 TP_PROTO(struct xfs_inode *ip),
3386 __field(xfs_agnumber_t, agno)
3387 __field(xfs_agino_t, agino)
3388 __field(unsigned int, nlink)
3389 __field(xfs_agino_t, next_agino)
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;
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),
3401 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3404 __entry->next_agino)
3407 TRACE_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),
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)
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;
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),
3429 __entry->prev_agino,
3430 __entry->next_agino)
3433 DECLARE_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),
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)
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;
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),
3455 __entry->prev_agino,
3456 __entry->next_agino)
3458 #define DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(name) \
3459 DEFINE_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))
3463 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_uncached);
3464 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_wronglist);
3465 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_nolist);
3466 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_ok);
3468 TRACE_EVENT(xrep_iunlink_relink_next,
3469 TP_PROTO(struct xfs_inode *ip, xfs_agino_t next_agino),
3470 TP_ARGS(ip, next_agino),
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)
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;
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),
3488 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3490 __entry->next_agino,
3491 __entry->new_next_agino)
3494 TRACE_EVENT(xrep_iunlink_relink_prev,
3495 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3496 TP_ARGS(ip, prev_agino),
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)
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;
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),
3514 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3516 __entry->prev_agino,
3517 __entry->new_prev_agino)
3520 TRACE_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),
3526 __field(xfs_agnumber_t, agno)
3527 __field(unsigned int, bucket)
3528 __field(xfs_agino_t, agino)
3529 __field(xfs_agino_t, next_agino)
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;
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),
3543 __entry->next_agino)
3546 TRACE_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),
3552 __field(xfs_agnumber_t, agno)
3553 __field(unsigned int, bucket)
3554 __field(xfs_agino_t, old_agino)
3555 __field(xfs_agino_t, agino)
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;
3564 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x -> 0x%x",
3565 MAJOR(__entry->dev), MINOR(__entry->dev),
3572 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xrep_dirpath_set_outcome);
3573 DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_delete_path);
3574 DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_create_adoption);
3575 DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xrep_dirtree_decided_fate);
3577 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
3579 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
3581 #undef TRACE_INCLUDE_PATH
3582 #define TRACE_INCLUDE_PATH .
3583 #define TRACE_INCLUDE_FILE scrub/trace
3584 #include <trace/define_trace.h>