1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017-2023 Oracle. All Rights Reserved.
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);
73 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_METAPATH);
74 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RGSUPER);
76 #define XFS_SCRUB_TYPE_STRINGS \
77 { XFS_SCRUB_TYPE_PROBE, "probe" }, \
78 { XFS_SCRUB_TYPE_SB, "sb" }, \
79 { XFS_SCRUB_TYPE_AGF, "agf" }, \
80 { XFS_SCRUB_TYPE_AGFL, "agfl" }, \
81 { XFS_SCRUB_TYPE_AGI, "agi" }, \
82 { XFS_SCRUB_TYPE_BNOBT, "bnobt" }, \
83 { XFS_SCRUB_TYPE_CNTBT, "cntbt" }, \
84 { XFS_SCRUB_TYPE_INOBT, "inobt" }, \
85 { XFS_SCRUB_TYPE_FINOBT, "finobt" }, \
86 { XFS_SCRUB_TYPE_RMAPBT, "rmapbt" }, \
87 { XFS_SCRUB_TYPE_REFCNTBT, "refcountbt" }, \
88 { XFS_SCRUB_TYPE_INODE, "inode" }, \
89 { XFS_SCRUB_TYPE_BMBTD, "bmapbtd" }, \
90 { XFS_SCRUB_TYPE_BMBTA, "bmapbta" }, \
91 { XFS_SCRUB_TYPE_BMBTC, "bmapbtc" }, \
92 { XFS_SCRUB_TYPE_DIR, "directory" }, \
93 { XFS_SCRUB_TYPE_XATTR, "xattr" }, \
94 { XFS_SCRUB_TYPE_SYMLINK, "symlink" }, \
95 { XFS_SCRUB_TYPE_PARENT, "parent" }, \
96 { XFS_SCRUB_TYPE_RTBITMAP, "rtbitmap" }, \
97 { XFS_SCRUB_TYPE_RTSUM, "rtsummary" }, \
98 { XFS_SCRUB_TYPE_UQUOTA, "usrquota" }, \
99 { XFS_SCRUB_TYPE_GQUOTA, "grpquota" }, \
100 { XFS_SCRUB_TYPE_PQUOTA, "prjquota" }, \
101 { XFS_SCRUB_TYPE_FSCOUNTERS, "fscounters" }, \
102 { XFS_SCRUB_TYPE_QUOTACHECK, "quotacheck" }, \
103 { XFS_SCRUB_TYPE_NLINKS, "nlinks" }, \
104 { XFS_SCRUB_TYPE_HEALTHY, "healthy" }, \
105 { XFS_SCRUB_TYPE_DIRTREE, "dirtree" }, \
106 { XFS_SCRUB_TYPE_BARRIER, "barrier" }, \
107 { XFS_SCRUB_TYPE_METAPATH, "metapath" }, \
108 { XFS_SCRUB_TYPE_RGSUPER, "rgsuper" }
110 #define XFS_SCRUB_FLAG_STRINGS \
111 { XFS_SCRUB_IFLAG_REPAIR, "repair" }, \
112 { XFS_SCRUB_OFLAG_CORRUPT, "corrupt" }, \
113 { XFS_SCRUB_OFLAG_PREEN, "preen" }, \
114 { XFS_SCRUB_OFLAG_XFAIL, "xfail" }, \
115 { XFS_SCRUB_OFLAG_XCORRUPT, "xcorrupt" }, \
116 { XFS_SCRUB_OFLAG_INCOMPLETE, "incomplete" }, \
117 { XFS_SCRUB_OFLAG_WARNING, "warning" }, \
118 { XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED, "norepair" }, \
119 { XFS_SCRUB_IFLAG_FORCE_REBUILD, "rebuild" }
121 #define XFS_SCRUB_STATE_STRINGS \
122 { XCHK_TRY_HARDER, "try_harder" }, \
123 { XCHK_HAVE_FREEZE_PROT, "nofreeze" }, \
124 { XCHK_FSGATES_DRAIN, "fsgates_drain" }, \
125 { XCHK_NEED_DRAIN, "need_drain" }, \
126 { XCHK_FSGATES_QUOTA, "fsgates_quota" }, \
127 { XCHK_FSGATES_DIRENTS, "fsgates_dirents" }, \
128 { XCHK_FSGATES_RMAP, "fsgates_rmap" }, \
129 { XREP_RESET_PERAG_RESV, "reset_perag_resv" }, \
130 { XREP_ALREADY_FIXED, "already_fixed" }
132 TRACE_DEFINE_ENUM(XFS_RMAP_MAP);
133 TRACE_DEFINE_ENUM(XFS_RMAP_MAP_SHARED);
134 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP);
135 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP_SHARED);
136 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT);
137 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT_SHARED);
138 TRACE_DEFINE_ENUM(XFS_RMAP_ALLOC);
139 TRACE_DEFINE_ENUM(XFS_RMAP_FREE);
141 DECLARE_EVENT_CLASS(xchk_class,
142 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
144 TP_ARGS(ip, sm, error),
147 __field(xfs_ino_t, ino)
148 __field(unsigned int, type)
149 __field(xfs_agnumber_t, agno)
150 __field(xfs_ino_t, inum)
151 __field(unsigned int, gen)
152 __field(unsigned int, flags)
156 __entry->dev = ip->i_mount->m_super->s_dev;
157 __entry->ino = ip->i_ino;
158 __entry->type = sm->sm_type;
159 __entry->agno = sm->sm_agno;
160 __entry->inum = sm->sm_ino;
161 __entry->gen = sm->sm_gen;
162 __entry->flags = sm->sm_flags;
163 __entry->error = error;
165 TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
166 MAJOR(__entry->dev), MINOR(__entry->dev),
168 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
172 __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
175 #define DEFINE_SCRUB_EVENT(name) \
176 DEFINE_EVENT(xchk_class, name, \
177 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
179 TP_ARGS(ip, sm, error))
181 DEFINE_SCRUB_EVENT(xchk_start);
182 DEFINE_SCRUB_EVENT(xchk_done);
183 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
184 DEFINE_SCRUB_EVENT(xchk_dirtree_start);
185 DEFINE_SCRUB_EVENT(xchk_dirtree_done);
186 DEFINE_SCRUB_EVENT(xrep_attempt);
187 DEFINE_SCRUB_EVENT(xrep_done);
189 DECLARE_EVENT_CLASS(xchk_fsgate_class,
190 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
191 TP_ARGS(sc, fsgate_flags),
194 __field(unsigned int, type)
195 __field(unsigned int, fsgate_flags)
198 __entry->dev = sc->mp->m_super->s_dev;
199 __entry->type = sc->sm->sm_type;
200 __entry->fsgate_flags = fsgate_flags;
202 TP_printk("dev %d:%d type %s fsgates '%s'",
203 MAJOR(__entry->dev), MINOR(__entry->dev),
204 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
205 __print_flags(__entry->fsgate_flags, "|", XFS_SCRUB_STATE_STRINGS))
208 #define DEFINE_SCRUB_FSHOOK_EVENT(name) \
209 DEFINE_EVENT(xchk_fsgate_class, name, \
210 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
211 TP_ARGS(sc, fsgates_flags))
213 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
214 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
216 DECLARE_EVENT_CLASS(xchk_vector_head_class,
217 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead),
221 __field(xfs_ino_t, ino)
222 __field(xfs_agnumber_t, agno)
223 __field(xfs_ino_t, inum)
224 __field(unsigned int, gen)
225 __field(unsigned int, flags)
226 __field(unsigned short, rest_us)
227 __field(unsigned short, nr_vecs)
230 __entry->dev = ip->i_mount->m_super->s_dev;
231 __entry->ino = ip->i_ino;
232 __entry->agno = vhead->svh_agno;
233 __entry->inum = vhead->svh_ino;
234 __entry->gen = vhead->svh_gen;
235 __entry->flags = vhead->svh_flags;
236 __entry->rest_us = vhead->svh_rest_us;
237 __entry->nr_vecs = vhead->svh_nr;
239 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",
240 MAJOR(__entry->dev), MINOR(__entry->dev),
249 #define DEFINE_SCRUBV_HEAD_EVENT(name) \
250 DEFINE_EVENT(xchk_vector_head_class, name, \
251 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_vec_head *vhead), \
254 DEFINE_SCRUBV_HEAD_EVENT(xchk_scrubv_start);
256 DECLARE_EVENT_CLASS(xchk_vector_class,
257 TP_PROTO(struct xfs_mount *mp, struct xfs_scrub_vec_head *vhead,
258 unsigned int vec_nr, struct xfs_scrub_vec *v),
259 TP_ARGS(mp, vhead, vec_nr, v),
262 __field(unsigned int, vec_nr)
263 __field(unsigned int, vec_type)
264 __field(unsigned int, vec_flags)
265 __field(int, vec_ret)
268 __entry->dev = mp->m_super->s_dev;
269 __entry->vec_nr = vec_nr;
270 __entry->vec_type = v->sv_type;
271 __entry->vec_flags = v->sv_flags;
272 __entry->vec_ret = v->sv_ret;
274 TP_printk("dev %d:%d vec[%u] type %s flags %s ret %d",
275 MAJOR(__entry->dev), MINOR(__entry->dev),
277 __print_symbolic(__entry->vec_type, XFS_SCRUB_TYPE_STRINGS),
278 __print_flags(__entry->vec_flags, "|", XFS_SCRUB_FLAG_STRINGS),
281 #define DEFINE_SCRUBV_EVENT(name) \
282 DEFINE_EVENT(xchk_vector_class, name, \
283 TP_PROTO(struct xfs_mount *mp, struct xfs_scrub_vec_head *vhead, \
284 unsigned int vec_nr, struct xfs_scrub_vec *v), \
285 TP_ARGS(mp, vhead, vec_nr, v))
287 DEFINE_SCRUBV_EVENT(xchk_scrubv_barrier_fail);
288 DEFINE_SCRUBV_EVENT(xchk_scrubv_item);
289 DEFINE_SCRUBV_EVENT(xchk_scrubv_outcome);
291 TRACE_EVENT(xchk_op_error,
292 TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
293 xfs_agblock_t bno, int error, void *ret_ip),
294 TP_ARGS(sc, agno, bno, error, ret_ip),
297 __field(unsigned int, type)
298 __field(xfs_agnumber_t, agno)
299 __field(xfs_agblock_t, bno)
301 __field(void *, ret_ip)
304 __entry->dev = sc->mp->m_super->s_dev;
305 __entry->type = sc->sm->sm_type;
306 __entry->agno = agno;
308 __entry->error = error;
309 __entry->ret_ip = ret_ip;
311 TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
312 MAJOR(__entry->dev), MINOR(__entry->dev),
313 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
320 TRACE_EVENT(xchk_file_op_error,
321 TP_PROTO(struct xfs_scrub *sc, int whichfork,
322 xfs_fileoff_t offset, int error, void *ret_ip),
323 TP_ARGS(sc, whichfork, offset, error, ret_ip),
326 __field(xfs_ino_t, ino)
327 __field(int, whichfork)
328 __field(unsigned int, type)
329 __field(xfs_fileoff_t, offset)
331 __field(void *, ret_ip)
334 __entry->dev = sc->ip->i_mount->m_super->s_dev;
335 __entry->ino = sc->ip->i_ino;
336 __entry->whichfork = whichfork;
337 __entry->type = sc->sm->sm_type;
338 __entry->offset = offset;
339 __entry->error = error;
340 __entry->ret_ip = ret_ip;
342 TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
343 MAJOR(__entry->dev), MINOR(__entry->dev),
345 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
346 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
352 DECLARE_EVENT_CLASS(xchk_block_error_class,
353 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
354 TP_ARGS(sc, daddr, ret_ip),
357 __field(unsigned int, type)
358 __field(xfs_agnumber_t, agno)
359 __field(xfs_agblock_t, agbno)
360 __field(void *, ret_ip)
363 __entry->dev = sc->mp->m_super->s_dev;
364 __entry->type = sc->sm->sm_type;
365 __entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
366 __entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
367 __entry->ret_ip = ret_ip;
369 TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
370 MAJOR(__entry->dev), MINOR(__entry->dev),
371 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
377 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
378 DEFINE_EVENT(xchk_block_error_class, name, \
379 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
381 TP_ARGS(sc, daddr, ret_ip))
383 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
384 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
385 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
387 DECLARE_EVENT_CLASS(xchk_ino_error_class,
388 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
389 TP_ARGS(sc, ino, ret_ip),
392 __field(xfs_ino_t, ino)
393 __field(unsigned int, type)
394 __field(void *, ret_ip)
397 __entry->dev = sc->mp->m_super->s_dev;
399 __entry->type = sc->sm->sm_type;
400 __entry->ret_ip = ret_ip;
402 TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
403 MAJOR(__entry->dev), MINOR(__entry->dev),
405 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
409 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
410 DEFINE_EVENT(xchk_ino_error_class, name, \
411 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
413 TP_ARGS(sc, ino, ret_ip))
415 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
416 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
417 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
419 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
420 TP_PROTO(struct xfs_scrub *sc, int whichfork,
421 xfs_fileoff_t offset, void *ret_ip),
422 TP_ARGS(sc, whichfork, offset, ret_ip),
425 __field(xfs_ino_t, ino)
426 __field(int, whichfork)
427 __field(unsigned int, type)
428 __field(xfs_fileoff_t, offset)
429 __field(void *, ret_ip)
432 __entry->dev = sc->ip->i_mount->m_super->s_dev;
433 __entry->ino = sc->ip->i_ino;
434 __entry->whichfork = whichfork;
435 __entry->type = sc->sm->sm_type;
436 __entry->offset = offset;
437 __entry->ret_ip = ret_ip;
439 TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
440 MAJOR(__entry->dev), MINOR(__entry->dev),
442 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
443 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
448 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
449 DEFINE_EVENT(xchk_fblock_error_class, name, \
450 TP_PROTO(struct xfs_scrub *sc, int whichfork, \
451 xfs_fileoff_t offset, void *ret_ip), \
452 TP_ARGS(sc, whichfork, offset, ret_ip))
454 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
455 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
456 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_preen);
458 #ifdef CONFIG_XFS_QUOTA
459 DECLARE_EVENT_CLASS(xchk_dqiter_class,
460 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id),
464 __field(xfs_dqtype_t, dqtype)
465 __field(xfs_ino_t, ino)
466 __field(unsigned long long, cur_id)
467 __field(unsigned long long, id)
468 __field(xfs_fileoff_t, startoff)
469 __field(xfs_fsblock_t, startblock)
470 __field(xfs_filblks_t, blockcount)
471 __field(xfs_exntst_t, state)
474 __entry->dev = cursor->sc->ip->i_mount->m_super->s_dev;
475 __entry->dqtype = cursor->dqtype;
476 __entry->ino = cursor->quota_ip->i_ino;
477 __entry->cur_id = cursor->id;
478 __entry->startoff = cursor->bmap.br_startoff;
479 __entry->startblock = cursor->bmap.br_startblock;
480 __entry->blockcount = cursor->bmap.br_blockcount;
481 __entry->state = cursor->bmap.br_state;
484 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",
485 MAJOR(__entry->dev), MINOR(__entry->dev),
486 __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
496 #define DEFINE_SCRUB_DQITER_EVENT(name) \
497 DEFINE_EVENT(xchk_dqiter_class, name, \
498 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id), \
500 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_revalidate_bmap);
501 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_bmap);
502 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_incore);
503 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter);
505 TRACE_EVENT(xchk_qcheck_error,
506 TP_PROTO(struct xfs_scrub *sc, xfs_dqtype_t dqtype, xfs_dqid_t id,
508 TP_ARGS(sc, dqtype, id, ret_ip),
511 __field(xfs_dqtype_t, dqtype)
512 __field(xfs_dqid_t, id)
513 __field(void *, ret_ip)
516 __entry->dev = sc->mp->m_super->s_dev;
517 __entry->dqtype = dqtype;
519 __entry->ret_ip = ret_ip;
521 TP_printk("dev %d:%d dquot type %s id 0x%x ret_ip %pS",
522 MAJOR(__entry->dev), MINOR(__entry->dev),
523 __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
527 #endif /* CONFIG_XFS_QUOTA */
529 TRACE_EVENT(xchk_incomplete,
530 TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
534 __field(unsigned int, type)
535 __field(void *, ret_ip)
538 __entry->dev = sc->mp->m_super->s_dev;
539 __entry->type = sc->sm->sm_type;
540 __entry->ret_ip = ret_ip;
542 TP_printk("dev %d:%d type %s ret_ip %pS",
543 MAJOR(__entry->dev), MINOR(__entry->dev),
544 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
548 TRACE_EVENT(xchk_btree_op_error,
549 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
550 int level, int error, void *ret_ip),
551 TP_ARGS(sc, cur, level, error, ret_ip),
554 __field(unsigned int, type)
555 __string(name, cur->bc_ops->name)
557 __field(xfs_agnumber_t, agno)
558 __field(xfs_agblock_t, bno)
561 __field(void *, ret_ip)
564 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
566 __entry->dev = sc->mp->m_super->s_dev;
567 __entry->type = sc->sm->sm_type;
569 __entry->level = level;
570 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
571 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
572 __entry->ptr = cur->bc_levels[level].ptr;
573 __entry->error = error;
574 __entry->ret_ip = ret_ip;
576 TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
577 MAJOR(__entry->dev), MINOR(__entry->dev),
578 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
588 TRACE_EVENT(xchk_ifork_btree_op_error,
589 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
590 int level, int error, void *ret_ip),
591 TP_ARGS(sc, cur, level, error, ret_ip),
594 __field(xfs_ino_t, ino)
595 __field(int, whichfork)
596 __field(unsigned int, type)
597 __string(name, cur->bc_ops->name)
600 __field(xfs_agnumber_t, agno)
601 __field(xfs_agblock_t, bno)
603 __field(void *, ret_ip)
606 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
607 __entry->dev = sc->mp->m_super->s_dev;
608 __entry->ino = cur->bc_ino.ip->i_ino;
609 __entry->whichfork = cur->bc_ino.whichfork;
610 __entry->type = sc->sm->sm_type;
612 __entry->level = level;
613 __entry->ptr = cur->bc_levels[level].ptr;
614 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
615 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
616 __entry->error = error;
617 __entry->ret_ip = ret_ip;
619 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",
620 MAJOR(__entry->dev), MINOR(__entry->dev),
622 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
623 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
633 TRACE_EVENT(xchk_btree_error,
634 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
635 int level, void *ret_ip),
636 TP_ARGS(sc, cur, level, ret_ip),
639 __field(unsigned int, type)
640 __string(name, cur->bc_ops->name)
642 __field(xfs_agnumber_t, agno)
643 __field(xfs_agblock_t, bno)
645 __field(void *, ret_ip)
648 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
649 __entry->dev = sc->mp->m_super->s_dev;
650 __entry->type = sc->sm->sm_type;
652 __entry->level = level;
653 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
654 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
655 __entry->ptr = cur->bc_levels[level].ptr;
656 __entry->ret_ip = ret_ip;
658 TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
659 MAJOR(__entry->dev), MINOR(__entry->dev),
660 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
669 TRACE_EVENT(xchk_ifork_btree_error,
670 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
671 int level, void *ret_ip),
672 TP_ARGS(sc, cur, level, ret_ip),
675 __field(xfs_ino_t, ino)
676 __field(int, whichfork)
677 __field(unsigned int, type)
678 __string(name, cur->bc_ops->name)
680 __field(xfs_agnumber_t, agno)
681 __field(xfs_agblock_t, bno)
683 __field(void *, ret_ip)
686 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
687 __entry->dev = sc->mp->m_super->s_dev;
688 __entry->ino = sc->ip->i_ino;
689 __entry->whichfork = cur->bc_ino.whichfork;
690 __entry->type = sc->sm->sm_type;
692 __entry->level = level;
693 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
694 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
695 __entry->ptr = cur->bc_levels[level].ptr;
696 __entry->ret_ip = ret_ip;
698 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",
699 MAJOR(__entry->dev), MINOR(__entry->dev),
701 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
702 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
711 DECLARE_EVENT_CLASS(xchk_sbtree_class,
712 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
714 TP_ARGS(sc, cur, level),
718 __string(name, cur->bc_ops->name)
719 __field(xfs_agnumber_t, agno)
720 __field(xfs_agblock_t, bno)
722 __field(int, nlevels)
726 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
728 __entry->dev = sc->mp->m_super->s_dev;
729 __entry->type = sc->sm->sm_type;
731 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
732 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
733 __entry->level = level;
734 __entry->nlevels = cur->bc_nlevels;
735 __entry->ptr = cur->bc_levels[level].ptr;
737 TP_printk("dev %d:%d type %s %sbt agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
738 MAJOR(__entry->dev), MINOR(__entry->dev),
739 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
747 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
748 DEFINE_EVENT(xchk_sbtree_class, name, \
749 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
751 TP_ARGS(sc, cur, level))
753 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
754 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
756 TRACE_EVENT(xchk_xref_error,
757 TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
758 TP_ARGS(sc, error, ret_ip),
763 __field(void *, ret_ip)
766 __entry->dev = sc->mp->m_super->s_dev;
767 __entry->type = sc->sm->sm_type;
768 __entry->error = error;
769 __entry->ret_ip = ret_ip;
771 TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
772 MAJOR(__entry->dev), MINOR(__entry->dev),
773 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
778 TRACE_EVENT(xchk_iallocbt_check_cluster,
779 TP_PROTO(const struct xfs_perag *pag, xfs_agino_t startino,
780 xfs_daddr_t map_daddr, unsigned short map_len,
781 unsigned int chunk_ino, unsigned int nr_inodes,
782 uint16_t cluster_mask, uint16_t holemask,
783 unsigned int cluster_ino),
784 TP_ARGS(pag, startino, map_daddr, map_len, chunk_ino, nr_inodes,
785 cluster_mask, holemask, cluster_ino),
788 __field(xfs_agnumber_t, agno)
789 __field(xfs_agino_t, startino)
790 __field(xfs_daddr_t, map_daddr)
791 __field(unsigned short, map_len)
792 __field(unsigned int, chunk_ino)
793 __field(unsigned int, nr_inodes)
794 __field(unsigned int, cluster_ino)
795 __field(uint16_t, cluster_mask)
796 __field(uint16_t, holemask)
799 __entry->dev = pag_mount(pag)->m_super->s_dev;
800 __entry->agno = pag_agno(pag);
801 __entry->startino = startino;
802 __entry->map_daddr = map_daddr;
803 __entry->map_len = map_len;
804 __entry->chunk_ino = chunk_ino;
805 __entry->nr_inodes = nr_inodes;
806 __entry->cluster_mask = cluster_mask;
807 __entry->holemask = holemask;
808 __entry->cluster_ino = cluster_ino;
810 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",
811 MAJOR(__entry->dev), MINOR(__entry->dev),
818 __entry->cluster_mask,
820 __entry->cluster_ino)
823 TRACE_EVENT(xchk_inode_is_allocated,
824 TP_PROTO(struct xfs_inode *ip),
828 __field(xfs_ino_t, ino)
829 __field(unsigned long, iflags)
830 __field(umode_t, mode)
833 __entry->dev = VFS_I(ip)->i_sb->s_dev;
834 __entry->ino = ip->i_ino;
835 __entry->iflags = ip->i_flags;
836 __entry->mode = VFS_I(ip)->i_mode;
838 TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
839 MAJOR(__entry->dev), MINOR(__entry->dev),
845 TRACE_EVENT(xchk_fscounters_calc,
846 TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
847 uint64_t fdblocks, uint64_t delalloc),
848 TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
851 __field(int64_t, icount_sb)
852 __field(uint64_t, icount_calculated)
853 __field(int64_t, ifree_sb)
854 __field(uint64_t, ifree_calculated)
855 __field(int64_t, fdblocks_sb)
856 __field(uint64_t, fdblocks_calculated)
857 __field(uint64_t, delalloc)
860 __entry->dev = mp->m_super->s_dev;
861 __entry->icount_sb = mp->m_sb.sb_icount;
862 __entry->icount_calculated = icount;
863 __entry->ifree_sb = mp->m_sb.sb_ifree;
864 __entry->ifree_calculated = ifree;
865 __entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
866 __entry->fdblocks_calculated = fdblocks;
867 __entry->delalloc = delalloc;
869 TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
870 MAJOR(__entry->dev), MINOR(__entry->dev),
872 __entry->icount_calculated,
874 __entry->ifree_calculated,
875 __entry->fdblocks_sb,
876 __entry->fdblocks_calculated,
880 TRACE_EVENT(xchk_fscounters_within_range,
881 TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
883 TP_ARGS(mp, expected, curr_value, old_value),
886 __field(uint64_t, expected)
887 __field(int64_t, curr_value)
888 __field(int64_t, old_value)
891 __entry->dev = mp->m_super->s_dev;
892 __entry->expected = expected;
893 __entry->curr_value = curr_value;
894 __entry->old_value = old_value;
896 TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
897 MAJOR(__entry->dev), MINOR(__entry->dev),
903 DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
904 TP_PROTO(struct xfs_scrub *sc, int error),
908 __field(unsigned int, type)
912 __entry->dev = sc->mp->m_super->s_dev;
913 __entry->type = sc->sm->sm_type;
914 __entry->error = error;
916 TP_printk("dev %d:%d type %s error %d",
917 MAJOR(__entry->dev), MINOR(__entry->dev),
918 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
921 #define DEFINE_XCHK_FSFREEZE_EVENT(name) \
922 DEFINE_EVENT(xchk_fsfreeze_class, name, \
923 TP_PROTO(struct xfs_scrub *sc, int error), \
925 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
926 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
928 TRACE_EVENT(xchk_refcount_incorrect,
929 TP_PROTO(const struct xfs_perag *pag,
930 const struct xfs_refcount_irec *irec,
932 TP_ARGS(pag, irec, seen),
935 __field(xfs_agnumber_t, agno)
936 __field(enum xfs_refc_domain, domain)
937 __field(xfs_agblock_t, startblock)
938 __field(xfs_extlen_t, blockcount)
939 __field(xfs_nlink_t, refcount)
940 __field(xfs_nlink_t, seen)
943 __entry->dev = pag_mount(pag)->m_super->s_dev;
944 __entry->agno = pag_agno(pag);
945 __entry->domain = irec->rc_domain;
946 __entry->startblock = irec->rc_startblock;
947 __entry->blockcount = irec->rc_blockcount;
948 __entry->refcount = irec->rc_refcount;
949 __entry->seen = seen;
951 TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
952 MAJOR(__entry->dev), MINOR(__entry->dev),
954 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
961 TRACE_EVENT(xfile_create,
962 TP_PROTO(struct xfile *xf),
966 __field(unsigned long, ino)
967 __array(char, pathname, MAXNAMELEN)
972 __entry->ino = file_inode(xf->file)->i_ino;
973 path = file_path(xf->file, __entry->pathname, MAXNAMELEN);
975 strncpy(__entry->pathname, "(unknown)",
976 sizeof(__entry->pathname));
978 TP_printk("xfino 0x%lx path '%s'",
983 TRACE_EVENT(xfile_destroy,
984 TP_PROTO(struct xfile *xf),
987 __field(unsigned long, ino)
988 __field(unsigned long long, bytes)
989 __field(loff_t, size)
992 struct inode *inode = file_inode(xf->file);
994 __entry->ino = inode->i_ino;
995 __entry->bytes = inode->i_blocks << SECTOR_SHIFT;
996 __entry->size = i_size_read(inode);
998 TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
1004 DECLARE_EVENT_CLASS(xfile_class,
1005 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
1006 TP_ARGS(xf, pos, bytecount),
1008 __field(unsigned long, ino)
1009 __field(unsigned long long, bytes_used)
1010 __field(loff_t, pos)
1011 __field(loff_t, size)
1012 __field(unsigned long long, bytecount)
1015 struct inode *inode = file_inode(xf->file);
1017 __entry->ino = inode->i_ino;
1018 __entry->bytes_used = inode->i_blocks << SECTOR_SHIFT;
1020 __entry->size = i_size_read(inode);
1021 __entry->bytecount = bytecount;
1023 TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
1025 __entry->bytes_used,
1030 #define DEFINE_XFILE_EVENT(name) \
1031 DEFINE_EVENT(xfile_class, name, \
1032 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
1033 TP_ARGS(xf, pos, bytecount))
1034 DEFINE_XFILE_EVENT(xfile_load);
1035 DEFINE_XFILE_EVENT(xfile_store);
1036 DEFINE_XFILE_EVENT(xfile_seek_data);
1037 DEFINE_XFILE_EVENT(xfile_get_folio);
1038 DEFINE_XFILE_EVENT(xfile_put_folio);
1039 DEFINE_XFILE_EVENT(xfile_discard);
1041 TRACE_EVENT(xfarray_create,
1042 TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
1043 TP_ARGS(xfa, required_capacity),
1045 __field(unsigned long, ino)
1046 __field(uint64_t, max_nr)
1047 __field(size_t, obj_size)
1048 __field(int, obj_size_log)
1049 __field(unsigned long long, required_capacity)
1052 __entry->max_nr = xfa->max_nr;
1053 __entry->obj_size = xfa->obj_size;
1054 __entry->obj_size_log = xfa->obj_size_log;
1055 __entry->ino = file_inode(xfa->xfile->file)->i_ino;
1056 __entry->required_capacity = required_capacity;
1058 TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
1061 __entry->required_capacity,
1063 __entry->obj_size_log)
1066 TRACE_EVENT(xfarray_isort,
1067 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1068 TP_ARGS(si, lo, hi),
1070 __field(unsigned long, ino)
1071 __field(unsigned long long, lo)
1072 __field(unsigned long long, hi)
1075 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1079 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1083 __entry->hi - __entry->lo)
1086 TRACE_EVENT(xfarray_foliosort,
1087 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1088 TP_ARGS(si, lo, hi),
1090 __field(unsigned long, ino)
1091 __field(unsigned long long, lo)
1092 __field(unsigned long long, hi)
1095 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1099 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1103 __entry->hi - __entry->lo)
1106 TRACE_EVENT(xfarray_qsort,
1107 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1108 TP_ARGS(si, lo, hi),
1110 __field(unsigned long, ino)
1111 __field(unsigned long long, lo)
1112 __field(unsigned long long, hi)
1113 __field(int, stack_depth)
1114 __field(int, max_stack_depth)
1117 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1120 __entry->stack_depth = si->stack_depth;
1121 __entry->max_stack_depth = si->max_stack_depth;
1123 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
1127 __entry->hi - __entry->lo,
1128 __entry->stack_depth,
1129 __entry->max_stack_depth)
1132 TRACE_EVENT(xfarray_sort,
1133 TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
1136 __field(unsigned long, ino)
1137 __field(unsigned long long, nr)
1138 __field(size_t, obj_size)
1139 __field(size_t, bytes)
1140 __field(unsigned int, max_stack_depth)
1143 __entry->nr = si->array->nr;
1144 __entry->obj_size = si->array->obj_size;
1145 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1146 __entry->bytes = bytes;
1147 __entry->max_stack_depth = si->max_stack_depth;
1149 TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
1153 __entry->max_stack_depth,
1157 TRACE_EVENT(xfarray_sort_scan,
1158 TP_PROTO(struct xfarray_sortinfo *si, unsigned long long idx),
1161 __field(unsigned long, ino)
1162 __field(unsigned long long, nr)
1163 __field(size_t, obj_size)
1164 __field(unsigned long long, idx)
1165 __field(unsigned long long, folio_pos)
1166 __field(unsigned long, folio_bytes)
1167 __field(unsigned long long, first_idx)
1168 __field(unsigned long long, last_idx)
1171 __entry->nr = si->array->nr;
1172 __entry->obj_size = si->array->obj_size;
1173 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1176 __entry->folio_pos = folio_pos(si->folio);
1177 __entry->folio_bytes = folio_size(si->folio);
1178 __entry->first_idx = si->first_folio_idx;
1179 __entry->last_idx = si->last_folio_idx;
1181 __entry->folio_pos = 0;
1182 __entry->folio_bytes = 0;
1183 __entry->first_idx = 0;
1184 __entry->last_idx = 0;
1187 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",
1193 __entry->folio_bytes,
1198 TRACE_EVENT(xfarray_sort_stats,
1199 TP_PROTO(struct xfarray_sortinfo *si, int error),
1202 __field(unsigned long, ino)
1204 __field(unsigned long long, loads)
1205 __field(unsigned long long, stores)
1206 __field(unsigned long long, compares)
1207 __field(unsigned long long, heapsorts)
1209 __field(unsigned int, max_stack_depth)
1210 __field(unsigned int, max_stack_used)
1214 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1216 __entry->loads = si->loads;
1217 __entry->stores = si->stores;
1218 __entry->compares = si->compares;
1219 __entry->heapsorts = si->heapsorts;
1221 __entry->max_stack_depth = si->max_stack_depth;
1222 __entry->max_stack_used = si->max_stack_used;
1223 __entry->error = error;
1227 "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1229 "xfino 0x%lx stack_depth %u/%u error %d",
1238 __entry->max_stack_used,
1239 __entry->max_stack_depth,
1243 #ifdef CONFIG_XFS_RT
1244 TRACE_EVENT(xchk_rtsum_record_free,
1245 TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
1246 xfs_rtbxlen_t len, unsigned int log, loff_t pos,
1247 xfs_suminfo_t value),
1248 TP_ARGS(mp, start, len, log, pos, value),
1251 __field(dev_t, rtdev)
1252 __field(xfs_rtxnum_t, start)
1253 __field(unsigned long long, len)
1254 __field(unsigned int, log)
1255 __field(loff_t, pos)
1256 __field(xfs_suminfo_t, value)
1259 __entry->dev = mp->m_super->s_dev;
1260 __entry->rtdev = mp->m_rtdev_targp->bt_dev;
1261 __entry->start = start;
1265 __entry->value = value;
1267 TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
1268 MAJOR(__entry->dev), MINOR(__entry->dev),
1269 MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
1276 #endif /* CONFIG_XFS_RT */
1278 DECLARE_EVENT_CLASS(xchk_iscan_class,
1279 TP_PROTO(struct xchk_iscan *iscan),
1283 __field(xfs_ino_t, cursor)
1284 __field(xfs_ino_t, visited)
1287 __entry->dev = iscan->sc->mp->m_super->s_dev;
1288 __entry->cursor = iscan->cursor_ino;
1289 __entry->visited = iscan->__visited_ino;
1291 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx",
1292 MAJOR(__entry->dev), MINOR(__entry->dev),
1296 #define DEFINE_ISCAN_EVENT(name) \
1297 DEFINE_EVENT(xchk_iscan_class, name, \
1298 TP_PROTO(struct xchk_iscan *iscan), \
1300 DEFINE_ISCAN_EVENT(xchk_iscan_move_cursor);
1301 DEFINE_ISCAN_EVENT(xchk_iscan_visit);
1302 DEFINE_ISCAN_EVENT(xchk_iscan_skip);
1303 DEFINE_ISCAN_EVENT(xchk_iscan_advance_ag);
1305 DECLARE_EVENT_CLASS(xchk_iscan_ino_class,
1306 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino),
1307 TP_ARGS(iscan, ino),
1310 __field(xfs_ino_t, startino)
1311 __field(xfs_ino_t, cursor)
1312 __field(xfs_ino_t, visited)
1313 __field(xfs_ino_t, ino)
1316 __entry->dev = iscan->sc->mp->m_super->s_dev;
1317 __entry->startino = iscan->scan_start_ino;
1318 __entry->cursor = iscan->cursor_ino;
1319 __entry->visited = iscan->__visited_ino;
1322 TP_printk("dev %d:%d iscan start 0x%llx cursor 0x%llx visited 0x%llx ino 0x%llx",
1323 MAJOR(__entry->dev), MINOR(__entry->dev),
1329 #define DEFINE_ISCAN_INO_EVENT(name) \
1330 DEFINE_EVENT(xchk_iscan_ino_class, name, \
1331 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino), \
1332 TP_ARGS(iscan, ino))
1333 DEFINE_ISCAN_INO_EVENT(xchk_iscan_want_live_update);
1334 DEFINE_ISCAN_INO_EVENT(xchk_iscan_start);
1336 TRACE_EVENT(xchk_iscan_iget,
1337 TP_PROTO(struct xchk_iscan *iscan, int error),
1338 TP_ARGS(iscan, error),
1341 __field(xfs_ino_t, cursor)
1342 __field(xfs_ino_t, visited)
1346 __entry->dev = iscan->sc->mp->m_super->s_dev;
1347 __entry->cursor = iscan->cursor_ino;
1348 __entry->visited = iscan->__visited_ino;
1349 __entry->error = error;
1351 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx error %d",
1352 MAJOR(__entry->dev), MINOR(__entry->dev),
1358 TRACE_EVENT(xchk_iscan_iget_batch,
1359 TP_PROTO(struct xfs_mount *mp, struct xchk_iscan *iscan,
1360 unsigned int nr, unsigned int avail),
1361 TP_ARGS(mp, iscan, nr, avail),
1364 __field(xfs_ino_t, cursor)
1365 __field(xfs_ino_t, visited)
1366 __field(unsigned int, nr)
1367 __field(unsigned int, avail)
1368 __field(unsigned int, unavail)
1369 __field(xfs_ino_t, batch_ino)
1370 __field(unsigned long long, skipmask)
1373 __entry->dev = mp->m_super->s_dev;
1374 __entry->cursor = iscan->cursor_ino;
1375 __entry->visited = iscan->__visited_ino;
1377 __entry->avail = avail;
1378 __entry->unavail = hweight64(iscan->__skipped_inomask);
1379 __entry->batch_ino = iscan->__batch_ino;
1380 __entry->skipmask = iscan->__skipped_inomask;
1382 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx batchino 0x%llx skipmask 0x%llx nr %u avail %u unavail %u",
1383 MAJOR(__entry->dev), MINOR(__entry->dev),
1393 DECLARE_EVENT_CLASS(xchk_iscan_retry_wait_class,
1394 TP_PROTO(struct xchk_iscan *iscan),
1398 __field(xfs_ino_t, cursor)
1399 __field(xfs_ino_t, visited)
1400 __field(unsigned int, retry_delay)
1401 __field(unsigned long, remaining)
1402 __field(unsigned int, iget_timeout)
1405 __entry->dev = iscan->sc->mp->m_super->s_dev;
1406 __entry->cursor = iscan->cursor_ino;
1407 __entry->visited = iscan->__visited_ino;
1408 __entry->retry_delay = iscan->iget_retry_delay;
1409 __entry->remaining = jiffies_to_msecs(iscan->__iget_deadline - jiffies);
1410 __entry->iget_timeout = iscan->iget_timeout;
1412 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx remaining %lu timeout %u delay %u",
1413 MAJOR(__entry->dev), MINOR(__entry->dev),
1417 __entry->iget_timeout,
1418 __entry->retry_delay)
1420 #define DEFINE_ISCAN_RETRY_WAIT_EVENT(name) \
1421 DEFINE_EVENT(xchk_iscan_retry_wait_class, name, \
1422 TP_PROTO(struct xchk_iscan *iscan), \
1424 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_iget_retry_wait);
1425 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_agi_retry_wait);
1427 TRACE_EVENT(xchk_nlinks_collect_dirent,
1428 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *dp,
1429 xfs_ino_t ino, const struct xfs_name *name),
1430 TP_ARGS(mp, dp, ino, name),
1433 __field(xfs_ino_t, dir)
1434 __field(xfs_ino_t, ino)
1435 __field(unsigned int, namelen)
1436 __dynamic_array(char, name, name->len)
1439 __entry->dev = mp->m_super->s_dev;
1440 __entry->dir = dp->i_ino;
1442 __entry->namelen = name->len;
1443 memcpy(__get_str(name), name->name, name->len);
1445 TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1446 MAJOR(__entry->dev), MINOR(__entry->dev),
1453 TRACE_EVENT(xchk_nlinks_collect_pptr,
1454 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *dp,
1455 const struct xfs_name *name,
1456 const struct xfs_parent_rec *pptr),
1457 TP_ARGS(mp, dp, name, pptr),
1460 __field(xfs_ino_t, dir)
1461 __field(xfs_ino_t, ino)
1462 __field(unsigned int, namelen)
1463 __dynamic_array(char, name, name->len)
1466 __entry->dev = mp->m_super->s_dev;
1467 __entry->dir = dp->i_ino;
1468 __entry->ino = be64_to_cpu(pptr->p_ino);
1469 __entry->namelen = name->len;
1470 memcpy(__get_str(name), name->name, name->len);
1472 TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1473 MAJOR(__entry->dev), MINOR(__entry->dev),
1480 TRACE_EVENT(xchk_nlinks_collect_metafile,
1481 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino),
1485 __field(xfs_ino_t, ino)
1488 __entry->dev = mp->m_super->s_dev;
1491 TP_printk("dev %d:%d ino 0x%llx",
1492 MAJOR(__entry->dev), MINOR(__entry->dev),
1496 TRACE_EVENT(xchk_nlinks_live_update,
1497 TP_PROTO(struct xfs_mount *mp, const struct xfs_inode *dp,
1498 int action, xfs_ino_t ino, int delta,
1499 const char *name, unsigned int namelen),
1500 TP_ARGS(mp, dp, action, ino, delta, name, namelen),
1503 __field(xfs_ino_t, dir)
1504 __field(int, action)
1505 __field(xfs_ino_t, ino)
1507 __field(unsigned int, namelen)
1508 __dynamic_array(char, name, namelen)
1511 __entry->dev = mp->m_super->s_dev;
1512 __entry->dir = dp ? dp->i_ino : NULLFSINO;
1513 __entry->action = action;
1515 __entry->delta = delta;
1516 __entry->namelen = namelen;
1517 memcpy(__get_str(name), name, namelen);
1519 TP_printk("dev %d:%d dir 0x%llx ino 0x%llx nlink_delta %d name '%.*s'",
1520 MAJOR(__entry->dev), MINOR(__entry->dev),
1528 TRACE_EVENT(xchk_nlinks_check_zero,
1529 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1530 const struct xchk_nlink *live),
1531 TP_ARGS(mp, ino, live),
1534 __field(xfs_ino_t, ino)
1535 __field(xfs_nlink_t, parents)
1536 __field(xfs_nlink_t, backrefs)
1537 __field(xfs_nlink_t, children)
1540 __entry->dev = mp->m_super->s_dev;
1542 __entry->parents = live->parents;
1543 __entry->backrefs = live->backrefs;
1544 __entry->children = live->children;
1546 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
1547 MAJOR(__entry->dev), MINOR(__entry->dev),
1554 TRACE_EVENT(xchk_nlinks_update_incore,
1555 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1556 const struct xchk_nlink *live, int parents_delta,
1557 int backrefs_delta, int children_delta),
1558 TP_ARGS(mp, ino, live, parents_delta, backrefs_delta, children_delta),
1561 __field(xfs_ino_t, ino)
1562 __field(xfs_nlink_t, parents)
1563 __field(xfs_nlink_t, backrefs)
1564 __field(xfs_nlink_t, children)
1565 __field(int, parents_delta)
1566 __field(int, backrefs_delta)
1567 __field(int, children_delta)
1570 __entry->dev = mp->m_super->s_dev;
1572 __entry->parents = live->parents;
1573 __entry->backrefs = live->backrefs;
1574 __entry->children = live->children;
1575 __entry->parents_delta = parents_delta;
1576 __entry->backrefs_delta = backrefs_delta;
1577 __entry->children_delta = children_delta;
1579 TP_printk("dev %d:%d ino 0x%llx parents %d:%u backrefs %d:%u children %d:%u",
1580 MAJOR(__entry->dev), MINOR(__entry->dev),
1582 __entry->parents_delta,
1584 __entry->backrefs_delta,
1586 __entry->children_delta,
1590 DECLARE_EVENT_CLASS(xchk_nlinks_diff_class,
1591 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip,
1592 const struct xchk_nlink *live),
1593 TP_ARGS(mp, ip, live),
1596 __field(xfs_ino_t, ino)
1597 __field(uint8_t, ftype)
1598 __field(xfs_nlink_t, nlink)
1599 __field(xfs_nlink_t, parents)
1600 __field(xfs_nlink_t, backrefs)
1601 __field(xfs_nlink_t, children)
1604 __entry->dev = mp->m_super->s_dev;
1605 __entry->ino = ip->i_ino;
1606 __entry->ftype = xfs_mode_to_ftype(VFS_I(ip)->i_mode);
1607 __entry->nlink = VFS_I(ip)->i_nlink;
1608 __entry->parents = live->parents;
1609 __entry->backrefs = live->backrefs;
1610 __entry->children = live->children;
1612 TP_printk("dev %d:%d ino 0x%llx ftype %s nlink %u parents %u backrefs %u children %u",
1613 MAJOR(__entry->dev), MINOR(__entry->dev),
1615 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
1621 #define DEFINE_SCRUB_NLINKS_DIFF_EVENT(name) \
1622 DEFINE_EVENT(xchk_nlinks_diff_class, name, \
1623 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip, \
1624 const struct xchk_nlink *live), \
1625 TP_ARGS(mp, ip, live))
1626 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xchk_nlinks_compare_inode);
1628 DECLARE_EVENT_CLASS(xchk_pptr_class,
1629 TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name,
1631 TP_ARGS(ip, name, far_ino),
1634 __field(xfs_ino_t, ino)
1635 __field(unsigned int, namelen)
1636 __dynamic_array(char, name, name->len)
1637 __field(xfs_ino_t, far_ino)
1640 __entry->dev = ip->i_mount->m_super->s_dev;
1641 __entry->ino = ip->i_ino;
1642 __entry->namelen = name->len;
1643 memcpy(__get_str(name), name, name->len);
1644 __entry->far_ino = far_ino;
1646 TP_printk("dev %d:%d ino 0x%llx name '%.*s' far_ino 0x%llx",
1647 MAJOR(__entry->dev), MINOR(__entry->dev),
1653 #define DEFINE_XCHK_PPTR_EVENT(name) \
1654 DEFINE_EVENT(xchk_pptr_class, name, \
1655 TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name, \
1656 xfs_ino_t far_ino), \
1657 TP_ARGS(ip, name, far_ino))
1658 DEFINE_XCHK_PPTR_EVENT(xchk_dir_defer);
1659 DEFINE_XCHK_PPTR_EVENT(xchk_dir_slowpath);
1660 DEFINE_XCHK_PPTR_EVENT(xchk_dir_ultraslowpath);
1661 DEFINE_XCHK_PPTR_EVENT(xchk_parent_defer);
1662 DEFINE_XCHK_PPTR_EVENT(xchk_parent_slowpath);
1663 DEFINE_XCHK_PPTR_EVENT(xchk_parent_ultraslowpath);
1665 DECLARE_EVENT_CLASS(xchk_dirtree_class,
1666 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip,
1667 unsigned int path_nr, const struct xfs_name *name,
1668 const struct xfs_parent_rec *pptr),
1669 TP_ARGS(sc, ip, path_nr, name, pptr),
1672 __field(unsigned int, path_nr)
1673 __field(xfs_ino_t, child_ino)
1674 __field(unsigned int, child_gen)
1675 __field(xfs_ino_t, parent_ino)
1676 __field(unsigned int, parent_gen)
1677 __field(unsigned int, namelen)
1678 __dynamic_array(char, name, name->len)
1681 __entry->dev = sc->mp->m_super->s_dev;
1682 __entry->path_nr = path_nr;
1683 __entry->child_ino = ip->i_ino;
1684 __entry->child_gen = VFS_I(ip)->i_generation;
1685 __entry->parent_ino = be64_to_cpu(pptr->p_ino);
1686 __entry->parent_gen = be32_to_cpu(pptr->p_gen);
1687 __entry->namelen = name->len;
1688 memcpy(__get_str(name), name->name, name->len);
1690 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'",
1691 MAJOR(__entry->dev), MINOR(__entry->dev),
1695 __entry->parent_ino,
1696 __entry->parent_gen,
1700 #define DEFINE_XCHK_DIRTREE_EVENT(name) \
1701 DEFINE_EVENT(xchk_dirtree_class, name, \
1702 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, \
1703 unsigned int path_nr, const struct xfs_name *name, \
1704 const struct xfs_parent_rec *pptr), \
1705 TP_ARGS(sc, ip, path_nr, name, pptr))
1706 DEFINE_XCHK_DIRTREE_EVENT(xchk_dirtree_create_path);
1707 DEFINE_XCHK_DIRTREE_EVENT(xchk_dirpath_walk_upwards);
1709 DECLARE_EVENT_CLASS(xchk_dirpath_class,
1710 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip,
1711 unsigned int path_nr, unsigned int step_nr,
1712 const struct xfs_name *name,
1713 const struct xfs_parent_rec *pptr),
1714 TP_ARGS(sc, ip, path_nr, step_nr, name, pptr),
1717 __field(unsigned int, path_nr)
1718 __field(unsigned int, step_nr)
1719 __field(xfs_ino_t, child_ino)
1720 __field(unsigned int, child_gen)
1721 __field(xfs_ino_t, parent_ino)
1722 __field(unsigned int, parent_gen)
1723 __field(unsigned int, namelen)
1724 __dynamic_array(char, name, name->len)
1727 __entry->dev = sc->mp->m_super->s_dev;
1728 __entry->path_nr = path_nr;
1729 __entry->step_nr = step_nr;
1730 __entry->child_ino = ip->i_ino;
1731 __entry->child_gen = VFS_I(ip)->i_generation;
1732 __entry->parent_ino = be64_to_cpu(pptr->p_ino);
1733 __entry->parent_gen = be32_to_cpu(pptr->p_gen);
1734 __entry->namelen = name->len;
1735 memcpy(__get_str(name), name->name, name->len);
1737 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'",
1738 MAJOR(__entry->dev), MINOR(__entry->dev),
1743 __entry->parent_ino,
1744 __entry->parent_gen,
1748 #define DEFINE_XCHK_DIRPATH_EVENT(name) \
1749 DEFINE_EVENT(xchk_dirpath_class, name, \
1750 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, \
1751 unsigned int path_nr, unsigned int step_nr, \
1752 const struct xfs_name *name, \
1753 const struct xfs_parent_rec *pptr), \
1754 TP_ARGS(sc, ip, path_nr, step_nr, name, pptr))
1755 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_disappeared);
1756 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_badgen);
1757 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_nondir_parent);
1758 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_unlinked_parent);
1759 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_found_next_step);
1760 DEFINE_XCHK_DIRPATH_EVENT(xchk_dirpath_crosses_tree);
1762 TRACE_DEFINE_ENUM(XCHK_DIRPATH_SCANNING);
1763 TRACE_DEFINE_ENUM(XCHK_DIRPATH_DELETE);
1764 TRACE_DEFINE_ENUM(XCHK_DIRPATH_CORRUPT);
1765 TRACE_DEFINE_ENUM(XCHK_DIRPATH_LOOP);
1766 TRACE_DEFINE_ENUM(XCHK_DIRPATH_STALE);
1767 TRACE_DEFINE_ENUM(XCHK_DIRPATH_OK);
1768 TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETING);
1769 TRACE_DEFINE_ENUM(XREP_DIRPATH_DELETED);
1770 TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTING);
1771 TRACE_DEFINE_ENUM(XREP_DIRPATH_ADOPTED);
1773 #define XCHK_DIRPATH_OUTCOME_STRINGS \
1774 { XCHK_DIRPATH_SCANNING, "scanning" }, \
1775 { XCHK_DIRPATH_DELETE, "delete" }, \
1776 { XCHK_DIRPATH_CORRUPT, "corrupt" }, \
1777 { XCHK_DIRPATH_LOOP, "loop" }, \
1778 { XCHK_DIRPATH_STALE, "stale" }, \
1779 { XCHK_DIRPATH_OK, "ok" }, \
1780 { XREP_DIRPATH_DELETING, "deleting" }, \
1781 { XREP_DIRPATH_DELETED, "deleted" }, \
1782 { XREP_DIRPATH_ADOPTING, "adopting" }, \
1783 { XREP_DIRPATH_ADOPTED, "adopted" }
1785 DECLARE_EVENT_CLASS(xchk_dirpath_outcome_class,
1786 TP_PROTO(struct xfs_scrub *sc, unsigned long long path_nr,
1787 unsigned int nr_steps, \
1788 unsigned int outcome),
1789 TP_ARGS(sc, path_nr, nr_steps, outcome),
1792 __field(unsigned long long, path_nr)
1793 __field(unsigned int, nr_steps)
1794 __field(unsigned int, outcome)
1797 __entry->dev = sc->mp->m_super->s_dev;
1798 __entry->path_nr = path_nr;
1799 __entry->nr_steps = nr_steps;
1800 __entry->outcome = outcome;
1802 TP_printk("dev %d:%d path %llu steps %u outcome %s",
1803 MAJOR(__entry->dev), MINOR(__entry->dev),
1806 __print_symbolic(__entry->outcome, XCHK_DIRPATH_OUTCOME_STRINGS))
1808 #define DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(name) \
1809 DEFINE_EVENT(xchk_dirpath_outcome_class, name, \
1810 TP_PROTO(struct xfs_scrub *sc, unsigned long long path_nr, \
1811 unsigned int nr_steps, \
1812 unsigned int outcome), \
1813 TP_ARGS(sc, path_nr, nr_steps, outcome))
1814 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_set_outcome);
1815 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xchk_dirpath_evaluate_path);
1817 DECLARE_EVENT_CLASS(xchk_dirtree_evaluate_class,
1818 TP_PROTO(const struct xchk_dirtree *dl,
1819 const struct xchk_dirtree_outcomes *oc),
1823 __field(xfs_ino_t, ino)
1824 __field(xfs_ino_t, rootino)
1825 __field(unsigned int, nr_paths)
1826 __field(unsigned int, bad)
1827 __field(unsigned int, suspect)
1828 __field(unsigned int, good)
1829 __field(bool, needs_adoption)
1832 __entry->dev = dl->sc->mp->m_super->s_dev;
1833 __entry->ino = dl->sc->ip->i_ino;
1834 __entry->rootino = dl->root_ino;
1835 __entry->nr_paths = dl->nr_paths;
1836 __entry->bad = oc->bad;
1837 __entry->suspect = oc->suspect;
1838 __entry->good = oc->good;
1839 __entry->needs_adoption = oc->needs_adoption ? 1 : 0;
1841 TP_printk("dev %d:%d ino 0x%llx rootino 0x%llx nr_paths %u bad %u suspect %u good %u adopt? %d",
1842 MAJOR(__entry->dev), MINOR(__entry->dev),
1849 __entry->needs_adoption)
1851 #define DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(name) \
1852 DEFINE_EVENT(xchk_dirtree_evaluate_class, name, \
1853 TP_PROTO(const struct xchk_dirtree *dl, \
1854 const struct xchk_dirtree_outcomes *oc), \
1856 DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xchk_dirtree_evaluate);
1858 TRACE_EVENT(xchk_dirpath_changed,
1859 TP_PROTO(struct xfs_scrub *sc, unsigned int path_nr,
1860 unsigned int step_nr, const struct xfs_inode *dp,
1861 const struct xfs_inode *ip, const struct xfs_name *xname),
1862 TP_ARGS(sc, path_nr, step_nr, dp, ip, xname),
1865 __field(unsigned int, path_nr)
1866 __field(unsigned int, step_nr)
1867 __field(xfs_ino_t, child_ino)
1868 __field(xfs_ino_t, parent_ino)
1869 __field(unsigned int, namelen)
1870 __dynamic_array(char, name, xname->len)
1873 __entry->dev = sc->mp->m_super->s_dev;
1874 __entry->path_nr = path_nr;
1875 __entry->step_nr = step_nr;
1876 __entry->child_ino = ip->i_ino;
1877 __entry->parent_ino = dp->i_ino;
1878 __entry->namelen = xname->len;
1879 memcpy(__get_str(name), xname->name, xname->len);
1881 TP_printk("dev %d:%d path %u step %u child_ino 0x%llx parent_ino 0x%llx name '%.*s'",
1882 MAJOR(__entry->dev), MINOR(__entry->dev),
1886 __entry->parent_ino,
1891 TRACE_EVENT(xchk_dirtree_live_update,
1892 TP_PROTO(struct xfs_scrub *sc, const struct xfs_inode *dp,
1893 int action, const struct xfs_inode *ip, int delta,
1894 const struct xfs_name *xname),
1895 TP_ARGS(sc, dp, action, ip, delta, xname),
1898 __field(xfs_ino_t, parent_ino)
1899 __field(int, action)
1900 __field(xfs_ino_t, child_ino)
1902 __field(unsigned int, namelen)
1903 __dynamic_array(char, name, xname->len)
1906 __entry->dev = sc->mp->m_super->s_dev;
1907 __entry->parent_ino = dp->i_ino;
1908 __entry->action = action;
1909 __entry->child_ino = ip->i_ino;
1910 __entry->delta = delta;
1911 __entry->namelen = xname->len;
1912 memcpy(__get_str(name), xname->name, xname->len);
1914 TP_printk("dev %d:%d parent_ino 0x%llx child_ino 0x%llx nlink_delta %d name '%.*s'",
1915 MAJOR(__entry->dev), MINOR(__entry->dev),
1916 __entry->parent_ino,
1923 DECLARE_EVENT_CLASS(xchk_metapath_class,
1924 TP_PROTO(struct xfs_scrub *sc, const char *path,
1925 struct xfs_inode *dp, xfs_ino_t ino),
1926 TP_ARGS(sc, path, dp, ino),
1929 __field(xfs_ino_t, scrub_ino)
1930 __field(xfs_ino_t, parent_ino)
1931 __field(xfs_ino_t, ino)
1932 __string(name, path)
1935 __entry->dev = sc->mp->m_super->s_dev;
1936 __entry->scrub_ino = sc->ip ? sc->ip->i_ino : NULLFSINO;
1937 __entry->parent_ino = dp ? dp->i_ino : NULLFSINO;
1941 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx name '%s' ino 0x%llx",
1942 MAJOR(__entry->dev), MINOR(__entry->dev),
1944 __entry->parent_ino,
1948 #define DEFINE_XCHK_METAPATH_EVENT(name) \
1949 DEFINE_EVENT(xchk_metapath_class, name, \
1950 TP_PROTO(struct xfs_scrub *sc, const char *path, \
1951 struct xfs_inode *dp, xfs_ino_t ino), \
1952 TP_ARGS(sc, path, dp, ino))
1953 DEFINE_XCHK_METAPATH_EVENT(xchk_metapath_lookup);
1955 /* repair tracepoints */
1956 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1958 DECLARE_EVENT_CLASS(xrep_extent_class,
1959 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
1961 TP_ARGS(pag, agbno, len),
1964 __field(xfs_agnumber_t, agno)
1965 __field(xfs_agblock_t, agbno)
1966 __field(xfs_extlen_t, len)
1969 __entry->dev = pag_mount(pag)->m_super->s_dev;
1970 __entry->agno = pag_agno(pag);
1971 __entry->agbno = agbno;
1974 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1975 MAJOR(__entry->dev), MINOR(__entry->dev),
1980 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
1981 DEFINE_EVENT(xrep_extent_class, name, \
1982 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno, \
1983 xfs_extlen_t len), \
1984 TP_ARGS(pag, agbno, len))
1985 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1986 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1987 DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1988 DEFINE_REPAIR_EXTENT_EVENT(xreap_bmapi_binval);
1989 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1991 DECLARE_EVENT_CLASS(xrep_reap_find_class,
1992 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
1993 xfs_extlen_t len, bool crosslinked),
1994 TP_ARGS(pag, agbno, len, crosslinked),
1997 __field(xfs_agnumber_t, agno)
1998 __field(xfs_agblock_t, agbno)
1999 __field(xfs_extlen_t, len)
2000 __field(bool, crosslinked)
2003 __entry->dev = pag_mount(pag)->m_super->s_dev;
2004 __entry->agno = pag_agno(pag);
2005 __entry->agbno = agbno;
2007 __entry->crosslinked = crosslinked;
2009 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
2010 MAJOR(__entry->dev), MINOR(__entry->dev),
2014 __entry->crosslinked ? 1 : 0)
2016 #define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
2017 DEFINE_EVENT(xrep_reap_find_class, name, \
2018 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno, \
2019 xfs_extlen_t len, bool crosslinked), \
2020 TP_ARGS(pag, agbno, len, crosslinked))
2021 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
2022 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_bmapi_select);
2024 TRACE_EVENT(xrep_ibt_walk_rmap,
2025 TP_PROTO(const struct xfs_perag *pag, const struct xfs_rmap_irec *rec),
2029 __field(xfs_agnumber_t, agno)
2030 __field(xfs_agblock_t, agbno)
2031 __field(xfs_extlen_t, len)
2032 __field(uint64_t, owner)
2033 __field(uint64_t, offset)
2034 __field(unsigned int, flags)
2037 __entry->dev = pag_mount(pag)->m_super->s_dev;
2038 __entry->agno = pag_agno(pag);
2039 __entry->agbno = rec->rm_startblock;
2040 __entry->len = rec->rm_blockcount;
2041 __entry->owner = rec->rm_owner;
2042 __entry->offset = rec->rm_offset;
2043 __entry->flags = rec->rm_flags;
2045 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
2046 MAJOR(__entry->dev), MINOR(__entry->dev),
2055 TRACE_EVENT(xrep_abt_found,
2056 TP_PROTO(const struct xfs_perag *pag,
2057 const struct xfs_alloc_rec_incore *rec),
2061 __field(xfs_agnumber_t, agno)
2062 __field(xfs_agblock_t, startblock)
2063 __field(xfs_extlen_t, blockcount)
2066 __entry->dev = pag_mount(pag)->m_super->s_dev;
2067 __entry->agno = pag_agno(pag);
2068 __entry->startblock = rec->ar_startblock;
2069 __entry->blockcount = rec->ar_blockcount;
2071 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2072 MAJOR(__entry->dev), MINOR(__entry->dev),
2074 __entry->startblock,
2075 __entry->blockcount)
2078 TRACE_EVENT(xrep_ibt_found,
2079 TP_PROTO(const struct xfs_perag *pag,
2080 const struct xfs_inobt_rec_incore *rec),
2084 __field(xfs_agnumber_t, agno)
2085 __field(xfs_agino_t, startino)
2086 __field(uint16_t, holemask)
2087 __field(uint8_t, count)
2088 __field(uint8_t, freecount)
2089 __field(uint64_t, freemask)
2092 __entry->dev = pag_mount(pag)->m_super->s_dev;
2093 __entry->agno = pag_agno(pag);
2094 __entry->startino = rec->ir_startino;
2095 __entry->holemask = rec->ir_holemask;
2096 __entry->count = rec->ir_count;
2097 __entry->freecount = rec->ir_freecount;
2098 __entry->freemask = rec->ir_free;
2100 TP_printk("dev %d:%d agno 0x%x agino 0x%x holemask 0x%x count 0x%x freecount 0x%x freemask 0x%llx",
2101 MAJOR(__entry->dev), MINOR(__entry->dev),
2110 TRACE_EVENT(xrep_refc_found,
2111 TP_PROTO(const struct xfs_perag *pag,
2112 const struct xfs_refcount_irec *rec),
2116 __field(xfs_agnumber_t, agno)
2117 __field(enum xfs_refc_domain, domain)
2118 __field(xfs_agblock_t, startblock)
2119 __field(xfs_extlen_t, blockcount)
2120 __field(xfs_nlink_t, refcount)
2123 __entry->dev = pag_mount(pag)->m_super->s_dev;
2124 __entry->agno = pag_agno(pag);
2125 __entry->domain = rec->rc_domain;
2126 __entry->startblock = rec->rc_startblock;
2127 __entry->blockcount = rec->rc_blockcount;
2128 __entry->refcount = rec->rc_refcount;
2130 TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u",
2131 MAJOR(__entry->dev), MINOR(__entry->dev),
2133 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
2134 __entry->startblock,
2135 __entry->blockcount,
2139 TRACE_EVENT(xrep_bmap_found,
2140 TP_PROTO(struct xfs_inode *ip, int whichfork,
2141 struct xfs_bmbt_irec *irec),
2142 TP_ARGS(ip, whichfork, irec),
2145 __field(xfs_ino_t, ino)
2146 __field(int, whichfork)
2147 __field(xfs_fileoff_t, lblk)
2148 __field(xfs_filblks_t, len)
2149 __field(xfs_fsblock_t, pblk)
2153 __entry->dev = VFS_I(ip)->i_sb->s_dev;
2154 __entry->ino = ip->i_ino;
2155 __entry->whichfork = whichfork;
2156 __entry->lblk = irec->br_startoff;
2157 __entry->len = irec->br_blockcount;
2158 __entry->pblk = irec->br_startblock;
2159 __entry->state = irec->br_state;
2161 TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
2162 MAJOR(__entry->dev), MINOR(__entry->dev),
2164 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2171 TRACE_EVENT(xrep_rmap_found,
2172 TP_PROTO(const struct xfs_perag *pag, const struct xfs_rmap_irec *rec),
2176 __field(xfs_agnumber_t, agno)
2177 __field(xfs_agblock_t, agbno)
2178 __field(xfs_extlen_t, len)
2179 __field(uint64_t, owner)
2180 __field(uint64_t, offset)
2181 __field(unsigned int, flags)
2184 __entry->dev = pag_mount(pag)->m_super->s_dev;
2185 __entry->agno = pag_agno(pag);
2186 __entry->agbno = rec->rm_startblock;
2187 __entry->len = rec->rm_blockcount;
2188 __entry->owner = rec->rm_owner;
2189 __entry->offset = rec->rm_offset;
2190 __entry->flags = rec->rm_flags;
2192 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
2193 MAJOR(__entry->dev), MINOR(__entry->dev),
2202 TRACE_EVENT(xrep_findroot_block,
2203 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
2204 uint32_t magic, uint16_t level),
2205 TP_ARGS(pag, agbno, magic, level),
2208 __field(xfs_agnumber_t, agno)
2209 __field(xfs_agblock_t, agbno)
2210 __field(uint32_t, magic)
2211 __field(uint16_t, level)
2214 __entry->dev = pag_mount(pag)->m_super->s_dev;
2215 __entry->agno = pag_agno(pag);
2216 __entry->agbno = agbno;
2217 __entry->magic = magic;
2218 __entry->level = level;
2220 TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
2221 MAJOR(__entry->dev), MINOR(__entry->dev),
2227 TRACE_EVENT(xrep_calc_ag_resblks,
2228 TP_PROTO(const struct xfs_perag *pag, xfs_agino_t icount,
2229 xfs_agblock_t aglen, xfs_agblock_t freelen,
2230 xfs_agblock_t usedlen),
2231 TP_ARGS(pag, icount, aglen, freelen, usedlen),
2234 __field(xfs_agnumber_t, agno)
2235 __field(xfs_agino_t, icount)
2236 __field(xfs_agblock_t, aglen)
2237 __field(xfs_agblock_t, freelen)
2238 __field(xfs_agblock_t, usedlen)
2241 __entry->dev = pag_mount(pag)->m_super->s_dev;
2242 __entry->agno = pag_agno(pag);
2243 __entry->icount = icount;
2244 __entry->aglen = aglen;
2245 __entry->freelen = freelen;
2246 __entry->usedlen = usedlen;
2248 TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
2249 MAJOR(__entry->dev), MINOR(__entry->dev),
2256 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
2257 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t bnobt_sz,
2258 xfs_agblock_t inobt_sz, xfs_agblock_t rmapbt_sz,
2259 xfs_agblock_t refcbt_sz),
2260 TP_ARGS(pag, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
2263 __field(xfs_agnumber_t, agno)
2264 __field(xfs_agblock_t, bnobt_sz)
2265 __field(xfs_agblock_t, inobt_sz)
2266 __field(xfs_agblock_t, rmapbt_sz)
2267 __field(xfs_agblock_t, refcbt_sz)
2270 __entry->dev = pag_mount(pag)->m_super->s_dev;
2271 __entry->agno = pag_agno(pag);
2272 __entry->bnobt_sz = bnobt_sz;
2273 __entry->inobt_sz = inobt_sz;
2274 __entry->rmapbt_sz = rmapbt_sz;
2275 __entry->refcbt_sz = refcbt_sz;
2277 TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
2278 MAJOR(__entry->dev), MINOR(__entry->dev),
2285 TRACE_EVENT(xrep_reset_counters,
2286 TP_PROTO(struct xfs_mount *mp, struct xchk_fscounters *fsc),
2290 __field(uint64_t, icount)
2291 __field(uint64_t, ifree)
2292 __field(uint64_t, fdblocks)
2293 __field(uint64_t, frextents)
2296 __entry->dev = mp->m_super->s_dev;
2297 __entry->icount = fsc->icount;
2298 __entry->ifree = fsc->ifree;
2299 __entry->fdblocks = fsc->fdblocks;
2300 __entry->frextents = fsc->frextents;
2302 TP_printk("dev %d:%d icount %llu ifree %llu fdblocks %llu frextents %llu",
2303 MAJOR(__entry->dev), MINOR(__entry->dev),
2310 DECLARE_EVENT_CLASS(xrep_newbt_extent_class,
2311 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
2312 xfs_extlen_t len, int64_t owner),
2313 TP_ARGS(pag, agbno, len, owner),
2316 __field(xfs_agnumber_t, agno)
2317 __field(xfs_agblock_t, agbno)
2318 __field(xfs_extlen_t, len)
2319 __field(int64_t, owner)
2322 __entry->dev = pag_mount(pag)->m_super->s_dev;
2323 __entry->agno = pag_agno(pag);
2324 __entry->agbno = agbno;
2326 __entry->owner = owner;
2328 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx",
2329 MAJOR(__entry->dev), MINOR(__entry->dev),
2335 #define DEFINE_NEWBT_EXTENT_EVENT(name) \
2336 DEFINE_EVENT(xrep_newbt_extent_class, name, \
2337 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno, \
2338 xfs_extlen_t len, int64_t owner), \
2339 TP_ARGS(pag, agbno, len, owner))
2340 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_ag_blocks);
2341 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_file_blocks);
2342 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_free_blocks);
2343 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_claim_block);
2345 DECLARE_EVENT_CLASS(xrep_dinode_class,
2346 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip),
2350 __field(xfs_ino_t, ino)
2351 __field(uint16_t, mode)
2352 __field(uint8_t, version)
2353 __field(uint8_t, format)
2354 __field(uint32_t, uid)
2355 __field(uint32_t, gid)
2356 __field(uint64_t, size)
2357 __field(uint64_t, nblocks)
2358 __field(uint32_t, extsize)
2359 __field(uint32_t, nextents)
2360 __field(uint16_t, anextents)
2361 __field(uint8_t, forkoff)
2362 __field(uint8_t, aformat)
2363 __field(uint16_t, flags)
2364 __field(uint32_t, gen)
2365 __field(uint64_t, flags2)
2366 __field(uint32_t, cowextsize)
2369 __entry->dev = sc->mp->m_super->s_dev;
2370 __entry->ino = sc->sm->sm_ino;
2371 __entry->mode = be16_to_cpu(dip->di_mode);
2372 __entry->version = dip->di_version;
2373 __entry->format = dip->di_format;
2374 __entry->uid = be32_to_cpu(dip->di_uid);
2375 __entry->gid = be32_to_cpu(dip->di_gid);
2376 __entry->size = be64_to_cpu(dip->di_size);
2377 __entry->nblocks = be64_to_cpu(dip->di_nblocks);
2378 __entry->extsize = be32_to_cpu(dip->di_extsize);
2379 __entry->nextents = be32_to_cpu(dip->di_nextents);
2380 __entry->anextents = be16_to_cpu(dip->di_anextents);
2381 __entry->forkoff = dip->di_forkoff;
2382 __entry->aformat = dip->di_aformat;
2383 __entry->flags = be16_to_cpu(dip->di_flags);
2384 __entry->gen = be32_to_cpu(dip->di_gen);
2385 __entry->flags2 = be64_to_cpu(dip->di_flags2);
2386 __entry->cowextsize = be32_to_cpu(dip->di_cowextsize);
2388 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",
2389 MAJOR(__entry->dev), MINOR(__entry->dev),
2406 __entry->cowextsize)
2409 #define DEFINE_REPAIR_DINODE_EVENT(name) \
2410 DEFINE_EVENT(xrep_dinode_class, name, \
2411 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip), \
2413 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_header);
2414 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_mode);
2415 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_flags);
2416 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_size);
2417 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_extsize_hints);
2418 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_symlink);
2419 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dir);
2420 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_fixed);
2421 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_forks);
2422 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dfork);
2423 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_afork);
2424 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_ensure_forkoff);
2426 DECLARE_EVENT_CLASS(xrep_inode_class,
2427 TP_PROTO(struct xfs_scrub *sc),
2431 __field(xfs_ino_t, ino)
2432 __field(xfs_fsize_t, size)
2433 __field(xfs_rfsblock_t, nblocks)
2434 __field(uint16_t, flags)
2435 __field(uint64_t, flags2)
2436 __field(uint32_t, nextents)
2437 __field(uint8_t, format)
2438 __field(uint32_t, anextents)
2439 __field(uint8_t, aformat)
2442 __entry->dev = sc->mp->m_super->s_dev;
2443 __entry->ino = sc->sm->sm_ino;
2444 __entry->size = sc->ip->i_disk_size;
2445 __entry->nblocks = sc->ip->i_nblocks;
2446 __entry->flags = sc->ip->i_diflags;
2447 __entry->flags2 = sc->ip->i_diflags2;
2448 __entry->nextents = sc->ip->i_df.if_nextents;
2449 __entry->format = sc->ip->i_df.if_format;
2450 __entry->anextents = sc->ip->i_af.if_nextents;
2451 __entry->aformat = sc->ip->i_af.if_format;
2453 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",
2454 MAJOR(__entry->dev), MINOR(__entry->dev),
2466 #define DEFINE_REPAIR_INODE_EVENT(name) \
2467 DEFINE_EVENT(xrep_inode_class, name, \
2468 TP_PROTO(struct xfs_scrub *sc), \
2470 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockcounts);
2471 DEFINE_REPAIR_INODE_EVENT(xrep_inode_ids);
2472 DEFINE_REPAIR_INODE_EVENT(xrep_inode_flags);
2473 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockdir_size);
2474 DEFINE_REPAIR_INODE_EVENT(xrep_inode_sfdir_size);
2475 DEFINE_REPAIR_INODE_EVENT(xrep_inode_dir_size);
2476 DEFINE_REPAIR_INODE_EVENT(xrep_inode_fixed);
2478 TRACE_EVENT(xrep_dinode_count_rmaps,
2479 TP_PROTO(struct xfs_scrub *sc, xfs_rfsblock_t data_blocks,
2480 xfs_rfsblock_t rt_blocks, xfs_rfsblock_t attr_blocks,
2481 xfs_extnum_t data_extents, xfs_extnum_t rt_extents,
2482 xfs_aextnum_t attr_extents),
2483 TP_ARGS(sc, data_blocks, rt_blocks, attr_blocks, data_extents,
2484 rt_extents, attr_extents),
2487 __field(xfs_ino_t, ino)
2488 __field(xfs_rfsblock_t, data_blocks)
2489 __field(xfs_rfsblock_t, rt_blocks)
2490 __field(xfs_rfsblock_t, attr_blocks)
2491 __field(xfs_extnum_t, data_extents)
2492 __field(xfs_extnum_t, rt_extents)
2493 __field(xfs_aextnum_t, attr_extents)
2496 __entry->dev = sc->mp->m_super->s_dev;
2497 __entry->ino = sc->sm->sm_ino;
2498 __entry->data_blocks = data_blocks;
2499 __entry->rt_blocks = rt_blocks;
2500 __entry->attr_blocks = attr_blocks;
2501 __entry->data_extents = data_extents;
2502 __entry->rt_extents = rt_extents;
2503 __entry->attr_extents = attr_extents;
2505 TP_printk("dev %d:%d ino 0x%llx dblocks 0x%llx rtblocks 0x%llx ablocks 0x%llx dextents %llu rtextents %llu aextents %u",
2506 MAJOR(__entry->dev), MINOR(__entry->dev),
2508 __entry->data_blocks,
2510 __entry->attr_blocks,
2511 __entry->data_extents,
2512 __entry->rt_extents,
2513 __entry->attr_extents)
2516 TRACE_EVENT(xrep_dinode_findmode_dirent,
2517 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2518 unsigned int ftype),
2519 TP_ARGS(sc, dp, ftype),
2522 __field(xfs_ino_t, ino)
2523 __field(xfs_ino_t, parent_ino)
2524 __field(unsigned int, ftype)
2527 __entry->dev = sc->mp->m_super->s_dev;
2528 __entry->ino = sc->sm->sm_ino;
2529 __entry->parent_ino = dp->i_ino;
2530 __entry->ftype = ftype;
2532 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s'",
2533 MAJOR(__entry->dev), MINOR(__entry->dev),
2535 __entry->parent_ino,
2536 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR))
2539 TRACE_EVENT(xrep_dinode_findmode_dirent_inval,
2540 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2541 unsigned int ftype, unsigned int found_ftype),
2542 TP_ARGS(sc, dp, ftype, found_ftype),
2545 __field(xfs_ino_t, ino)
2546 __field(xfs_ino_t, parent_ino)
2547 __field(unsigned int, ftype)
2548 __field(unsigned int, found_ftype)
2551 __entry->dev = sc->mp->m_super->s_dev;
2552 __entry->ino = sc->sm->sm_ino;
2553 __entry->parent_ino = dp->i_ino;
2554 __entry->ftype = ftype;
2555 __entry->found_ftype = found_ftype;
2557 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s' found_ftype '%s'",
2558 MAJOR(__entry->dev), MINOR(__entry->dev),
2560 __entry->parent_ino,
2561 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
2562 __print_symbolic(__entry->found_ftype, XFS_DIR3_FTYPE_STR))
2565 TRACE_EVENT(xrep_cow_mark_file_range,
2566 TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t startblock,
2567 xfs_fileoff_t startoff, xfs_filblks_t blockcount),
2568 TP_ARGS(ip, startblock, startoff, 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)
2577 __entry->dev = ip->i_mount->m_super->s_dev;
2578 __entry->ino = ip->i_ino;
2579 __entry->startoff = startoff;
2580 __entry->startblock = startblock;
2581 __entry->blockcount = blockcount;
2583 TP_printk("dev %d:%d ino 0x%llx fileoff 0x%llx startblock 0x%llx fsbcount 0x%llx",
2584 MAJOR(__entry->dev), MINOR(__entry->dev),
2587 __entry->startblock,
2588 __entry->blockcount)
2591 TRACE_EVENT(xrep_cow_replace_mapping,
2592 TP_PROTO(struct xfs_inode *ip, const struct xfs_bmbt_irec *irec,
2593 xfs_fsblock_t new_startblock, xfs_extlen_t new_blockcount),
2594 TP_ARGS(ip, irec, new_startblock, new_blockcount),
2597 __field(xfs_ino_t, ino)
2598 __field(xfs_fsblock_t, startblock)
2599 __field(xfs_fileoff_t, startoff)
2600 __field(xfs_filblks_t, blockcount)
2601 __field(xfs_exntst_t, state)
2602 __field(xfs_fsblock_t, new_startblock)
2603 __field(xfs_extlen_t, new_blockcount)
2606 __entry->dev = ip->i_mount->m_super->s_dev;
2607 __entry->ino = ip->i_ino;
2608 __entry->startoff = irec->br_startoff;
2609 __entry->startblock = irec->br_startblock;
2610 __entry->blockcount = irec->br_blockcount;
2611 __entry->state = irec->br_state;
2612 __entry->new_startblock = new_startblock;
2613 __entry->new_blockcount = new_blockcount;
2615 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",
2616 MAJOR(__entry->dev), MINOR(__entry->dev),
2619 __entry->startblock,
2620 __entry->blockcount,
2622 __entry->new_startblock,
2623 __entry->new_blockcount)
2626 TRACE_EVENT(xrep_cow_free_staging,
2627 TP_PROTO(const struct xfs_perag *pag, xfs_agblock_t agbno,
2628 xfs_extlen_t blockcount),
2629 TP_ARGS(pag, agbno, blockcount),
2632 __field(xfs_agnumber_t, agno)
2633 __field(xfs_agblock_t, agbno)
2634 __field(xfs_extlen_t, blockcount)
2637 __entry->dev = pag_mount(pag)->m_super->s_dev;
2638 __entry->agno = pag_agno(pag);
2639 __entry->agbno = agbno;
2640 __entry->blockcount = blockcount;
2642 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2643 MAJOR(__entry->dev), MINOR(__entry->dev),
2646 __entry->blockcount)
2649 #ifdef CONFIG_XFS_QUOTA
2650 DECLARE_EVENT_CLASS(xrep_dquot_class,
2651 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id),
2652 TP_ARGS(mp, type, id),
2655 __field(uint8_t, type)
2656 __field(uint32_t, id)
2659 __entry->dev = mp->m_super->s_dev;
2661 __entry->type = type;
2663 TP_printk("dev %d:%d type %s id 0x%x",
2664 MAJOR(__entry->dev), MINOR(__entry->dev),
2665 __print_flags(__entry->type, "|", XFS_DQTYPE_STRINGS),
2669 #define DEFINE_XREP_DQUOT_EVENT(name) \
2670 DEFINE_EVENT(xrep_dquot_class, name, \
2671 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id), \
2672 TP_ARGS(mp, type, id))
2673 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item);
2674 DEFINE_XREP_DQUOT_EVENT(xrep_disk_dquot);
2675 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item_fill_bmap_hole);
2676 DEFINE_XREP_DQUOT_EVENT(xrep_quotacheck_dquot);
2677 #endif /* CONFIG_XFS_QUOTA */
2679 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_update_inode);
2680 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_unfixable_inode);
2682 TRACE_EVENT(xrep_rmap_live_update,
2683 TP_PROTO(const struct xfs_perag *pag, unsigned int op,
2684 const struct xfs_rmap_update_params *p),
2685 TP_ARGS(pag, op, p),
2688 __field(xfs_agnumber_t, agno)
2689 __field(unsigned int, op)
2690 __field(xfs_agblock_t, agbno)
2691 __field(xfs_extlen_t, len)
2692 __field(uint64_t, owner)
2693 __field(uint64_t, offset)
2694 __field(unsigned int, flags)
2697 __entry->dev = pag_mount(pag)->m_super->s_dev;
2698 __entry->agno = pag_agno(pag);
2700 __entry->agbno = p->startblock;
2701 __entry->len = p->blockcount;
2702 xfs_owner_info_unpack(&p->oinfo, &__entry->owner,
2703 &__entry->offset, &__entry->flags);
2705 __entry->flags |= XFS_RMAP_UNWRITTEN;
2707 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",
2708 MAJOR(__entry->dev), MINOR(__entry->dev),
2718 TRACE_EVENT(xrep_tempfile_create,
2719 TP_PROTO(struct xfs_scrub *sc),
2723 __field(xfs_ino_t, ino)
2724 __field(unsigned int, type)
2725 __field(xfs_agnumber_t, agno)
2726 __field(xfs_ino_t, inum)
2727 __field(unsigned int, gen)
2728 __field(unsigned int, flags)
2729 __field(xfs_ino_t, temp_inum)
2732 __entry->dev = sc->mp->m_super->s_dev;
2733 __entry->ino = sc->file ? XFS_I(file_inode(sc->file))->i_ino : 0;
2734 __entry->type = sc->sm->sm_type;
2735 __entry->agno = sc->sm->sm_agno;
2736 __entry->inum = sc->sm->sm_ino;
2737 __entry->gen = sc->sm->sm_gen;
2738 __entry->flags = sc->sm->sm_flags;
2739 __entry->temp_inum = sc->tempip->i_ino;
2741 TP_printk("dev %d:%d ino 0x%llx type %s inum 0x%llx gen 0x%x flags 0x%x temp_inum 0x%llx",
2742 MAJOR(__entry->dev), MINOR(__entry->dev),
2744 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
2751 DECLARE_EVENT_CLASS(xrep_tempfile_class,
2752 TP_PROTO(struct xfs_scrub *sc, int whichfork,
2753 struct xfs_bmbt_irec *irec),
2754 TP_ARGS(sc, whichfork, irec),
2757 __field(xfs_ino_t, ino)
2758 __field(int, whichfork)
2759 __field(xfs_fileoff_t, lblk)
2760 __field(xfs_filblks_t, len)
2761 __field(xfs_fsblock_t, pblk)
2765 __entry->dev = sc->mp->m_super->s_dev;
2766 __entry->ino = sc->tempip->i_ino;
2767 __entry->whichfork = whichfork;
2768 __entry->lblk = irec->br_startoff;
2769 __entry->len = irec->br_blockcount;
2770 __entry->pblk = irec->br_startblock;
2771 __entry->state = irec->br_state;
2773 TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
2774 MAJOR(__entry->dev), MINOR(__entry->dev),
2776 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2782 #define DEFINE_XREP_TEMPFILE_EVENT(name) \
2783 DEFINE_EVENT(xrep_tempfile_class, name, \
2784 TP_PROTO(struct xfs_scrub *sc, int whichfork, \
2785 struct xfs_bmbt_irec *irec), \
2786 TP_ARGS(sc, whichfork, irec))
2787 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_prealloc);
2788 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_copyin);
2790 TRACE_EVENT(xreap_ifork_extent,
2791 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, int whichfork,
2792 const struct xfs_bmbt_irec *irec),
2793 TP_ARGS(sc, ip, whichfork, irec),
2796 __field(xfs_ino_t, ino)
2797 __field(int, whichfork)
2798 __field(xfs_fileoff_t, fileoff)
2799 __field(xfs_filblks_t, len)
2800 __field(xfs_agnumber_t, agno)
2801 __field(xfs_agblock_t, agbno)
2805 __entry->dev = sc->mp->m_super->s_dev;
2806 __entry->ino = ip->i_ino;
2807 __entry->whichfork = whichfork;
2808 __entry->fileoff = irec->br_startoff;
2809 __entry->len = irec->br_blockcount;
2810 __entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2811 __entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2812 __entry->state = irec->br_state;
2814 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",
2815 MAJOR(__entry->dev), MINOR(__entry->dev),
2817 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2825 TRACE_EVENT(xreap_bmapi_binval_scan,
2826 TP_PROTO(struct xfs_scrub *sc, const struct xfs_bmbt_irec *irec,
2827 xfs_extlen_t scan_blocks),
2828 TP_ARGS(sc, irec, scan_blocks),
2831 __field(xfs_filblks_t, len)
2832 __field(xfs_agnumber_t, agno)
2833 __field(xfs_agblock_t, agbno)
2834 __field(xfs_extlen_t, scan_blocks)
2837 __entry->dev = sc->mp->m_super->s_dev;
2838 __entry->len = irec->br_blockcount;
2839 __entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2840 __entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2841 __entry->scan_blocks = scan_blocks;
2843 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%llx scan_blocks 0x%x",
2844 MAJOR(__entry->dev), MINOR(__entry->dev),
2848 __entry->scan_blocks)
2851 TRACE_EVENT(xrep_xattr_recover_leafblock,
2852 TP_PROTO(struct xfs_inode *ip, xfs_dablk_t dabno, uint16_t magic),
2853 TP_ARGS(ip, dabno, magic),
2856 __field(xfs_ino_t, ino)
2857 __field(xfs_dablk_t, dabno)
2858 __field(uint16_t, magic)
2861 __entry->dev = ip->i_mount->m_super->s_dev;
2862 __entry->ino = ip->i_ino;
2863 __entry->dabno = dabno;
2864 __entry->magic = magic;
2866 TP_printk("dev %d:%d ino 0x%llx dablk 0x%x magic 0x%x",
2867 MAJOR(__entry->dev), MINOR(__entry->dev),
2873 DECLARE_EVENT_CLASS(xrep_xattr_salvage_class,
2874 TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name,
2875 unsigned int namelen, unsigned int valuelen),
2876 TP_ARGS(ip, flags, name, namelen, valuelen),
2879 __field(xfs_ino_t, ino)
2880 __field(unsigned int, flags)
2881 __field(unsigned int, namelen)
2882 __dynamic_array(char, name, namelen)
2883 __field(unsigned int, valuelen)
2886 __entry->dev = ip->i_mount->m_super->s_dev;
2887 __entry->ino = ip->i_ino;
2888 __entry->flags = flags;
2889 __entry->namelen = namelen;
2890 memcpy(__get_str(name), name, namelen);
2891 __entry->valuelen = valuelen;
2893 TP_printk("dev %d:%d ino 0x%llx flags %s name '%.*s' valuelen 0x%x",
2894 MAJOR(__entry->dev), MINOR(__entry->dev),
2896 __print_flags(__entry->flags, "|", XFS_ATTR_NAMESPACE_STR),
2901 #define DEFINE_XREP_XATTR_SALVAGE_EVENT(name) \
2902 DEFINE_EVENT(xrep_xattr_salvage_class, name, \
2903 TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name, \
2904 unsigned int namelen, unsigned int valuelen), \
2905 TP_ARGS(ip, flags, name, namelen, valuelen))
2906 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec);
2907 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec);
2908 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_stash_xattr);
2909 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_insert_xattr);
2911 DECLARE_EVENT_CLASS(xrep_pptr_salvage_class,
2912 TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name,
2913 unsigned int namelen, const void *value, unsigned int valuelen),
2914 TP_ARGS(ip, flags, name, namelen, value, valuelen),
2917 __field(xfs_ino_t, ino)
2918 __field(xfs_ino_t, parent_ino)
2919 __field(unsigned int, parent_gen)
2920 __field(unsigned int, namelen)
2921 __dynamic_array(char, name, namelen)
2924 const struct xfs_parent_rec *rec = value;
2926 __entry->dev = ip->i_mount->m_super->s_dev;
2927 __entry->ino = ip->i_ino;
2928 __entry->parent_ino = be64_to_cpu(rec->p_ino);
2929 __entry->parent_gen = be32_to_cpu(rec->p_gen);
2930 __entry->namelen = namelen;
2931 memcpy(__get_str(name), name, namelen);
2933 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
2934 MAJOR(__entry->dev), MINOR(__entry->dev),
2936 __entry->parent_ino,
2937 __entry->parent_gen,
2941 #define DEFINE_XREP_PPTR_SALVAGE_EVENT(name) \
2942 DEFINE_EVENT(xrep_pptr_salvage_class, name, \
2943 TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name, \
2944 unsigned int namelen, const void *value, unsigned int valuelen), \
2945 TP_ARGS(ip, flags, name, namelen, value, valuelen))
2946 DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_salvage_pptr);
2947 DEFINE_XREP_PPTR_SALVAGE_EVENT(xrep_xattr_insert_pptr);
2949 TRACE_EVENT(xrep_xattr_class,
2950 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip),
2951 TP_ARGS(ip, arg_ip),
2954 __field(xfs_ino_t, ino)
2955 __field(xfs_ino_t, src_ino)
2958 __entry->dev = ip->i_mount->m_super->s_dev;
2959 __entry->ino = ip->i_ino;
2960 __entry->src_ino = arg_ip->i_ino;
2962 TP_printk("dev %d:%d ino 0x%llx src 0x%llx",
2963 MAJOR(__entry->dev), MINOR(__entry->dev),
2967 #define DEFINE_XREP_XATTR_EVENT(name) \
2968 DEFINE_EVENT(xrep_xattr_class, name, \
2969 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip), \
2970 TP_ARGS(ip, arg_ip))
2971 DEFINE_XREP_XATTR_EVENT(xrep_xattr_rebuild_tree);
2972 DEFINE_XREP_XATTR_EVENT(xrep_xattr_reset_fork);
2973 DEFINE_XREP_XATTR_EVENT(xrep_xattr_full_reset);
2975 DECLARE_EVENT_CLASS(xrep_xattr_pptr_scan_class,
2976 TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp,
2977 const struct xfs_name *name),
2978 TP_ARGS(ip, dp, name),
2981 __field(xfs_ino_t, ino)
2982 __field(xfs_ino_t, parent_ino)
2983 __field(unsigned int, parent_gen)
2984 __field(unsigned int, namelen)
2985 __dynamic_array(char, name, name->len)
2988 __entry->dev = ip->i_mount->m_super->s_dev;
2989 __entry->ino = ip->i_ino;
2990 __entry->parent_ino = dp->i_ino;
2991 __entry->parent_gen = VFS_IC(dp)->i_generation;
2992 __entry->namelen = name->len;
2993 memcpy(__get_str(name), name->name, name->len);
2995 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
2996 MAJOR(__entry->dev), MINOR(__entry->dev),
2998 __entry->parent_ino,
2999 __entry->parent_gen,
3003 #define DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(name) \
3004 DEFINE_EVENT(xrep_xattr_pptr_scan_class, name, \
3005 TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp, \
3006 const struct xfs_name *name), \
3007 TP_ARGS(ip, dp, name))
3008 DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentadd);
3009 DEFINE_XREP_XATTR_PPTR_SCAN_EVENT(xrep_xattr_stash_parentremove);
3011 TRACE_EVENT(xrep_dir_recover_dirblock,
3012 TP_PROTO(struct xfs_inode *dp, xfs_dablk_t dabno, uint32_t magic,
3013 uint32_t magic_guess),
3014 TP_ARGS(dp, dabno, magic, magic_guess),
3017 __field(xfs_ino_t, dir_ino)
3018 __field(xfs_dablk_t, dabno)
3019 __field(uint32_t, magic)
3020 __field(uint32_t, magic_guess)
3023 __entry->dev = dp->i_mount->m_super->s_dev;
3024 __entry->dir_ino = dp->i_ino;
3025 __entry->dabno = dabno;
3026 __entry->magic = magic;
3027 __entry->magic_guess = magic_guess;
3029 TP_printk("dev %d:%d dir 0x%llx dablk 0x%x magic 0x%x magic_guess 0x%x",
3030 MAJOR(__entry->dev), MINOR(__entry->dev),
3034 __entry->magic_guess)
3037 DECLARE_EVENT_CLASS(xrep_dir_class,
3038 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino),
3039 TP_ARGS(dp, parent_ino),
3042 __field(xfs_ino_t, dir_ino)
3043 __field(xfs_ino_t, parent_ino)
3046 __entry->dev = dp->i_mount->m_super->s_dev;
3047 __entry->dir_ino = dp->i_ino;
3048 __entry->parent_ino = parent_ino;
3050 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3051 MAJOR(__entry->dev), MINOR(__entry->dev),
3053 __entry->parent_ino)
3055 #define DEFINE_XREP_DIR_EVENT(name) \
3056 DEFINE_EVENT(xrep_dir_class, name, \
3057 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino), \
3058 TP_ARGS(dp, parent_ino))
3059 DEFINE_XREP_DIR_EVENT(xrep_dir_rebuild_tree);
3060 DEFINE_XREP_DIR_EVENT(xrep_dir_reset_fork);
3061 DEFINE_XREP_DIR_EVENT(xrep_parent_reset_dotdot);
3063 DECLARE_EVENT_CLASS(xrep_dirent_class,
3064 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name,
3066 TP_ARGS(dp, name, ino),
3069 __field(xfs_ino_t, dir_ino)
3070 __field(unsigned int, namelen)
3071 __dynamic_array(char, name, name->len)
3072 __field(xfs_ino_t, ino)
3073 __field(uint8_t, ftype)
3076 __entry->dev = dp->i_mount->m_super->s_dev;
3077 __entry->dir_ino = dp->i_ino;
3078 __entry->namelen = name->len;
3079 memcpy(__get_str(name), name->name, name->len);
3081 __entry->ftype = name->type;
3083 TP_printk("dev %d:%d dir 0x%llx ftype %s name '%.*s' ino 0x%llx",
3084 MAJOR(__entry->dev), MINOR(__entry->dev),
3086 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
3091 #define DEFINE_XREP_DIRENT_EVENT(name) \
3092 DEFINE_EVENT(xrep_dirent_class, name, \
3093 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name, \
3095 TP_ARGS(dp, name, ino))
3096 DEFINE_XREP_DIRENT_EVENT(xrep_dir_salvage_entry);
3097 DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_createname);
3098 DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_createname);
3099 DEFINE_XREP_DIRENT_EVENT(xrep_adoption_reparent);
3100 DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_removename);
3101 DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_removename);
3103 DECLARE_EVENT_CLASS(xrep_adoption_class,
3104 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved),
3105 TP_ARGS(dp, ip, moved),
3108 __field(xfs_ino_t, dir_ino)
3109 __field(xfs_ino_t, child_ino)
3110 __field(bool, moved)
3113 __entry->dev = dp->i_mount->m_super->s_dev;
3114 __entry->dir_ino = dp->i_ino;
3115 __entry->child_ino = ip->i_ino;
3116 __entry->moved = moved;
3118 TP_printk("dev %d:%d dir 0x%llx child 0x%llx moved? %d",
3119 MAJOR(__entry->dev), MINOR(__entry->dev),
3124 #define DEFINE_XREP_ADOPTION_EVENT(name) \
3125 DEFINE_EVENT(xrep_adoption_class, name, \
3126 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved), \
3127 TP_ARGS(dp, ip, moved))
3128 DEFINE_XREP_ADOPTION_EVENT(xrep_adoption_trans_roll);
3130 DECLARE_EVENT_CLASS(xrep_parent_salvage_class,
3131 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino),
3135 __field(xfs_ino_t, dir_ino)
3136 __field(xfs_ino_t, ino)
3139 __entry->dev = dp->i_mount->m_super->s_dev;
3140 __entry->dir_ino = dp->i_ino;
3143 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
3144 MAJOR(__entry->dev), MINOR(__entry->dev),
3148 #define DEFINE_XREP_PARENT_SALVAGE_EVENT(name) \
3149 DEFINE_EVENT(xrep_parent_salvage_class, name, \
3150 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino), \
3152 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_dir_salvaged_parent);
3153 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_dirent);
3154 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_from_dcache);
3156 DECLARE_EVENT_CLASS(xrep_pptr_class,
3157 TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name,
3158 const struct xfs_parent_rec *pptr),
3159 TP_ARGS(ip, name, pptr),
3162 __field(xfs_ino_t, ino)
3163 __field(xfs_ino_t, parent_ino)
3164 __field(unsigned int, parent_gen)
3165 __field(unsigned int, namelen)
3166 __dynamic_array(char, name, name->len)
3169 __entry->dev = ip->i_mount->m_super->s_dev;
3170 __entry->ino = ip->i_ino;
3171 __entry->parent_ino = be64_to_cpu(pptr->p_ino);
3172 __entry->parent_gen = be32_to_cpu(pptr->p_gen);
3173 __entry->namelen = name->len;
3174 memcpy(__get_str(name), name->name, name->len);
3176 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
3177 MAJOR(__entry->dev), MINOR(__entry->dev),
3179 __entry->parent_ino,
3180 __entry->parent_gen,
3184 #define DEFINE_XREP_PPTR_EVENT(name) \
3185 DEFINE_EVENT(xrep_pptr_class, name, \
3186 TP_PROTO(struct xfs_inode *ip, const struct xfs_name *name, \
3187 const struct xfs_parent_rec *pptr), \
3188 TP_ARGS(ip, name, pptr))
3189 DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentadd);
3190 DEFINE_XREP_PPTR_EVENT(xrep_xattr_replay_parentremove);
3191 DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentadd);
3192 DEFINE_XREP_PPTR_EVENT(xrep_parent_replay_parentremove);
3194 DECLARE_EVENT_CLASS(xrep_pptr_scan_class,
3195 TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp,
3196 const struct xfs_name *name),
3197 TP_ARGS(ip, dp, name),
3200 __field(xfs_ino_t, ino)
3201 __field(xfs_ino_t, parent_ino)
3202 __field(unsigned int, parent_gen)
3203 __field(unsigned int, namelen)
3204 __dynamic_array(char, name, name->len)
3207 __entry->dev = ip->i_mount->m_super->s_dev;
3208 __entry->ino = ip->i_ino;
3209 __entry->parent_ino = dp->i_ino;
3210 __entry->parent_gen = VFS_IC(dp)->i_generation;
3211 __entry->namelen = name->len;
3212 memcpy(__get_str(name), name->name, name->len);
3214 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx parent_gen 0x%x name '%.*s'",
3215 MAJOR(__entry->dev), MINOR(__entry->dev),
3217 __entry->parent_ino,
3218 __entry->parent_gen,
3222 #define DEFINE_XREP_PPTR_SCAN_EVENT(name) \
3223 DEFINE_EVENT(xrep_pptr_scan_class, name, \
3224 TP_PROTO(struct xfs_inode *ip, const struct xfs_inode *dp, \
3225 const struct xfs_name *name), \
3226 TP_ARGS(ip, dp, name))
3227 DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentadd);
3228 DEFINE_XREP_PPTR_SCAN_EVENT(xrep_parent_stash_parentremove);
3230 TRACE_EVENT(xrep_nlinks_set_record,
3231 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
3232 const struct xchk_nlink *obs),
3233 TP_ARGS(mp, ino, obs),
3236 __field(xfs_ino_t, ino)
3237 __field(xfs_nlink_t, parents)
3238 __field(xfs_nlink_t, backrefs)
3239 __field(xfs_nlink_t, children)
3242 __entry->dev = mp->m_super->s_dev;
3244 __entry->parents = obs->parents;
3245 __entry->backrefs = obs->backrefs;
3246 __entry->children = obs->children;
3248 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
3249 MAJOR(__entry->dev), MINOR(__entry->dev),
3256 DECLARE_EVENT_CLASS(xrep_dentry_class,
3257 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry),
3258 TP_ARGS(mp, dentry),
3261 __field(unsigned int, flags)
3262 __field(unsigned long, ino)
3263 __field(bool, positive)
3264 __field(unsigned long, parent_ino)
3265 __field(unsigned int, namelen)
3266 __dynamic_array(char, name, dentry->d_name.len)
3269 __entry->dev = mp->m_super->s_dev;
3270 __entry->flags = dentry->d_flags;
3271 __entry->positive = d_is_positive(dentry);
3272 if (dentry->d_parent && d_inode(dentry->d_parent))
3273 __entry->parent_ino = d_inode(dentry->d_parent)->i_ino;
3275 __entry->parent_ino = -1UL;
3276 __entry->ino = d_inode(dentry) ? d_inode(dentry)->i_ino : 0;
3277 __entry->namelen = dentry->d_name.len;
3278 memcpy(__get_str(name), dentry->d_name.name, dentry->d_name.len);
3280 TP_printk("dev %d:%d flags 0x%x positive? %d parent_ino 0x%lx ino 0x%lx name '%.*s'",
3281 MAJOR(__entry->dev), MINOR(__entry->dev),
3284 __entry->parent_ino,
3289 #define DEFINE_REPAIR_DENTRY_EVENT(name) \
3290 DEFINE_EVENT(xrep_dentry_class, name, \
3291 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry), \
3292 TP_ARGS(mp, dentry))
3293 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_child);
3294 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_invalidate_child);
3295 DEFINE_REPAIR_DENTRY_EVENT(xrep_dirtree_delete_child);
3297 TRACE_EVENT(xrep_symlink_salvage_target,
3298 TP_PROTO(struct xfs_inode *ip, char *target, unsigned int targetlen),
3299 TP_ARGS(ip, target, targetlen),
3302 __field(xfs_ino_t, ino)
3303 __field(unsigned int, targetlen)
3304 __dynamic_array(char, target, targetlen + 1)
3307 __entry->dev = ip->i_mount->m_super->s_dev;
3308 __entry->ino = ip->i_ino;
3309 __entry->targetlen = targetlen;
3310 memcpy(__get_str(target), target, targetlen);
3311 __get_str(target)[targetlen] = 0;
3313 TP_printk("dev %d:%d ip 0x%llx target '%.*s'",
3314 MAJOR(__entry->dev), MINOR(__entry->dev),
3320 DECLARE_EVENT_CLASS(xrep_symlink_class,
3321 TP_PROTO(struct xfs_inode *ip),
3325 __field(xfs_ino_t, ino)
3328 __entry->dev = ip->i_mount->m_super->s_dev;
3329 __entry->ino = ip->i_ino;
3331 TP_printk("dev %d:%d ip 0x%llx",
3332 MAJOR(__entry->dev), MINOR(__entry->dev),
3336 #define DEFINE_XREP_SYMLINK_EVENT(name) \
3337 DEFINE_EVENT(xrep_symlink_class, name, \
3338 TP_PROTO(struct xfs_inode *ip), \
3340 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_rebuild);
3341 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_reset_fork);
3343 TRACE_EVENT(xrep_iunlink_visit,
3344 TP_PROTO(const struct xfs_perag *pag, unsigned int bucket,
3345 xfs_agino_t bucket_agino, struct xfs_inode *ip),
3346 TP_ARGS(pag, bucket, bucket_agino, ip),
3349 __field(xfs_agnumber_t, agno)
3350 __field(xfs_agino_t, agino)
3351 __field(unsigned int, bucket)
3352 __field(xfs_agino_t, bucket_agino)
3353 __field(xfs_agino_t, prev_agino)
3354 __field(xfs_agino_t, next_agino)
3357 __entry->dev = pag_mount(pag)->m_super->s_dev;
3358 __entry->agno = pag_agno(pag);
3359 __entry->agino = XFS_INO_TO_AGINO(pag_mount(pag), ip->i_ino);
3360 __entry->bucket = bucket;
3361 __entry->bucket_agino = bucket_agino;
3362 __entry->prev_agino = ip->i_prev_unlinked;
3363 __entry->next_agino = ip->i_next_unlinked;
3365 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",
3366 MAJOR(__entry->dev), MINOR(__entry->dev),
3370 __entry->bucket_agino,
3371 __entry->prev_agino,
3372 __entry->next_agino)
3375 TRACE_EVENT(xrep_iunlink_reload_next,
3376 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3377 TP_ARGS(ip, prev_agino),
3380 __field(xfs_agnumber_t, agno)
3381 __field(xfs_agino_t, agino)
3382 __field(xfs_agino_t, old_prev_agino)
3383 __field(xfs_agino_t, prev_agino)
3384 __field(xfs_agino_t, next_agino)
3385 __field(unsigned int, nlink)
3388 __entry->dev = ip->i_mount->m_super->s_dev;
3389 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3390 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3391 __entry->old_prev_agino = ip->i_prev_unlinked;
3392 __entry->prev_agino = prev_agino;
3393 __entry->next_agino = ip->i_next_unlinked;
3394 __entry->nlink = VFS_I(ip)->i_nlink;
3396 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",
3397 MAJOR(__entry->dev), MINOR(__entry->dev),
3399 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3402 __entry->old_prev_agino,
3403 __entry->prev_agino,
3404 __entry->next_agino)
3407 TRACE_EVENT(xrep_iunlink_reload_ondisk,
3408 TP_PROTO(struct xfs_inode *ip),
3412 __field(xfs_agnumber_t, agno)
3413 __field(xfs_agino_t, agino)
3414 __field(unsigned int, nlink)
3415 __field(xfs_agino_t, next_agino)
3418 __entry->dev = ip->i_mount->m_super->s_dev;
3419 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3420 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3421 __entry->nlink = VFS_I(ip)->i_nlink;
3422 __entry->next_agino = ip->i_next_unlinked;
3424 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x nlink %u next_agino 0x%x",
3425 MAJOR(__entry->dev), MINOR(__entry->dev),
3427 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3430 __entry->next_agino)
3433 TRACE_EVENT(xrep_iunlink_walk_ondisk_bucket,
3434 TP_PROTO(const 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_mount(pag)->m_super->s_dev;
3446 __entry->agno = pag_agno(pag);
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)
3459 DECLARE_EVENT_CLASS(xrep_iunlink_resolve_class,
3460 TP_PROTO(const 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),
3465 __field(xfs_agnumber_t, agno)
3466 __field(unsigned int, bucket)
3467 __field(xfs_agino_t, prev_agino)
3468 __field(xfs_agino_t, next_agino)
3471 __entry->dev = pag_mount(pag)->m_super->s_dev;
3472 __entry->agno = pag_agno(pag);
3473 __entry->bucket = bucket;
3474 __entry->prev_agino = prev_agino;
3475 __entry->next_agino = next_agino;
3477 TP_printk("dev %d:%d agno 0x%x bucket %u prev_agino 0x%x next_agino 0x%x",
3478 MAJOR(__entry->dev), MINOR(__entry->dev),
3481 __entry->prev_agino,
3482 __entry->next_agino)
3484 #define DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(name) \
3485 DEFINE_EVENT(xrep_iunlink_resolve_class, name, \
3486 TP_PROTO(const struct xfs_perag *pag, unsigned int bucket, \
3487 xfs_agino_t prev_agino, xfs_agino_t next_agino), \
3488 TP_ARGS(pag, bucket, prev_agino, next_agino))
3489 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_uncached);
3490 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_wronglist);
3491 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_nolist);
3492 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_ok);
3494 TRACE_EVENT(xrep_iunlink_relink_next,
3495 TP_PROTO(struct xfs_inode *ip, xfs_agino_t next_agino),
3496 TP_ARGS(ip, next_agino),
3499 __field(xfs_agnumber_t, agno)
3500 __field(xfs_agino_t, agino)
3501 __field(xfs_agino_t, next_agino)
3502 __field(xfs_agino_t, new_next_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->next_agino = ip->i_next_unlinked;
3509 __entry->new_next_agino = next_agino;
3511 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x -> 0x%x",
3512 MAJOR(__entry->dev), MINOR(__entry->dev),
3514 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3516 __entry->next_agino,
3517 __entry->new_next_agino)
3520 TRACE_EVENT(xrep_iunlink_relink_prev,
3521 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
3522 TP_ARGS(ip, prev_agino),
3525 __field(xfs_agnumber_t, agno)
3526 __field(xfs_agino_t, agino)
3527 __field(xfs_agino_t, prev_agino)
3528 __field(xfs_agino_t, new_prev_agino)
3531 __entry->dev = ip->i_mount->m_super->s_dev;
3532 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
3533 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
3534 __entry->prev_agino = ip->i_prev_unlinked;
3535 __entry->new_prev_agino = prev_agino;
3537 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x prev_agino 0x%x -> 0x%x",
3538 MAJOR(__entry->dev), MINOR(__entry->dev),
3540 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
3542 __entry->prev_agino,
3543 __entry->new_prev_agino)
3546 TRACE_EVENT(xrep_iunlink_add_to_bucket,
3547 TP_PROTO(const struct xfs_perag *pag, unsigned int bucket,
3548 xfs_agino_t agino, xfs_agino_t curr_head),
3549 TP_ARGS(pag, bucket, agino, curr_head),
3552 __field(xfs_agnumber_t, agno)
3553 __field(unsigned int, bucket)
3554 __field(xfs_agino_t, agino)
3555 __field(xfs_agino_t, next_agino)
3558 __entry->dev = pag_mount(pag)->m_super->s_dev;
3559 __entry->agno = pag_agno(pag);
3560 __entry->bucket = bucket;
3561 __entry->agino = agino;
3562 __entry->next_agino = curr_head;
3564 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x",
3565 MAJOR(__entry->dev), MINOR(__entry->dev),
3569 __entry->next_agino)
3572 TRACE_EVENT(xrep_iunlink_commit_bucket,
3573 TP_PROTO(const struct xfs_perag *pag, unsigned int bucket,
3574 xfs_agino_t old_agino, xfs_agino_t agino),
3575 TP_ARGS(pag, bucket, old_agino, agino),
3578 __field(xfs_agnumber_t, agno)
3579 __field(unsigned int, bucket)
3580 __field(xfs_agino_t, old_agino)
3581 __field(xfs_agino_t, agino)
3584 __entry->dev = pag_mount(pag)->m_super->s_dev;
3585 __entry->agno = pag_agno(pag);
3586 __entry->bucket = bucket;
3587 __entry->old_agino = old_agino;
3588 __entry->agino = agino;
3590 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x -> 0x%x",
3591 MAJOR(__entry->dev), MINOR(__entry->dev),
3598 DEFINE_XCHK_DIRPATH_OUTCOME_EVENT(xrep_dirpath_set_outcome);
3599 DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_delete_path);
3600 DEFINE_XCHK_DIRTREE_EVENT(xrep_dirtree_create_adoption);
3601 DEFINE_XCHK_DIRTREE_EVALUATE_EVENT(xrep_dirtree_decided_fate);
3603 DEFINE_XCHK_METAPATH_EVENT(xrep_metapath_lookup);
3604 DEFINE_XCHK_METAPATH_EVENT(xrep_metapath_try_unlink);
3605 DEFINE_XCHK_METAPATH_EVENT(xrep_metapath_unlink);
3606 DEFINE_XCHK_METAPATH_EVENT(xrep_metapath_link);
3608 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
3610 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
3612 #undef TRACE_INCLUDE_PATH
3613 #define TRACE_INCLUDE_PATH .
3614 #define TRACE_INCLUDE_FILE scrub/trace
3615 #include <trace/define_trace.h>