1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017-2023 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <djwong@kernel.org>
6 * NOTE: none of these tracepoints shall be considered a stable kernel ABI
7 * as they can change at any time. See xfs_trace.h for documentation of
8 * specific units found in tracepoint output.
11 #define TRACE_SYSTEM xfs_scrub
13 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define _TRACE_XFS_SCRUB_TRACE_H
16 #include <linux/tracepoint.h>
18 #include "xfs_quota_defs.h"
23 struct xfarray_sortinfo;
27 struct xchk_fscounters;
28 struct xfs_rmap_update_params;
31 * ftrace's __print_symbolic requires that all enum values be wrapped in the
32 * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
33 * ring buffer. Somehow this was only worth mentioning in the ftrace sample
36 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
37 TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
39 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
40 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
54 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
55 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
56 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
57 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
58 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
59 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
60 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
61 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
62 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
63 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
64 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_QUOTACHECK);
65 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_NLINKS);
66 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_HEALTHY);
68 #define XFS_SCRUB_TYPE_STRINGS \
69 { XFS_SCRUB_TYPE_PROBE, "probe" }, \
70 { XFS_SCRUB_TYPE_SB, "sb" }, \
71 { XFS_SCRUB_TYPE_AGF, "agf" }, \
72 { XFS_SCRUB_TYPE_AGFL, "agfl" }, \
73 { XFS_SCRUB_TYPE_AGI, "agi" }, \
74 { XFS_SCRUB_TYPE_BNOBT, "bnobt" }, \
75 { XFS_SCRUB_TYPE_CNTBT, "cntbt" }, \
76 { XFS_SCRUB_TYPE_INOBT, "inobt" }, \
77 { XFS_SCRUB_TYPE_FINOBT, "finobt" }, \
78 { XFS_SCRUB_TYPE_RMAPBT, "rmapbt" }, \
79 { XFS_SCRUB_TYPE_REFCNTBT, "refcountbt" }, \
80 { XFS_SCRUB_TYPE_INODE, "inode" }, \
81 { XFS_SCRUB_TYPE_BMBTD, "bmapbtd" }, \
82 { XFS_SCRUB_TYPE_BMBTA, "bmapbta" }, \
83 { XFS_SCRUB_TYPE_BMBTC, "bmapbtc" }, \
84 { XFS_SCRUB_TYPE_DIR, "directory" }, \
85 { XFS_SCRUB_TYPE_XATTR, "xattr" }, \
86 { XFS_SCRUB_TYPE_SYMLINK, "symlink" }, \
87 { XFS_SCRUB_TYPE_PARENT, "parent" }, \
88 { XFS_SCRUB_TYPE_RTBITMAP, "rtbitmap" }, \
89 { XFS_SCRUB_TYPE_RTSUM, "rtsummary" }, \
90 { XFS_SCRUB_TYPE_UQUOTA, "usrquota" }, \
91 { XFS_SCRUB_TYPE_GQUOTA, "grpquota" }, \
92 { XFS_SCRUB_TYPE_PQUOTA, "prjquota" }, \
93 { XFS_SCRUB_TYPE_FSCOUNTERS, "fscounters" }, \
94 { XFS_SCRUB_TYPE_QUOTACHECK, "quotacheck" }, \
95 { XFS_SCRUB_TYPE_NLINKS, "nlinks" }, \
96 { XFS_SCRUB_TYPE_HEALTHY, "healthy" }
98 #define XFS_SCRUB_FLAG_STRINGS \
99 { XFS_SCRUB_IFLAG_REPAIR, "repair" }, \
100 { XFS_SCRUB_OFLAG_CORRUPT, "corrupt" }, \
101 { XFS_SCRUB_OFLAG_PREEN, "preen" }, \
102 { XFS_SCRUB_OFLAG_XFAIL, "xfail" }, \
103 { XFS_SCRUB_OFLAG_XCORRUPT, "xcorrupt" }, \
104 { XFS_SCRUB_OFLAG_INCOMPLETE, "incomplete" }, \
105 { XFS_SCRUB_OFLAG_WARNING, "warning" }, \
106 { XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED, "norepair" }, \
107 { XFS_SCRUB_IFLAG_FORCE_REBUILD, "rebuild" }
109 #define XFS_SCRUB_STATE_STRINGS \
110 { XCHK_TRY_HARDER, "try_harder" }, \
111 { XCHK_HAVE_FREEZE_PROT, "nofreeze" }, \
112 { XCHK_FSGATES_DRAIN, "fsgates_drain" }, \
113 { XCHK_NEED_DRAIN, "need_drain" }, \
114 { XCHK_FSGATES_QUOTA, "fsgates_quota" }, \
115 { XCHK_FSGATES_DIRENTS, "fsgates_dirents" }, \
116 { XCHK_FSGATES_RMAP, "fsgates_rmap" }, \
117 { XREP_FSGATES_EXCHANGE_RANGE, "fsgates_exchrange" }, \
118 { XREP_RESET_PERAG_RESV, "reset_perag_resv" }, \
119 { XREP_ALREADY_FIXED, "already_fixed" }
121 TRACE_DEFINE_ENUM(XFS_RMAP_MAP);
122 TRACE_DEFINE_ENUM(XFS_RMAP_MAP_SHARED);
123 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP);
124 TRACE_DEFINE_ENUM(XFS_RMAP_UNMAP_SHARED);
125 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT);
126 TRACE_DEFINE_ENUM(XFS_RMAP_CONVERT_SHARED);
127 TRACE_DEFINE_ENUM(XFS_RMAP_ALLOC);
128 TRACE_DEFINE_ENUM(XFS_RMAP_FREE);
130 DECLARE_EVENT_CLASS(xchk_class,
131 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
133 TP_ARGS(ip, sm, error),
136 __field(xfs_ino_t, ino)
137 __field(unsigned int, type)
138 __field(xfs_agnumber_t, agno)
139 __field(xfs_ino_t, inum)
140 __field(unsigned int, gen)
141 __field(unsigned int, flags)
145 __entry->dev = ip->i_mount->m_super->s_dev;
146 __entry->ino = ip->i_ino;
147 __entry->type = sm->sm_type;
148 __entry->agno = sm->sm_agno;
149 __entry->inum = sm->sm_ino;
150 __entry->gen = sm->sm_gen;
151 __entry->flags = sm->sm_flags;
152 __entry->error = error;
154 TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
155 MAJOR(__entry->dev), MINOR(__entry->dev),
157 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
161 __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
164 #define DEFINE_SCRUB_EVENT(name) \
165 DEFINE_EVENT(xchk_class, name, \
166 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
168 TP_ARGS(ip, sm, error))
170 DEFINE_SCRUB_EVENT(xchk_start);
171 DEFINE_SCRUB_EVENT(xchk_done);
172 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
173 DEFINE_SCRUB_EVENT(xrep_attempt);
174 DEFINE_SCRUB_EVENT(xrep_done);
176 DECLARE_EVENT_CLASS(xchk_fsgate_class,
177 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgate_flags),
178 TP_ARGS(sc, fsgate_flags),
181 __field(unsigned int, type)
182 __field(unsigned int, fsgate_flags)
185 __entry->dev = sc->mp->m_super->s_dev;
186 __entry->type = sc->sm->sm_type;
187 __entry->fsgate_flags = fsgate_flags;
189 TP_printk("dev %d:%d type %s fsgates '%s'",
190 MAJOR(__entry->dev), MINOR(__entry->dev),
191 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
192 __print_flags(__entry->fsgate_flags, "|", XFS_SCRUB_STATE_STRINGS))
195 #define DEFINE_SCRUB_FSHOOK_EVENT(name) \
196 DEFINE_EVENT(xchk_fsgate_class, name, \
197 TP_PROTO(struct xfs_scrub *sc, unsigned int fsgates_flags), \
198 TP_ARGS(sc, fsgates_flags))
200 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_enable);
201 DEFINE_SCRUB_FSHOOK_EVENT(xchk_fsgates_disable);
203 TRACE_EVENT(xchk_op_error,
204 TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
205 xfs_agblock_t bno, int error, void *ret_ip),
206 TP_ARGS(sc, agno, bno, error, ret_ip),
209 __field(unsigned int, type)
210 __field(xfs_agnumber_t, agno)
211 __field(xfs_agblock_t, bno)
213 __field(void *, ret_ip)
216 __entry->dev = sc->mp->m_super->s_dev;
217 __entry->type = sc->sm->sm_type;
218 __entry->agno = agno;
220 __entry->error = error;
221 __entry->ret_ip = ret_ip;
223 TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
224 MAJOR(__entry->dev), MINOR(__entry->dev),
225 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
232 TRACE_EVENT(xchk_file_op_error,
233 TP_PROTO(struct xfs_scrub *sc, int whichfork,
234 xfs_fileoff_t offset, int error, void *ret_ip),
235 TP_ARGS(sc, whichfork, offset, error, ret_ip),
238 __field(xfs_ino_t, ino)
239 __field(int, whichfork)
240 __field(unsigned int, type)
241 __field(xfs_fileoff_t, offset)
243 __field(void *, ret_ip)
246 __entry->dev = sc->ip->i_mount->m_super->s_dev;
247 __entry->ino = sc->ip->i_ino;
248 __entry->whichfork = whichfork;
249 __entry->type = sc->sm->sm_type;
250 __entry->offset = offset;
251 __entry->error = error;
252 __entry->ret_ip = ret_ip;
254 TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
255 MAJOR(__entry->dev), MINOR(__entry->dev),
257 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
258 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
264 DECLARE_EVENT_CLASS(xchk_block_error_class,
265 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
266 TP_ARGS(sc, daddr, ret_ip),
269 __field(unsigned int, type)
270 __field(xfs_agnumber_t, agno)
271 __field(xfs_agblock_t, agbno)
272 __field(void *, ret_ip)
275 __entry->dev = sc->mp->m_super->s_dev;
276 __entry->type = sc->sm->sm_type;
277 __entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
278 __entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
279 __entry->ret_ip = ret_ip;
281 TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
282 MAJOR(__entry->dev), MINOR(__entry->dev),
283 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
289 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
290 DEFINE_EVENT(xchk_block_error_class, name, \
291 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
293 TP_ARGS(sc, daddr, ret_ip))
295 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
296 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
297 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
299 DECLARE_EVENT_CLASS(xchk_ino_error_class,
300 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
301 TP_ARGS(sc, ino, ret_ip),
304 __field(xfs_ino_t, ino)
305 __field(unsigned int, type)
306 __field(void *, ret_ip)
309 __entry->dev = sc->mp->m_super->s_dev;
311 __entry->type = sc->sm->sm_type;
312 __entry->ret_ip = ret_ip;
314 TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
315 MAJOR(__entry->dev), MINOR(__entry->dev),
317 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
321 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
322 DEFINE_EVENT(xchk_ino_error_class, name, \
323 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
325 TP_ARGS(sc, ino, ret_ip))
327 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
328 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
329 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
331 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
332 TP_PROTO(struct xfs_scrub *sc, int whichfork,
333 xfs_fileoff_t offset, void *ret_ip),
334 TP_ARGS(sc, whichfork, offset, ret_ip),
337 __field(xfs_ino_t, ino)
338 __field(int, whichfork)
339 __field(unsigned int, type)
340 __field(xfs_fileoff_t, offset)
341 __field(void *, ret_ip)
344 __entry->dev = sc->ip->i_mount->m_super->s_dev;
345 __entry->ino = sc->ip->i_ino;
346 __entry->whichfork = whichfork;
347 __entry->type = sc->sm->sm_type;
348 __entry->offset = offset;
349 __entry->ret_ip = ret_ip;
351 TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
352 MAJOR(__entry->dev), MINOR(__entry->dev),
354 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
355 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
360 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
361 DEFINE_EVENT(xchk_fblock_error_class, name, \
362 TP_PROTO(struct xfs_scrub *sc, int whichfork, \
363 xfs_fileoff_t offset, void *ret_ip), \
364 TP_ARGS(sc, whichfork, offset, ret_ip))
366 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
367 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
368 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_preen);
370 #ifdef CONFIG_XFS_QUOTA
371 DECLARE_EVENT_CLASS(xchk_dqiter_class,
372 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id),
376 __field(xfs_dqtype_t, dqtype)
377 __field(xfs_ino_t, ino)
378 __field(unsigned long long, cur_id)
379 __field(unsigned long long, id)
380 __field(xfs_fileoff_t, startoff)
381 __field(xfs_fsblock_t, startblock)
382 __field(xfs_filblks_t, blockcount)
383 __field(xfs_exntst_t, state)
386 __entry->dev = cursor->sc->ip->i_mount->m_super->s_dev;
387 __entry->dqtype = cursor->dqtype;
388 __entry->ino = cursor->quota_ip->i_ino;
389 __entry->cur_id = cursor->id;
390 __entry->startoff = cursor->bmap.br_startoff;
391 __entry->startblock = cursor->bmap.br_startblock;
392 __entry->blockcount = cursor->bmap.br_blockcount;
393 __entry->state = cursor->bmap.br_state;
396 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",
397 MAJOR(__entry->dev), MINOR(__entry->dev),
398 __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
408 #define DEFINE_SCRUB_DQITER_EVENT(name) \
409 DEFINE_EVENT(xchk_dqiter_class, name, \
410 TP_PROTO(struct xchk_dqiter *cursor, uint64_t id), \
412 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_revalidate_bmap);
413 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_bmap);
414 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter_advance_incore);
415 DEFINE_SCRUB_DQITER_EVENT(xchk_dquot_iter);
417 TRACE_EVENT(xchk_qcheck_error,
418 TP_PROTO(struct xfs_scrub *sc, xfs_dqtype_t dqtype, xfs_dqid_t id,
420 TP_ARGS(sc, dqtype, id, ret_ip),
423 __field(xfs_dqtype_t, dqtype)
424 __field(xfs_dqid_t, id)
425 __field(void *, ret_ip)
428 __entry->dev = sc->mp->m_super->s_dev;
429 __entry->dqtype = dqtype;
431 __entry->ret_ip = ret_ip;
433 TP_printk("dev %d:%d dquot type %s id 0x%x ret_ip %pS",
434 MAJOR(__entry->dev), MINOR(__entry->dev),
435 __print_symbolic(__entry->dqtype, XFS_DQTYPE_STRINGS),
439 #endif /* CONFIG_XFS_QUOTA */
441 TRACE_EVENT(xchk_incomplete,
442 TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
446 __field(unsigned int, type)
447 __field(void *, ret_ip)
450 __entry->dev = sc->mp->m_super->s_dev;
451 __entry->type = sc->sm->sm_type;
452 __entry->ret_ip = ret_ip;
454 TP_printk("dev %d:%d type %s ret_ip %pS",
455 MAJOR(__entry->dev), MINOR(__entry->dev),
456 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
460 TRACE_EVENT(xchk_btree_op_error,
461 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
462 int level, int error, void *ret_ip),
463 TP_ARGS(sc, cur, level, error, ret_ip),
466 __field(unsigned int, type)
467 __string(name, cur->bc_ops->name)
469 __field(xfs_agnumber_t, agno)
470 __field(xfs_agblock_t, bno)
473 __field(void *, ret_ip)
476 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
478 __entry->dev = sc->mp->m_super->s_dev;
479 __entry->type = sc->sm->sm_type;
480 __assign_str(name, cur->bc_ops->name);
481 __entry->level = level;
482 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
483 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
484 __entry->ptr = cur->bc_levels[level].ptr;
485 __entry->error = error;
486 __entry->ret_ip = ret_ip;
488 TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
489 MAJOR(__entry->dev), MINOR(__entry->dev),
490 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
500 TRACE_EVENT(xchk_ifork_btree_op_error,
501 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
502 int level, int error, void *ret_ip),
503 TP_ARGS(sc, cur, level, error, ret_ip),
506 __field(xfs_ino_t, ino)
507 __field(int, whichfork)
508 __field(unsigned int, type)
509 __string(name, cur->bc_ops->name)
512 __field(xfs_agnumber_t, agno)
513 __field(xfs_agblock_t, bno)
515 __field(void *, ret_ip)
518 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
519 __entry->dev = sc->mp->m_super->s_dev;
520 __entry->ino = sc->ip->i_ino;
521 __entry->whichfork = cur->bc_ino.whichfork;
522 __entry->type = sc->sm->sm_type;
523 __assign_str(name, cur->bc_ops->name);
524 __entry->level = level;
525 __entry->ptr = cur->bc_levels[level].ptr;
526 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
527 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
528 __entry->error = error;
529 __entry->ret_ip = ret_ip;
531 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",
532 MAJOR(__entry->dev), MINOR(__entry->dev),
534 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
535 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
545 TRACE_EVENT(xchk_btree_error,
546 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
547 int level, void *ret_ip),
548 TP_ARGS(sc, cur, level, ret_ip),
551 __field(unsigned int, type)
552 __string(name, cur->bc_ops->name)
554 __field(xfs_agnumber_t, agno)
555 __field(xfs_agblock_t, bno)
557 __field(void *, ret_ip)
560 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
561 __entry->dev = sc->mp->m_super->s_dev;
562 __entry->type = sc->sm->sm_type;
563 __assign_str(name, cur->bc_ops->name);
564 __entry->level = level;
565 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
566 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
567 __entry->ptr = cur->bc_levels[level].ptr;
568 __entry->ret_ip = ret_ip;
570 TP_printk("dev %d:%d type %s %sbt level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
571 MAJOR(__entry->dev), MINOR(__entry->dev),
572 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
581 TRACE_EVENT(xchk_ifork_btree_error,
582 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
583 int level, void *ret_ip),
584 TP_ARGS(sc, cur, level, ret_ip),
587 __field(xfs_ino_t, ino)
588 __field(int, whichfork)
589 __field(unsigned int, type)
590 __string(name, cur->bc_ops->name)
592 __field(xfs_agnumber_t, agno)
593 __field(xfs_agblock_t, bno)
595 __field(void *, ret_ip)
598 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
599 __entry->dev = sc->mp->m_super->s_dev;
600 __entry->ino = sc->ip->i_ino;
601 __entry->whichfork = cur->bc_ino.whichfork;
602 __entry->type = sc->sm->sm_type;
603 __assign_str(name, cur->bc_ops->name);
604 __entry->level = level;
605 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
606 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
607 __entry->ptr = cur->bc_levels[level].ptr;
608 __entry->ret_ip = ret_ip;
610 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",
611 MAJOR(__entry->dev), MINOR(__entry->dev),
613 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
614 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
623 DECLARE_EVENT_CLASS(xchk_sbtree_class,
624 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
626 TP_ARGS(sc, cur, level),
630 __string(name, cur->bc_ops->name)
631 __field(xfs_agnumber_t, agno)
632 __field(xfs_agblock_t, bno)
634 __field(int, nlevels)
638 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
640 __entry->dev = sc->mp->m_super->s_dev;
641 __entry->type = sc->sm->sm_type;
642 __assign_str(name, cur->bc_ops->name);
643 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
644 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
645 __entry->level = level;
646 __entry->nlevels = cur->bc_nlevels;
647 __entry->ptr = cur->bc_levels[level].ptr;
649 TP_printk("dev %d:%d type %s %sbt agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
650 MAJOR(__entry->dev), MINOR(__entry->dev),
651 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
659 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
660 DEFINE_EVENT(xchk_sbtree_class, name, \
661 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
663 TP_ARGS(sc, cur, level))
665 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
666 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
668 TRACE_EVENT(xchk_xref_error,
669 TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
670 TP_ARGS(sc, error, ret_ip),
675 __field(void *, ret_ip)
678 __entry->dev = sc->mp->m_super->s_dev;
679 __entry->type = sc->sm->sm_type;
680 __entry->error = error;
681 __entry->ret_ip = ret_ip;
683 TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
684 MAJOR(__entry->dev), MINOR(__entry->dev),
685 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
690 TRACE_EVENT(xchk_iallocbt_check_cluster,
691 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
692 xfs_agino_t startino, xfs_daddr_t map_daddr,
693 unsigned short map_len, unsigned int chunk_ino,
694 unsigned int nr_inodes, uint16_t cluster_mask,
695 uint16_t holemask, unsigned int cluster_ino),
696 TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
697 cluster_mask, holemask, cluster_ino),
700 __field(xfs_agnumber_t, agno)
701 __field(xfs_agino_t, startino)
702 __field(xfs_daddr_t, map_daddr)
703 __field(unsigned short, map_len)
704 __field(unsigned int, chunk_ino)
705 __field(unsigned int, nr_inodes)
706 __field(unsigned int, cluster_ino)
707 __field(uint16_t, cluster_mask)
708 __field(uint16_t, holemask)
711 __entry->dev = mp->m_super->s_dev;
712 __entry->agno = agno;
713 __entry->startino = startino;
714 __entry->map_daddr = map_daddr;
715 __entry->map_len = map_len;
716 __entry->chunk_ino = chunk_ino;
717 __entry->nr_inodes = nr_inodes;
718 __entry->cluster_mask = cluster_mask;
719 __entry->holemask = holemask;
720 __entry->cluster_ino = cluster_ino;
722 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",
723 MAJOR(__entry->dev), MINOR(__entry->dev),
730 __entry->cluster_mask,
732 __entry->cluster_ino)
735 TRACE_EVENT(xchk_inode_is_allocated,
736 TP_PROTO(struct xfs_inode *ip),
740 __field(xfs_ino_t, ino)
741 __field(unsigned long, iflags)
742 __field(umode_t, mode)
745 __entry->dev = VFS_I(ip)->i_sb->s_dev;
746 __entry->ino = ip->i_ino;
747 __entry->iflags = ip->i_flags;
748 __entry->mode = VFS_I(ip)->i_mode;
750 TP_printk("dev %d:%d ino 0x%llx iflags 0x%lx mode 0x%x",
751 MAJOR(__entry->dev), MINOR(__entry->dev),
757 TRACE_EVENT(xchk_fscounters_calc,
758 TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
759 uint64_t fdblocks, uint64_t delalloc),
760 TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
763 __field(int64_t, icount_sb)
764 __field(uint64_t, icount_calculated)
765 __field(int64_t, ifree_sb)
766 __field(uint64_t, ifree_calculated)
767 __field(int64_t, fdblocks_sb)
768 __field(uint64_t, fdblocks_calculated)
769 __field(uint64_t, delalloc)
772 __entry->dev = mp->m_super->s_dev;
773 __entry->icount_sb = mp->m_sb.sb_icount;
774 __entry->icount_calculated = icount;
775 __entry->ifree_sb = mp->m_sb.sb_ifree;
776 __entry->ifree_calculated = ifree;
777 __entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
778 __entry->fdblocks_calculated = fdblocks;
779 __entry->delalloc = delalloc;
781 TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
782 MAJOR(__entry->dev), MINOR(__entry->dev),
784 __entry->icount_calculated,
786 __entry->ifree_calculated,
787 __entry->fdblocks_sb,
788 __entry->fdblocks_calculated,
792 TRACE_EVENT(xchk_fscounters_within_range,
793 TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
795 TP_ARGS(mp, expected, curr_value, old_value),
798 __field(uint64_t, expected)
799 __field(int64_t, curr_value)
800 __field(int64_t, old_value)
803 __entry->dev = mp->m_super->s_dev;
804 __entry->expected = expected;
805 __entry->curr_value = curr_value;
806 __entry->old_value = old_value;
808 TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
809 MAJOR(__entry->dev), MINOR(__entry->dev),
815 DECLARE_EVENT_CLASS(xchk_fsfreeze_class,
816 TP_PROTO(struct xfs_scrub *sc, int error),
820 __field(unsigned int, type)
824 __entry->dev = sc->mp->m_super->s_dev;
825 __entry->type = sc->sm->sm_type;
826 __entry->error = error;
828 TP_printk("dev %d:%d type %s error %d",
829 MAJOR(__entry->dev), MINOR(__entry->dev),
830 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
833 #define DEFINE_XCHK_FSFREEZE_EVENT(name) \
834 DEFINE_EVENT(xchk_fsfreeze_class, name, \
835 TP_PROTO(struct xfs_scrub *sc, int error), \
837 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsfreeze);
838 DEFINE_XCHK_FSFREEZE_EVENT(xchk_fsthaw);
840 TRACE_EVENT(xchk_refcount_incorrect,
841 TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
843 TP_ARGS(pag, irec, seen),
846 __field(xfs_agnumber_t, agno)
847 __field(enum xfs_refc_domain, domain)
848 __field(xfs_agblock_t, startblock)
849 __field(xfs_extlen_t, blockcount)
850 __field(xfs_nlink_t, refcount)
851 __field(xfs_nlink_t, seen)
854 __entry->dev = pag->pag_mount->m_super->s_dev;
855 __entry->agno = pag->pag_agno;
856 __entry->domain = irec->rc_domain;
857 __entry->startblock = irec->rc_startblock;
858 __entry->blockcount = irec->rc_blockcount;
859 __entry->refcount = irec->rc_refcount;
860 __entry->seen = seen;
862 TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
863 MAJOR(__entry->dev), MINOR(__entry->dev),
865 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
872 TRACE_EVENT(xfile_create,
873 TP_PROTO(struct xfile *xf),
877 __field(unsigned long, ino)
878 __array(char, pathname, 256)
884 __entry->ino = file_inode(xf->file)->i_ino;
885 memset(pathname, 0, sizeof(pathname));
886 path = file_path(xf->file, pathname, sizeof(pathname) - 1);
889 strncpy(__entry->pathname, path, sizeof(__entry->pathname));
891 TP_printk("xfino 0x%lx path '%s'",
896 TRACE_EVENT(xfile_destroy,
897 TP_PROTO(struct xfile *xf),
900 __field(unsigned long, ino)
901 __field(unsigned long long, bytes)
902 __field(loff_t, size)
905 struct inode *inode = file_inode(xf->file);
907 __entry->ino = inode->i_ino;
908 __entry->bytes = inode->i_blocks << SECTOR_SHIFT;
909 __entry->size = i_size_read(inode);
911 TP_printk("xfino 0x%lx mem_bytes 0x%llx isize 0x%llx",
917 DECLARE_EVENT_CLASS(xfile_class,
918 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount),
919 TP_ARGS(xf, pos, bytecount),
921 __field(unsigned long, ino)
922 __field(unsigned long long, bytes_used)
924 __field(loff_t, size)
925 __field(unsigned long long, bytecount)
928 struct inode *inode = file_inode(xf->file);
930 __entry->ino = inode->i_ino;
931 __entry->bytes_used = inode->i_blocks << SECTOR_SHIFT;
933 __entry->size = i_size_read(inode);
934 __entry->bytecount = bytecount;
936 TP_printk("xfino 0x%lx mem_bytes 0x%llx pos 0x%llx bytecount 0x%llx isize 0x%llx",
943 #define DEFINE_XFILE_EVENT(name) \
944 DEFINE_EVENT(xfile_class, name, \
945 TP_PROTO(struct xfile *xf, loff_t pos, unsigned long long bytecount), \
946 TP_ARGS(xf, pos, bytecount))
947 DEFINE_XFILE_EVENT(xfile_load);
948 DEFINE_XFILE_EVENT(xfile_store);
949 DEFINE_XFILE_EVENT(xfile_seek_data);
950 DEFINE_XFILE_EVENT(xfile_get_folio);
951 DEFINE_XFILE_EVENT(xfile_put_folio);
952 DEFINE_XFILE_EVENT(xfile_discard);
954 TRACE_EVENT(xfarray_create,
955 TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
956 TP_ARGS(xfa, required_capacity),
958 __field(unsigned long, ino)
959 __field(uint64_t, max_nr)
960 __field(size_t, obj_size)
961 __field(int, obj_size_log)
962 __field(unsigned long long, required_capacity)
965 __entry->max_nr = xfa->max_nr;
966 __entry->obj_size = xfa->obj_size;
967 __entry->obj_size_log = xfa->obj_size_log;
968 __entry->ino = file_inode(xfa->xfile->file)->i_ino;
969 __entry->required_capacity = required_capacity;
971 TP_printk("xfino 0x%lx max_nr %llu reqd_nr %llu objsz %zu objszlog %d",
974 __entry->required_capacity,
976 __entry->obj_size_log)
979 TRACE_EVENT(xfarray_isort,
980 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
983 __field(unsigned long, ino)
984 __field(unsigned long long, lo)
985 __field(unsigned long long, hi)
988 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
992 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
996 __entry->hi - __entry->lo)
999 TRACE_EVENT(xfarray_foliosort,
1000 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1001 TP_ARGS(si, lo, hi),
1003 __field(unsigned long, ino)
1004 __field(unsigned long long, lo)
1005 __field(unsigned long long, hi)
1008 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1012 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu",
1016 __entry->hi - __entry->lo)
1019 TRACE_EVENT(xfarray_qsort,
1020 TP_PROTO(struct xfarray_sortinfo *si, uint64_t lo, uint64_t hi),
1021 TP_ARGS(si, lo, hi),
1023 __field(unsigned long, ino)
1024 __field(unsigned long long, lo)
1025 __field(unsigned long long, hi)
1026 __field(int, stack_depth)
1027 __field(int, max_stack_depth)
1030 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1033 __entry->stack_depth = si->stack_depth;
1034 __entry->max_stack_depth = si->max_stack_depth;
1036 TP_printk("xfino 0x%lx lo %llu hi %llu elts %llu stack %d/%d",
1040 __entry->hi - __entry->lo,
1041 __entry->stack_depth,
1042 __entry->max_stack_depth)
1045 TRACE_EVENT(xfarray_sort,
1046 TP_PROTO(struct xfarray_sortinfo *si, size_t bytes),
1049 __field(unsigned long, ino)
1050 __field(unsigned long long, nr)
1051 __field(size_t, obj_size)
1052 __field(size_t, bytes)
1053 __field(unsigned int, max_stack_depth)
1056 __entry->nr = si->array->nr;
1057 __entry->obj_size = si->array->obj_size;
1058 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1059 __entry->bytes = bytes;
1060 __entry->max_stack_depth = si->max_stack_depth;
1062 TP_printk("xfino 0x%lx nr %llu objsz %zu stack %u bytes %zu",
1066 __entry->max_stack_depth,
1070 TRACE_EVENT(xfarray_sort_scan,
1071 TP_PROTO(struct xfarray_sortinfo *si, unsigned long long idx),
1074 __field(unsigned long, ino)
1075 __field(unsigned long long, nr)
1076 __field(size_t, obj_size)
1077 __field(unsigned long long, idx)
1078 __field(unsigned long long, folio_pos)
1079 __field(unsigned long, folio_bytes)
1080 __field(unsigned long long, first_idx)
1081 __field(unsigned long long, last_idx)
1084 __entry->nr = si->array->nr;
1085 __entry->obj_size = si->array->obj_size;
1086 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1089 __entry->folio_pos = folio_pos(si->folio);
1090 __entry->folio_bytes = folio_size(si->folio);
1091 __entry->first_idx = si->first_folio_idx;
1092 __entry->last_idx = si->last_folio_idx;
1094 __entry->folio_pos = 0;
1095 __entry->folio_bytes = 0;
1096 __entry->first_idx = 0;
1097 __entry->last_idx = 0;
1100 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",
1106 __entry->folio_bytes,
1111 TRACE_EVENT(xfarray_sort_stats,
1112 TP_PROTO(struct xfarray_sortinfo *si, int error),
1115 __field(unsigned long, ino)
1117 __field(unsigned long long, loads)
1118 __field(unsigned long long, stores)
1119 __field(unsigned long long, compares)
1120 __field(unsigned long long, heapsorts)
1122 __field(unsigned int, max_stack_depth)
1123 __field(unsigned int, max_stack_used)
1127 __entry->ino = file_inode(si->array->xfile->file)->i_ino;
1129 __entry->loads = si->loads;
1130 __entry->stores = si->stores;
1131 __entry->compares = si->compares;
1132 __entry->heapsorts = si->heapsorts;
1134 __entry->max_stack_depth = si->max_stack_depth;
1135 __entry->max_stack_used = si->max_stack_used;
1136 __entry->error = error;
1140 "xfino 0x%lx loads %llu stores %llu compares %llu heapsorts %llu stack_depth %u/%u error %d",
1142 "xfino 0x%lx stack_depth %u/%u error %d",
1151 __entry->max_stack_used,
1152 __entry->max_stack_depth,
1156 #ifdef CONFIG_XFS_RT
1157 TRACE_EVENT(xchk_rtsum_record_free,
1158 TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
1159 xfs_rtbxlen_t len, unsigned int log, loff_t pos,
1160 xfs_suminfo_t value),
1161 TP_ARGS(mp, start, len, log, pos, value),
1164 __field(dev_t, rtdev)
1165 __field(xfs_rtxnum_t, start)
1166 __field(unsigned long long, len)
1167 __field(unsigned int, log)
1168 __field(loff_t, pos)
1169 __field(xfs_suminfo_t, value)
1172 __entry->dev = mp->m_super->s_dev;
1173 __entry->rtdev = mp->m_rtdev_targp->bt_dev;
1174 __entry->start = start;
1178 __entry->value = value;
1180 TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
1181 MAJOR(__entry->dev), MINOR(__entry->dev),
1182 MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
1189 #endif /* CONFIG_XFS_RT */
1191 DECLARE_EVENT_CLASS(xchk_iscan_class,
1192 TP_PROTO(struct xchk_iscan *iscan),
1196 __field(xfs_ino_t, cursor)
1197 __field(xfs_ino_t, visited)
1200 __entry->dev = iscan->sc->mp->m_super->s_dev;
1201 __entry->cursor = iscan->cursor_ino;
1202 __entry->visited = iscan->__visited_ino;
1204 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx",
1205 MAJOR(__entry->dev), MINOR(__entry->dev),
1209 #define DEFINE_ISCAN_EVENT(name) \
1210 DEFINE_EVENT(xchk_iscan_class, name, \
1211 TP_PROTO(struct xchk_iscan *iscan), \
1213 DEFINE_ISCAN_EVENT(xchk_iscan_move_cursor);
1214 DEFINE_ISCAN_EVENT(xchk_iscan_visit);
1215 DEFINE_ISCAN_EVENT(xchk_iscan_skip);
1216 DEFINE_ISCAN_EVENT(xchk_iscan_advance_ag);
1218 DECLARE_EVENT_CLASS(xchk_iscan_ino_class,
1219 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino),
1220 TP_ARGS(iscan, ino),
1223 __field(xfs_ino_t, startino)
1224 __field(xfs_ino_t, cursor)
1225 __field(xfs_ino_t, visited)
1226 __field(xfs_ino_t, ino)
1229 __entry->dev = iscan->sc->mp->m_super->s_dev;
1230 __entry->startino = iscan->scan_start_ino;
1231 __entry->cursor = iscan->cursor_ino;
1232 __entry->visited = iscan->__visited_ino;
1235 TP_printk("dev %d:%d iscan start 0x%llx cursor 0x%llx visited 0x%llx ino 0x%llx",
1236 MAJOR(__entry->dev), MINOR(__entry->dev),
1242 #define DEFINE_ISCAN_INO_EVENT(name) \
1243 DEFINE_EVENT(xchk_iscan_ino_class, name, \
1244 TP_PROTO(struct xchk_iscan *iscan, xfs_ino_t ino), \
1245 TP_ARGS(iscan, ino))
1246 DEFINE_ISCAN_INO_EVENT(xchk_iscan_want_live_update);
1247 DEFINE_ISCAN_INO_EVENT(xchk_iscan_start);
1249 TRACE_EVENT(xchk_iscan_iget,
1250 TP_PROTO(struct xchk_iscan *iscan, int error),
1251 TP_ARGS(iscan, error),
1254 __field(xfs_ino_t, cursor)
1255 __field(xfs_ino_t, visited)
1259 __entry->dev = iscan->sc->mp->m_super->s_dev;
1260 __entry->cursor = iscan->cursor_ino;
1261 __entry->visited = iscan->__visited_ino;
1262 __entry->error = error;
1264 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx error %d",
1265 MAJOR(__entry->dev), MINOR(__entry->dev),
1271 TRACE_EVENT(xchk_iscan_iget_batch,
1272 TP_PROTO(struct xfs_mount *mp, struct xchk_iscan *iscan,
1273 unsigned int nr, unsigned int avail),
1274 TP_ARGS(mp, iscan, nr, avail),
1277 __field(xfs_ino_t, cursor)
1278 __field(xfs_ino_t, visited)
1279 __field(unsigned int, nr)
1280 __field(unsigned int, avail)
1281 __field(unsigned int, unavail)
1282 __field(xfs_ino_t, batch_ino)
1283 __field(unsigned long long, skipmask)
1286 __entry->dev = mp->m_super->s_dev;
1287 __entry->cursor = iscan->cursor_ino;
1288 __entry->visited = iscan->__visited_ino;
1290 __entry->avail = avail;
1291 __entry->unavail = hweight64(iscan->__skipped_inomask);
1292 __entry->batch_ino = iscan->__batch_ino;
1293 __entry->skipmask = iscan->__skipped_inomask;
1295 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx batchino 0x%llx skipmask 0x%llx nr %u avail %u unavail %u",
1296 MAJOR(__entry->dev), MINOR(__entry->dev),
1306 DECLARE_EVENT_CLASS(xchk_iscan_retry_wait_class,
1307 TP_PROTO(struct xchk_iscan *iscan),
1311 __field(xfs_ino_t, cursor)
1312 __field(xfs_ino_t, visited)
1313 __field(unsigned int, retry_delay)
1314 __field(unsigned long, remaining)
1315 __field(unsigned int, iget_timeout)
1318 __entry->dev = iscan->sc->mp->m_super->s_dev;
1319 __entry->cursor = iscan->cursor_ino;
1320 __entry->visited = iscan->__visited_ino;
1321 __entry->retry_delay = iscan->iget_retry_delay;
1322 __entry->remaining = jiffies_to_msecs(iscan->__iget_deadline - jiffies);
1323 __entry->iget_timeout = iscan->iget_timeout;
1325 TP_printk("dev %d:%d iscan cursor 0x%llx visited 0x%llx remaining %lu timeout %u delay %u",
1326 MAJOR(__entry->dev), MINOR(__entry->dev),
1330 __entry->iget_timeout,
1331 __entry->retry_delay)
1333 #define DEFINE_ISCAN_RETRY_WAIT_EVENT(name) \
1334 DEFINE_EVENT(xchk_iscan_retry_wait_class, name, \
1335 TP_PROTO(struct xchk_iscan *iscan), \
1337 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_iget_retry_wait);
1338 DEFINE_ISCAN_RETRY_WAIT_EVENT(xchk_iscan_agi_retry_wait);
1340 TRACE_EVENT(xchk_nlinks_collect_dirent,
1341 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *dp,
1342 xfs_ino_t ino, const struct xfs_name *name),
1343 TP_ARGS(mp, dp, ino, name),
1346 __field(xfs_ino_t, dir)
1347 __field(xfs_ino_t, ino)
1348 __field(unsigned int, namelen)
1349 __dynamic_array(char, name, name->len)
1352 __entry->dev = mp->m_super->s_dev;
1353 __entry->dir = dp->i_ino;
1355 __entry->namelen = name->len;
1356 memcpy(__get_str(name), name->name, name->len);
1358 TP_printk("dev %d:%d dir 0x%llx -> ino 0x%llx name '%.*s'",
1359 MAJOR(__entry->dev), MINOR(__entry->dev),
1366 TRACE_EVENT(xchk_nlinks_collect_metafile,
1367 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino),
1371 __field(xfs_ino_t, ino)
1374 __entry->dev = mp->m_super->s_dev;
1377 TP_printk("dev %d:%d ino 0x%llx",
1378 MAJOR(__entry->dev), MINOR(__entry->dev),
1382 TRACE_EVENT(xchk_nlinks_live_update,
1383 TP_PROTO(struct xfs_mount *mp, const struct xfs_inode *dp,
1384 int action, xfs_ino_t ino, int delta,
1385 const char *name, unsigned int namelen),
1386 TP_ARGS(mp, dp, action, ino, delta, name, namelen),
1389 __field(xfs_ino_t, dir)
1390 __field(int, action)
1391 __field(xfs_ino_t, ino)
1393 __field(unsigned int, namelen)
1394 __dynamic_array(char, name, namelen)
1397 __entry->dev = mp->m_super->s_dev;
1398 __entry->dir = dp ? dp->i_ino : NULLFSINO;
1399 __entry->action = action;
1401 __entry->delta = delta;
1402 __entry->namelen = namelen;
1403 memcpy(__get_str(name), name, namelen);
1405 TP_printk("dev %d:%d dir 0x%llx ino 0x%llx nlink_delta %d name '%.*s'",
1406 MAJOR(__entry->dev), MINOR(__entry->dev),
1414 TRACE_EVENT(xchk_nlinks_check_zero,
1415 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1416 const struct xchk_nlink *live),
1417 TP_ARGS(mp, ino, live),
1420 __field(xfs_ino_t, ino)
1421 __field(xfs_nlink_t, parents)
1422 __field(xfs_nlink_t, backrefs)
1423 __field(xfs_nlink_t, children)
1426 __entry->dev = mp->m_super->s_dev;
1428 __entry->parents = live->parents;
1429 __entry->backrefs = live->backrefs;
1430 __entry->children = live->children;
1432 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
1433 MAJOR(__entry->dev), MINOR(__entry->dev),
1440 TRACE_EVENT(xchk_nlinks_update_incore,
1441 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
1442 const struct xchk_nlink *live, int parents_delta,
1443 int backrefs_delta, int children_delta),
1444 TP_ARGS(mp, ino, live, parents_delta, backrefs_delta, children_delta),
1447 __field(xfs_ino_t, ino)
1448 __field(xfs_nlink_t, parents)
1449 __field(xfs_nlink_t, backrefs)
1450 __field(xfs_nlink_t, children)
1451 __field(int, parents_delta)
1452 __field(int, backrefs_delta)
1453 __field(int, children_delta)
1456 __entry->dev = mp->m_super->s_dev;
1458 __entry->parents = live->parents;
1459 __entry->backrefs = live->backrefs;
1460 __entry->children = live->children;
1461 __entry->parents_delta = parents_delta;
1462 __entry->backrefs_delta = backrefs_delta;
1463 __entry->children_delta = children_delta;
1465 TP_printk("dev %d:%d ino 0x%llx parents %d:%u backrefs %d:%u children %d:%u",
1466 MAJOR(__entry->dev), MINOR(__entry->dev),
1468 __entry->parents_delta,
1470 __entry->backrefs_delta,
1472 __entry->children_delta,
1476 DECLARE_EVENT_CLASS(xchk_nlinks_diff_class,
1477 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip,
1478 const struct xchk_nlink *live),
1479 TP_ARGS(mp, ip, live),
1482 __field(xfs_ino_t, ino)
1483 __field(uint8_t, ftype)
1484 __field(xfs_nlink_t, nlink)
1485 __field(xfs_nlink_t, parents)
1486 __field(xfs_nlink_t, backrefs)
1487 __field(xfs_nlink_t, children)
1490 __entry->dev = mp->m_super->s_dev;
1491 __entry->ino = ip->i_ino;
1492 __entry->ftype = xfs_mode_to_ftype(VFS_I(ip)->i_mode);
1493 __entry->nlink = VFS_I(ip)->i_nlink;
1494 __entry->parents = live->parents;
1495 __entry->backrefs = live->backrefs;
1496 __entry->children = live->children;
1498 TP_printk("dev %d:%d ino 0x%llx ftype %s nlink %u parents %u backrefs %u children %u",
1499 MAJOR(__entry->dev), MINOR(__entry->dev),
1501 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
1507 #define DEFINE_SCRUB_NLINKS_DIFF_EVENT(name) \
1508 DEFINE_EVENT(xchk_nlinks_diff_class, name, \
1509 TP_PROTO(struct xfs_mount *mp, struct xfs_inode *ip, \
1510 const struct xchk_nlink *live), \
1511 TP_ARGS(mp, ip, live))
1512 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xchk_nlinks_compare_inode);
1514 /* repair tracepoints */
1515 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
1517 DECLARE_EVENT_CLASS(xrep_extent_class,
1518 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len),
1519 TP_ARGS(pag, agbno, len),
1522 __field(xfs_agnumber_t, agno)
1523 __field(xfs_agblock_t, agbno)
1524 __field(xfs_extlen_t, len)
1527 __entry->dev = pag->pag_mount->m_super->s_dev;
1528 __entry->agno = pag->pag_agno;
1529 __entry->agbno = agbno;
1532 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1533 MAJOR(__entry->dev), MINOR(__entry->dev),
1538 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
1539 DEFINE_EVENT(xrep_extent_class, name, \
1540 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len), \
1541 TP_ARGS(pag, agbno, len))
1542 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_unmap_extent);
1543 DEFINE_REPAIR_EXTENT_EVENT(xreap_dispose_free_extent);
1544 DEFINE_REPAIR_EXTENT_EVENT(xreap_agextent_binval);
1545 DEFINE_REPAIR_EXTENT_EVENT(xreap_bmapi_binval);
1546 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
1548 DECLARE_EVENT_CLASS(xrep_reap_find_class,
1549 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len,
1551 TP_ARGS(pag, agbno, len, crosslinked),
1554 __field(xfs_agnumber_t, agno)
1555 __field(xfs_agblock_t, agbno)
1556 __field(xfs_extlen_t, len)
1557 __field(bool, crosslinked)
1560 __entry->dev = pag->pag_mount->m_super->s_dev;
1561 __entry->agno = pag->pag_agno;
1562 __entry->agbno = agbno;
1564 __entry->crosslinked = crosslinked;
1566 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x crosslinked %d",
1567 MAJOR(__entry->dev), MINOR(__entry->dev),
1571 __entry->crosslinked ? 1 : 0)
1573 #define DEFINE_REPAIR_REAP_FIND_EVENT(name) \
1574 DEFINE_EVENT(xrep_reap_find_class, name, \
1575 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno, xfs_extlen_t len, \
1576 bool crosslinked), \
1577 TP_ARGS(pag, agbno, len, crosslinked))
1578 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_agextent_select);
1579 DEFINE_REPAIR_REAP_FIND_EVENT(xreap_bmapi_select);
1581 DECLARE_EVENT_CLASS(xrep_rmap_class,
1582 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1583 xfs_agblock_t agbno, xfs_extlen_t len,
1584 uint64_t owner, uint64_t offset, unsigned int flags),
1585 TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
1588 __field(xfs_agnumber_t, agno)
1589 __field(xfs_agblock_t, agbno)
1590 __field(xfs_extlen_t, len)
1591 __field(uint64_t, owner)
1592 __field(uint64_t, offset)
1593 __field(unsigned int, flags)
1596 __entry->dev = mp->m_super->s_dev;
1597 __entry->agno = agno;
1598 __entry->agbno = agbno;
1600 __entry->owner = owner;
1601 __entry->offset = offset;
1602 __entry->flags = flags;
1604 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
1605 MAJOR(__entry->dev), MINOR(__entry->dev),
1613 #define DEFINE_REPAIR_RMAP_EVENT(name) \
1614 DEFINE_EVENT(xrep_rmap_class, name, \
1615 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
1616 xfs_agblock_t agbno, xfs_extlen_t len, \
1617 uint64_t owner, uint64_t offset, unsigned int flags), \
1618 TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
1619 DEFINE_REPAIR_RMAP_EVENT(xrep_ibt_walk_rmap);
1620 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_walk_rmap);
1622 TRACE_EVENT(xrep_abt_found,
1623 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1624 const struct xfs_alloc_rec_incore *rec),
1625 TP_ARGS(mp, agno, rec),
1628 __field(xfs_agnumber_t, agno)
1629 __field(xfs_agblock_t, startblock)
1630 __field(xfs_extlen_t, blockcount)
1633 __entry->dev = mp->m_super->s_dev;
1634 __entry->agno = agno;
1635 __entry->startblock = rec->ar_startblock;
1636 __entry->blockcount = rec->ar_blockcount;
1638 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
1639 MAJOR(__entry->dev), MINOR(__entry->dev),
1641 __entry->startblock,
1642 __entry->blockcount)
1645 TRACE_EVENT(xrep_ibt_found,
1646 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1647 const struct xfs_inobt_rec_incore *rec),
1648 TP_ARGS(mp, agno, rec),
1651 __field(xfs_agnumber_t, agno)
1652 __field(xfs_agino_t, startino)
1653 __field(uint16_t, holemask)
1654 __field(uint8_t, count)
1655 __field(uint8_t, freecount)
1656 __field(uint64_t, freemask)
1659 __entry->dev = mp->m_super->s_dev;
1660 __entry->agno = agno;
1661 __entry->startino = rec->ir_startino;
1662 __entry->holemask = rec->ir_holemask;
1663 __entry->count = rec->ir_count;
1664 __entry->freecount = rec->ir_freecount;
1665 __entry->freemask = rec->ir_free;
1667 TP_printk("dev %d:%d agno 0x%x agino 0x%x holemask 0x%x count 0x%x freecount 0x%x freemask 0x%llx",
1668 MAJOR(__entry->dev), MINOR(__entry->dev),
1677 TRACE_EVENT(xrep_refc_found,
1678 TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *rec),
1682 __field(xfs_agnumber_t, agno)
1683 __field(enum xfs_refc_domain, domain)
1684 __field(xfs_agblock_t, startblock)
1685 __field(xfs_extlen_t, blockcount)
1686 __field(xfs_nlink_t, refcount)
1689 __entry->dev = pag->pag_mount->m_super->s_dev;
1690 __entry->agno = pag->pag_agno;
1691 __entry->domain = rec->rc_domain;
1692 __entry->startblock = rec->rc_startblock;
1693 __entry->blockcount = rec->rc_blockcount;
1694 __entry->refcount = rec->rc_refcount;
1696 TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u",
1697 MAJOR(__entry->dev), MINOR(__entry->dev),
1699 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
1700 __entry->startblock,
1701 __entry->blockcount,
1705 TRACE_EVENT(xrep_bmap_found,
1706 TP_PROTO(struct xfs_inode *ip, int whichfork,
1707 struct xfs_bmbt_irec *irec),
1708 TP_ARGS(ip, whichfork, irec),
1711 __field(xfs_ino_t, ino)
1712 __field(int, whichfork)
1713 __field(xfs_fileoff_t, lblk)
1714 __field(xfs_filblks_t, len)
1715 __field(xfs_fsblock_t, pblk)
1719 __entry->dev = VFS_I(ip)->i_sb->s_dev;
1720 __entry->ino = ip->i_ino;
1721 __entry->whichfork = whichfork;
1722 __entry->lblk = irec->br_startoff;
1723 __entry->len = irec->br_blockcount;
1724 __entry->pblk = irec->br_startblock;
1725 __entry->state = irec->br_state;
1727 TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
1728 MAJOR(__entry->dev), MINOR(__entry->dev),
1730 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
1737 TRACE_EVENT(xrep_rmap_found,
1738 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1739 const struct xfs_rmap_irec *rec),
1740 TP_ARGS(mp, agno, rec),
1743 __field(xfs_agnumber_t, agno)
1744 __field(xfs_agblock_t, agbno)
1745 __field(xfs_extlen_t, len)
1746 __field(uint64_t, owner)
1747 __field(uint64_t, offset)
1748 __field(unsigned int, flags)
1751 __entry->dev = mp->m_super->s_dev;
1752 __entry->agno = agno;
1753 __entry->agbno = rec->rm_startblock;
1754 __entry->len = rec->rm_blockcount;
1755 __entry->owner = rec->rm_owner;
1756 __entry->offset = rec->rm_offset;
1757 __entry->flags = rec->rm_flags;
1759 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
1760 MAJOR(__entry->dev), MINOR(__entry->dev),
1769 TRACE_EVENT(xrep_findroot_block,
1770 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
1771 uint32_t magic, uint16_t level),
1772 TP_ARGS(mp, agno, agbno, magic, level),
1775 __field(xfs_agnumber_t, agno)
1776 __field(xfs_agblock_t, agbno)
1777 __field(uint32_t, magic)
1778 __field(uint16_t, level)
1781 __entry->dev = mp->m_super->s_dev;
1782 __entry->agno = agno;
1783 __entry->agbno = agbno;
1784 __entry->magic = magic;
1785 __entry->level = level;
1787 TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
1788 MAJOR(__entry->dev), MINOR(__entry->dev),
1794 TRACE_EVENT(xrep_calc_ag_resblks,
1795 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1796 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
1797 xfs_agblock_t usedlen),
1798 TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
1801 __field(xfs_agnumber_t, agno)
1802 __field(xfs_agino_t, icount)
1803 __field(xfs_agblock_t, aglen)
1804 __field(xfs_agblock_t, freelen)
1805 __field(xfs_agblock_t, usedlen)
1808 __entry->dev = mp->m_super->s_dev;
1809 __entry->agno = agno;
1810 __entry->icount = icount;
1811 __entry->aglen = aglen;
1812 __entry->freelen = freelen;
1813 __entry->usedlen = usedlen;
1815 TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
1816 MAJOR(__entry->dev), MINOR(__entry->dev),
1823 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
1824 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1825 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
1826 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
1827 TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
1830 __field(xfs_agnumber_t, agno)
1831 __field(xfs_agblock_t, bnobt_sz)
1832 __field(xfs_agblock_t, inobt_sz)
1833 __field(xfs_agblock_t, rmapbt_sz)
1834 __field(xfs_agblock_t, refcbt_sz)
1837 __entry->dev = mp->m_super->s_dev;
1838 __entry->agno = agno;
1839 __entry->bnobt_sz = bnobt_sz;
1840 __entry->inobt_sz = inobt_sz;
1841 __entry->rmapbt_sz = rmapbt_sz;
1842 __entry->refcbt_sz = refcbt_sz;
1844 TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
1845 MAJOR(__entry->dev), MINOR(__entry->dev),
1852 TRACE_EVENT(xrep_reset_counters,
1853 TP_PROTO(struct xfs_mount *mp, struct xchk_fscounters *fsc),
1857 __field(uint64_t, icount)
1858 __field(uint64_t, ifree)
1859 __field(uint64_t, fdblocks)
1860 __field(uint64_t, frextents)
1863 __entry->dev = mp->m_super->s_dev;
1864 __entry->icount = fsc->icount;
1865 __entry->ifree = fsc->ifree;
1866 __entry->fdblocks = fsc->fdblocks;
1867 __entry->frextents = fsc->frextents;
1869 TP_printk("dev %d:%d icount %llu ifree %llu fdblocks %llu frextents %llu",
1870 MAJOR(__entry->dev), MINOR(__entry->dev),
1877 DECLARE_EVENT_CLASS(xrep_newbt_extent_class,
1878 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
1879 xfs_agblock_t agbno, xfs_extlen_t len,
1881 TP_ARGS(mp, agno, agbno, len, owner),
1884 __field(xfs_agnumber_t, agno)
1885 __field(xfs_agblock_t, agbno)
1886 __field(xfs_extlen_t, len)
1887 __field(int64_t, owner)
1890 __entry->dev = mp->m_super->s_dev;
1891 __entry->agno = agno;
1892 __entry->agbno = agbno;
1894 __entry->owner = owner;
1896 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx",
1897 MAJOR(__entry->dev), MINOR(__entry->dev),
1903 #define DEFINE_NEWBT_EXTENT_EVENT(name) \
1904 DEFINE_EVENT(xrep_newbt_extent_class, name, \
1905 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
1906 xfs_agblock_t agbno, xfs_extlen_t len, \
1908 TP_ARGS(mp, agno, agbno, len, owner))
1909 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_ag_blocks);
1910 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_alloc_file_blocks);
1911 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_free_blocks);
1912 DEFINE_NEWBT_EXTENT_EVENT(xrep_newbt_claim_block);
1914 DECLARE_EVENT_CLASS(xrep_dinode_class,
1915 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip),
1919 __field(xfs_ino_t, ino)
1920 __field(uint16_t, mode)
1921 __field(uint8_t, version)
1922 __field(uint8_t, format)
1923 __field(uint32_t, uid)
1924 __field(uint32_t, gid)
1925 __field(uint64_t, size)
1926 __field(uint64_t, nblocks)
1927 __field(uint32_t, extsize)
1928 __field(uint32_t, nextents)
1929 __field(uint16_t, anextents)
1930 __field(uint8_t, forkoff)
1931 __field(uint8_t, aformat)
1932 __field(uint16_t, flags)
1933 __field(uint32_t, gen)
1934 __field(uint64_t, flags2)
1935 __field(uint32_t, cowextsize)
1938 __entry->dev = sc->mp->m_super->s_dev;
1939 __entry->ino = sc->sm->sm_ino;
1940 __entry->mode = be16_to_cpu(dip->di_mode);
1941 __entry->version = dip->di_version;
1942 __entry->format = dip->di_format;
1943 __entry->uid = be32_to_cpu(dip->di_uid);
1944 __entry->gid = be32_to_cpu(dip->di_gid);
1945 __entry->size = be64_to_cpu(dip->di_size);
1946 __entry->nblocks = be64_to_cpu(dip->di_nblocks);
1947 __entry->extsize = be32_to_cpu(dip->di_extsize);
1948 __entry->nextents = be32_to_cpu(dip->di_nextents);
1949 __entry->anextents = be16_to_cpu(dip->di_anextents);
1950 __entry->forkoff = dip->di_forkoff;
1951 __entry->aformat = dip->di_aformat;
1952 __entry->flags = be16_to_cpu(dip->di_flags);
1953 __entry->gen = be32_to_cpu(dip->di_gen);
1954 __entry->flags2 = be64_to_cpu(dip->di_flags2);
1955 __entry->cowextsize = be32_to_cpu(dip->di_cowextsize);
1957 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",
1958 MAJOR(__entry->dev), MINOR(__entry->dev),
1975 __entry->cowextsize)
1978 #define DEFINE_REPAIR_DINODE_EVENT(name) \
1979 DEFINE_EVENT(xrep_dinode_class, name, \
1980 TP_PROTO(struct xfs_scrub *sc, struct xfs_dinode *dip), \
1982 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_header);
1983 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_mode);
1984 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_flags);
1985 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_size);
1986 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_extsize_hints);
1987 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_symlink);
1988 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dir);
1989 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_fixed);
1990 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_forks);
1991 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_dfork);
1992 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_zap_afork);
1993 DEFINE_REPAIR_DINODE_EVENT(xrep_dinode_ensure_forkoff);
1995 DECLARE_EVENT_CLASS(xrep_inode_class,
1996 TP_PROTO(struct xfs_scrub *sc),
2000 __field(xfs_ino_t, ino)
2001 __field(xfs_fsize_t, size)
2002 __field(xfs_rfsblock_t, nblocks)
2003 __field(uint16_t, flags)
2004 __field(uint64_t, flags2)
2005 __field(uint32_t, nextents)
2006 __field(uint8_t, format)
2007 __field(uint32_t, anextents)
2008 __field(uint8_t, aformat)
2011 __entry->dev = sc->mp->m_super->s_dev;
2012 __entry->ino = sc->sm->sm_ino;
2013 __entry->size = sc->ip->i_disk_size;
2014 __entry->nblocks = sc->ip->i_nblocks;
2015 __entry->flags = sc->ip->i_diflags;
2016 __entry->flags2 = sc->ip->i_diflags2;
2017 __entry->nextents = sc->ip->i_df.if_nextents;
2018 __entry->format = sc->ip->i_df.if_format;
2019 __entry->anextents = sc->ip->i_af.if_nextents;
2020 __entry->aformat = sc->ip->i_af.if_format;
2022 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",
2023 MAJOR(__entry->dev), MINOR(__entry->dev),
2035 #define DEFINE_REPAIR_INODE_EVENT(name) \
2036 DEFINE_EVENT(xrep_inode_class, name, \
2037 TP_PROTO(struct xfs_scrub *sc), \
2039 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockcounts);
2040 DEFINE_REPAIR_INODE_EVENT(xrep_inode_ids);
2041 DEFINE_REPAIR_INODE_EVENT(xrep_inode_flags);
2042 DEFINE_REPAIR_INODE_EVENT(xrep_inode_blockdir_size);
2043 DEFINE_REPAIR_INODE_EVENT(xrep_inode_sfdir_size);
2044 DEFINE_REPAIR_INODE_EVENT(xrep_inode_dir_size);
2045 DEFINE_REPAIR_INODE_EVENT(xrep_inode_fixed);
2047 TRACE_EVENT(xrep_dinode_count_rmaps,
2048 TP_PROTO(struct xfs_scrub *sc, xfs_rfsblock_t data_blocks,
2049 xfs_rfsblock_t rt_blocks, xfs_rfsblock_t attr_blocks,
2050 xfs_extnum_t data_extents, xfs_extnum_t rt_extents,
2051 xfs_aextnum_t attr_extents),
2052 TP_ARGS(sc, data_blocks, rt_blocks, attr_blocks, data_extents,
2053 rt_extents, attr_extents),
2056 __field(xfs_ino_t, ino)
2057 __field(xfs_rfsblock_t, data_blocks)
2058 __field(xfs_rfsblock_t, rt_blocks)
2059 __field(xfs_rfsblock_t, attr_blocks)
2060 __field(xfs_extnum_t, data_extents)
2061 __field(xfs_extnum_t, rt_extents)
2062 __field(xfs_aextnum_t, attr_extents)
2065 __entry->dev = sc->mp->m_super->s_dev;
2066 __entry->ino = sc->sm->sm_ino;
2067 __entry->data_blocks = data_blocks;
2068 __entry->rt_blocks = rt_blocks;
2069 __entry->attr_blocks = attr_blocks;
2070 __entry->data_extents = data_extents;
2071 __entry->rt_extents = rt_extents;
2072 __entry->attr_extents = attr_extents;
2074 TP_printk("dev %d:%d ino 0x%llx dblocks 0x%llx rtblocks 0x%llx ablocks 0x%llx dextents %llu rtextents %llu aextents %u",
2075 MAJOR(__entry->dev), MINOR(__entry->dev),
2077 __entry->data_blocks,
2079 __entry->attr_blocks,
2080 __entry->data_extents,
2081 __entry->rt_extents,
2082 __entry->attr_extents)
2085 TRACE_EVENT(xrep_dinode_findmode_dirent,
2086 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2087 unsigned int ftype),
2088 TP_ARGS(sc, dp, ftype),
2091 __field(xfs_ino_t, ino)
2092 __field(xfs_ino_t, parent_ino)
2093 __field(unsigned int, ftype)
2096 __entry->dev = sc->mp->m_super->s_dev;
2097 __entry->ino = sc->sm->sm_ino;
2098 __entry->parent_ino = dp->i_ino;
2099 __entry->ftype = ftype;
2101 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s'",
2102 MAJOR(__entry->dev), MINOR(__entry->dev),
2104 __entry->parent_ino,
2105 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR))
2108 TRACE_EVENT(xrep_dinode_findmode_dirent_inval,
2109 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *dp,
2110 unsigned int ftype, unsigned int found_ftype),
2111 TP_ARGS(sc, dp, ftype, found_ftype),
2114 __field(xfs_ino_t, ino)
2115 __field(xfs_ino_t, parent_ino)
2116 __field(unsigned int, ftype)
2117 __field(unsigned int, found_ftype)
2120 __entry->dev = sc->mp->m_super->s_dev;
2121 __entry->ino = sc->sm->sm_ino;
2122 __entry->parent_ino = dp->i_ino;
2123 __entry->ftype = ftype;
2124 __entry->found_ftype = found_ftype;
2126 TP_printk("dev %d:%d ino 0x%llx parent_ino 0x%llx ftype '%s' found_ftype '%s'",
2127 MAJOR(__entry->dev), MINOR(__entry->dev),
2129 __entry->parent_ino,
2130 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
2131 __print_symbolic(__entry->found_ftype, XFS_DIR3_FTYPE_STR))
2134 TRACE_EVENT(xrep_cow_mark_file_range,
2135 TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t startblock,
2136 xfs_fileoff_t startoff, xfs_filblks_t blockcount),
2137 TP_ARGS(ip, startblock, startoff, blockcount),
2140 __field(xfs_ino_t, ino)
2141 __field(xfs_fsblock_t, startblock)
2142 __field(xfs_fileoff_t, startoff)
2143 __field(xfs_filblks_t, blockcount)
2146 __entry->dev = ip->i_mount->m_super->s_dev;
2147 __entry->ino = ip->i_ino;
2148 __entry->startoff = startoff;
2149 __entry->startblock = startblock;
2150 __entry->blockcount = blockcount;
2152 TP_printk("dev %d:%d ino 0x%llx fileoff 0x%llx startblock 0x%llx fsbcount 0x%llx",
2153 MAJOR(__entry->dev), MINOR(__entry->dev),
2156 __entry->startblock,
2157 __entry->blockcount)
2160 TRACE_EVENT(xrep_cow_replace_mapping,
2161 TP_PROTO(struct xfs_inode *ip, const struct xfs_bmbt_irec *irec,
2162 xfs_fsblock_t new_startblock, xfs_extlen_t new_blockcount),
2163 TP_ARGS(ip, irec, new_startblock, new_blockcount),
2166 __field(xfs_ino_t, ino)
2167 __field(xfs_fsblock_t, startblock)
2168 __field(xfs_fileoff_t, startoff)
2169 __field(xfs_filblks_t, blockcount)
2170 __field(xfs_exntst_t, state)
2171 __field(xfs_fsblock_t, new_startblock)
2172 __field(xfs_extlen_t, new_blockcount)
2175 __entry->dev = ip->i_mount->m_super->s_dev;
2176 __entry->ino = ip->i_ino;
2177 __entry->startoff = irec->br_startoff;
2178 __entry->startblock = irec->br_startblock;
2179 __entry->blockcount = irec->br_blockcount;
2180 __entry->state = irec->br_state;
2181 __entry->new_startblock = new_startblock;
2182 __entry->new_blockcount = new_blockcount;
2184 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",
2185 MAJOR(__entry->dev), MINOR(__entry->dev),
2188 __entry->startblock,
2189 __entry->blockcount,
2191 __entry->new_startblock,
2192 __entry->new_blockcount)
2195 TRACE_EVENT(xrep_cow_free_staging,
2196 TP_PROTO(struct xfs_perag *pag, xfs_agblock_t agbno,
2197 xfs_extlen_t blockcount),
2198 TP_ARGS(pag, agbno, blockcount),
2201 __field(xfs_agnumber_t, agno)
2202 __field(xfs_agblock_t, agbno)
2203 __field(xfs_extlen_t, blockcount)
2206 __entry->dev = pag->pag_mount->m_super->s_dev;
2207 __entry->agno = pag->pag_agno;
2208 __entry->agbno = agbno;
2209 __entry->blockcount = blockcount;
2211 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
2212 MAJOR(__entry->dev), MINOR(__entry->dev),
2215 __entry->blockcount)
2218 #ifdef CONFIG_XFS_QUOTA
2219 DECLARE_EVENT_CLASS(xrep_dquot_class,
2220 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id),
2221 TP_ARGS(mp, type, id),
2224 __field(uint8_t, type)
2225 __field(uint32_t, id)
2228 __entry->dev = mp->m_super->s_dev;
2230 __entry->type = type;
2232 TP_printk("dev %d:%d type %s id 0x%x",
2233 MAJOR(__entry->dev), MINOR(__entry->dev),
2234 __print_flags(__entry->type, "|", XFS_DQTYPE_STRINGS),
2238 #define DEFINE_XREP_DQUOT_EVENT(name) \
2239 DEFINE_EVENT(xrep_dquot_class, name, \
2240 TP_PROTO(struct xfs_mount *mp, uint8_t type, uint32_t id), \
2241 TP_ARGS(mp, type, id))
2242 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item);
2243 DEFINE_XREP_DQUOT_EVENT(xrep_disk_dquot);
2244 DEFINE_XREP_DQUOT_EVENT(xrep_dquot_item_fill_bmap_hole);
2245 DEFINE_XREP_DQUOT_EVENT(xrep_quotacheck_dquot);
2246 #endif /* CONFIG_XFS_QUOTA */
2248 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_update_inode);
2249 DEFINE_SCRUB_NLINKS_DIFF_EVENT(xrep_nlinks_unfixable_inode);
2251 TRACE_EVENT(xrep_rmap_live_update,
2252 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, unsigned int op,
2253 const struct xfs_rmap_update_params *p),
2254 TP_ARGS(mp, agno, op, p),
2257 __field(xfs_agnumber_t, agno)
2258 __field(unsigned int, op)
2259 __field(xfs_agblock_t, agbno)
2260 __field(xfs_extlen_t, len)
2261 __field(uint64_t, owner)
2262 __field(uint64_t, offset)
2263 __field(unsigned int, flags)
2266 __entry->dev = mp->m_super->s_dev;
2267 __entry->agno = agno;
2269 __entry->agbno = p->startblock;
2270 __entry->len = p->blockcount;
2271 xfs_owner_info_unpack(&p->oinfo, &__entry->owner,
2272 &__entry->offset, &__entry->flags);
2274 __entry->flags |= XFS_RMAP_UNWRITTEN;
2276 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",
2277 MAJOR(__entry->dev), MINOR(__entry->dev),
2287 TRACE_EVENT(xrep_tempfile_create,
2288 TP_PROTO(struct xfs_scrub *sc),
2292 __field(xfs_ino_t, ino)
2293 __field(unsigned int, type)
2294 __field(xfs_agnumber_t, agno)
2295 __field(xfs_ino_t, inum)
2296 __field(unsigned int, gen)
2297 __field(unsigned int, flags)
2298 __field(xfs_ino_t, temp_inum)
2301 __entry->dev = sc->mp->m_super->s_dev;
2302 __entry->ino = sc->file ? XFS_I(file_inode(sc->file))->i_ino : 0;
2303 __entry->type = sc->sm->sm_type;
2304 __entry->agno = sc->sm->sm_agno;
2305 __entry->inum = sc->sm->sm_ino;
2306 __entry->gen = sc->sm->sm_gen;
2307 __entry->flags = sc->sm->sm_flags;
2308 __entry->temp_inum = sc->tempip->i_ino;
2310 TP_printk("dev %d:%d ino 0x%llx type %s inum 0x%llx gen 0x%x flags 0x%x temp_inum 0x%llx",
2311 MAJOR(__entry->dev), MINOR(__entry->dev),
2313 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
2320 DECLARE_EVENT_CLASS(xrep_tempfile_class,
2321 TP_PROTO(struct xfs_scrub *sc, int whichfork,
2322 struct xfs_bmbt_irec *irec),
2323 TP_ARGS(sc, whichfork, irec),
2326 __field(xfs_ino_t, ino)
2327 __field(int, whichfork)
2328 __field(xfs_fileoff_t, lblk)
2329 __field(xfs_filblks_t, len)
2330 __field(xfs_fsblock_t, pblk)
2334 __entry->dev = sc->mp->m_super->s_dev;
2335 __entry->ino = sc->tempip->i_ino;
2336 __entry->whichfork = whichfork;
2337 __entry->lblk = irec->br_startoff;
2338 __entry->len = irec->br_blockcount;
2339 __entry->pblk = irec->br_startblock;
2340 __entry->state = irec->br_state;
2342 TP_printk("dev %d:%d ino 0x%llx whichfork %s fileoff 0x%llx fsbcount 0x%llx startblock 0x%llx state %d",
2343 MAJOR(__entry->dev), MINOR(__entry->dev),
2345 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2351 #define DEFINE_XREP_TEMPFILE_EVENT(name) \
2352 DEFINE_EVENT(xrep_tempfile_class, name, \
2353 TP_PROTO(struct xfs_scrub *sc, int whichfork, \
2354 struct xfs_bmbt_irec *irec), \
2355 TP_ARGS(sc, whichfork, irec))
2356 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_prealloc);
2357 DEFINE_XREP_TEMPFILE_EVENT(xrep_tempfile_copyin);
2359 TRACE_EVENT(xreap_ifork_extent,
2360 TP_PROTO(struct xfs_scrub *sc, struct xfs_inode *ip, int whichfork,
2361 const struct xfs_bmbt_irec *irec),
2362 TP_ARGS(sc, ip, whichfork, irec),
2365 __field(xfs_ino_t, ino)
2366 __field(int, whichfork)
2367 __field(xfs_fileoff_t, fileoff)
2368 __field(xfs_filblks_t, len)
2369 __field(xfs_agnumber_t, agno)
2370 __field(xfs_agblock_t, agbno)
2374 __entry->dev = sc->mp->m_super->s_dev;
2375 __entry->ino = ip->i_ino;
2376 __entry->whichfork = whichfork;
2377 __entry->fileoff = irec->br_startoff;
2378 __entry->len = irec->br_blockcount;
2379 __entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2380 __entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2381 __entry->state = irec->br_state;
2383 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",
2384 MAJOR(__entry->dev), MINOR(__entry->dev),
2386 __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
2394 TRACE_EVENT(xreap_bmapi_binval_scan,
2395 TP_PROTO(struct xfs_scrub *sc, const struct xfs_bmbt_irec *irec,
2396 xfs_extlen_t scan_blocks),
2397 TP_ARGS(sc, irec, scan_blocks),
2400 __field(xfs_filblks_t, len)
2401 __field(xfs_agnumber_t, agno)
2402 __field(xfs_agblock_t, agbno)
2403 __field(xfs_extlen_t, scan_blocks)
2406 __entry->dev = sc->mp->m_super->s_dev;
2407 __entry->len = irec->br_blockcount;
2408 __entry->agno = XFS_FSB_TO_AGNO(sc->mp, irec->br_startblock);
2409 __entry->agbno = XFS_FSB_TO_AGBNO(sc->mp, irec->br_startblock);
2410 __entry->scan_blocks = scan_blocks;
2412 TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%llx scan_blocks 0x%x",
2413 MAJOR(__entry->dev), MINOR(__entry->dev),
2417 __entry->scan_blocks)
2420 TRACE_EVENT(xrep_xattr_recover_leafblock,
2421 TP_PROTO(struct xfs_inode *ip, xfs_dablk_t dabno, uint16_t magic),
2422 TP_ARGS(ip, dabno, magic),
2425 __field(xfs_ino_t, ino)
2426 __field(xfs_dablk_t, dabno)
2427 __field(uint16_t, magic)
2430 __entry->dev = ip->i_mount->m_super->s_dev;
2431 __entry->ino = ip->i_ino;
2432 __entry->dabno = dabno;
2433 __entry->magic = magic;
2435 TP_printk("dev %d:%d ino 0x%llx dablk 0x%x magic 0x%x",
2436 MAJOR(__entry->dev), MINOR(__entry->dev),
2442 DECLARE_EVENT_CLASS(xrep_xattr_salvage_class,
2443 TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name,
2444 unsigned int namelen, unsigned int valuelen),
2445 TP_ARGS(ip, flags, name, namelen, valuelen),
2448 __field(xfs_ino_t, ino)
2449 __field(unsigned int, flags)
2450 __field(unsigned int, namelen)
2451 __dynamic_array(char, name, namelen)
2452 __field(unsigned int, valuelen)
2455 __entry->dev = ip->i_mount->m_super->s_dev;
2456 __entry->ino = ip->i_ino;
2457 __entry->flags = flags;
2458 __entry->namelen = namelen;
2459 memcpy(__get_str(name), name, namelen);
2460 __entry->valuelen = valuelen;
2462 TP_printk("dev %d:%d ino 0x%llx flags %s name '%.*s' valuelen 0x%x",
2463 MAJOR(__entry->dev), MINOR(__entry->dev),
2465 __print_flags(__entry->flags, "|", XFS_ATTR_NAMESPACE_STR),
2470 #define DEFINE_XREP_XATTR_SALVAGE_EVENT(name) \
2471 DEFINE_EVENT(xrep_xattr_salvage_class, name, \
2472 TP_PROTO(struct xfs_inode *ip, unsigned int flags, char *name, \
2473 unsigned int namelen, unsigned int valuelen), \
2474 TP_ARGS(ip, flags, name, namelen, valuelen))
2475 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec);
2476 DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec);
2478 TRACE_EVENT(xrep_xattr_class,
2479 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip),
2480 TP_ARGS(ip, arg_ip),
2483 __field(xfs_ino_t, ino)
2484 __field(xfs_ino_t, src_ino)
2487 __entry->dev = ip->i_mount->m_super->s_dev;
2488 __entry->ino = ip->i_ino;
2489 __entry->src_ino = arg_ip->i_ino;
2491 TP_printk("dev %d:%d ino 0x%llx src 0x%llx",
2492 MAJOR(__entry->dev), MINOR(__entry->dev),
2496 #define DEFINE_XREP_XATTR_EVENT(name) \
2497 DEFINE_EVENT(xrep_xattr_class, name, \
2498 TP_PROTO(struct xfs_inode *ip, struct xfs_inode *arg_ip), \
2499 TP_ARGS(ip, arg_ip))
2500 DEFINE_XREP_XATTR_EVENT(xrep_xattr_rebuild_tree);
2501 DEFINE_XREP_XATTR_EVENT(xrep_xattr_reset_fork);
2503 TRACE_EVENT(xrep_dir_recover_dirblock,
2504 TP_PROTO(struct xfs_inode *dp, xfs_dablk_t dabno, uint32_t magic,
2505 uint32_t magic_guess),
2506 TP_ARGS(dp, dabno, magic, magic_guess),
2509 __field(xfs_ino_t, dir_ino)
2510 __field(xfs_dablk_t, dabno)
2511 __field(uint32_t, magic)
2512 __field(uint32_t, magic_guess)
2515 __entry->dev = dp->i_mount->m_super->s_dev;
2516 __entry->dir_ino = dp->i_ino;
2517 __entry->dabno = dabno;
2518 __entry->magic = magic;
2519 __entry->magic_guess = magic_guess;
2521 TP_printk("dev %d:%d dir 0x%llx dablk 0x%x magic 0x%x magic_guess 0x%x",
2522 MAJOR(__entry->dev), MINOR(__entry->dev),
2526 __entry->magic_guess)
2529 DECLARE_EVENT_CLASS(xrep_dir_class,
2530 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino),
2531 TP_ARGS(dp, parent_ino),
2534 __field(xfs_ino_t, dir_ino)
2535 __field(xfs_ino_t, parent_ino)
2538 __entry->dev = dp->i_mount->m_super->s_dev;
2539 __entry->dir_ino = dp->i_ino;
2540 __entry->parent_ino = parent_ino;
2542 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
2543 MAJOR(__entry->dev), MINOR(__entry->dev),
2545 __entry->parent_ino)
2547 #define DEFINE_XREP_DIR_EVENT(name) \
2548 DEFINE_EVENT(xrep_dir_class, name, \
2549 TP_PROTO(struct xfs_inode *dp, xfs_ino_t parent_ino), \
2550 TP_ARGS(dp, parent_ino))
2551 DEFINE_XREP_DIR_EVENT(xrep_dir_rebuild_tree);
2552 DEFINE_XREP_DIR_EVENT(xrep_dir_reset_fork);
2553 DEFINE_XREP_DIR_EVENT(xrep_parent_reset_dotdot);
2555 DECLARE_EVENT_CLASS(xrep_dirent_class,
2556 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name,
2558 TP_ARGS(dp, name, ino),
2561 __field(xfs_ino_t, dir_ino)
2562 __field(unsigned int, namelen)
2563 __dynamic_array(char, name, name->len)
2564 __field(xfs_ino_t, ino)
2565 __field(uint8_t, ftype)
2568 __entry->dev = dp->i_mount->m_super->s_dev;
2569 __entry->dir_ino = dp->i_ino;
2570 __entry->namelen = name->len;
2571 memcpy(__get_str(name), name->name, name->len);
2573 __entry->ftype = name->type;
2575 TP_printk("dev %d:%d dir 0x%llx ftype %s name '%.*s' ino 0x%llx",
2576 MAJOR(__entry->dev), MINOR(__entry->dev),
2578 __print_symbolic(__entry->ftype, XFS_DIR3_FTYPE_STR),
2583 #define DEFINE_XREP_DIRENT_EVENT(name) \
2584 DEFINE_EVENT(xrep_dirent_class, name, \
2585 TP_PROTO(struct xfs_inode *dp, const struct xfs_name *name, \
2587 TP_ARGS(dp, name, ino))
2588 DEFINE_XREP_DIRENT_EVENT(xrep_dir_salvage_entry);
2589 DEFINE_XREP_DIRENT_EVENT(xrep_dir_stash_createname);
2590 DEFINE_XREP_DIRENT_EVENT(xrep_dir_replay_createname);
2591 DEFINE_XREP_DIRENT_EVENT(xrep_adoption_reparent);
2593 DECLARE_EVENT_CLASS(xrep_adoption_class,
2594 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved),
2595 TP_ARGS(dp, ip, moved),
2598 __field(xfs_ino_t, dir_ino)
2599 __field(xfs_ino_t, child_ino)
2600 __field(bool, moved)
2603 __entry->dev = dp->i_mount->m_super->s_dev;
2604 __entry->dir_ino = dp->i_ino;
2605 __entry->child_ino = ip->i_ino;
2606 __entry->moved = moved;
2608 TP_printk("dev %d:%d dir 0x%llx child 0x%llx moved? %d",
2609 MAJOR(__entry->dev), MINOR(__entry->dev),
2614 #define DEFINE_XREP_ADOPTION_EVENT(name) \
2615 DEFINE_EVENT(xrep_adoption_class, name, \
2616 TP_PROTO(struct xfs_inode *dp, struct xfs_inode *ip, bool moved), \
2617 TP_ARGS(dp, ip, moved))
2618 DEFINE_XREP_ADOPTION_EVENT(xrep_adoption_trans_roll);
2620 DECLARE_EVENT_CLASS(xrep_parent_salvage_class,
2621 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino),
2625 __field(xfs_ino_t, dir_ino)
2626 __field(xfs_ino_t, ino)
2629 __entry->dev = dp->i_mount->m_super->s_dev;
2630 __entry->dir_ino = dp->i_ino;
2633 TP_printk("dev %d:%d dir 0x%llx parent 0x%llx",
2634 MAJOR(__entry->dev), MINOR(__entry->dev),
2638 #define DEFINE_XREP_PARENT_SALVAGE_EVENT(name) \
2639 DEFINE_EVENT(xrep_parent_salvage_class, name, \
2640 TP_PROTO(struct xfs_inode *dp, xfs_ino_t ino), \
2642 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_dir_salvaged_parent);
2643 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_dirent);
2644 DEFINE_XREP_PARENT_SALVAGE_EVENT(xrep_findparent_from_dcache);
2646 TRACE_EVENT(xrep_nlinks_set_record,
2647 TP_PROTO(struct xfs_mount *mp, xfs_ino_t ino,
2648 const struct xchk_nlink *obs),
2649 TP_ARGS(mp, ino, obs),
2652 __field(xfs_ino_t, ino)
2653 __field(xfs_nlink_t, parents)
2654 __field(xfs_nlink_t, backrefs)
2655 __field(xfs_nlink_t, children)
2658 __entry->dev = mp->m_super->s_dev;
2660 __entry->parents = obs->parents;
2661 __entry->backrefs = obs->backrefs;
2662 __entry->children = obs->children;
2664 TP_printk("dev %d:%d ino 0x%llx parents %u backrefs %u children %u",
2665 MAJOR(__entry->dev), MINOR(__entry->dev),
2672 DECLARE_EVENT_CLASS(xrep_dentry_class,
2673 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry),
2674 TP_ARGS(mp, dentry),
2677 __field(unsigned int, flags)
2678 __field(unsigned long, ino)
2679 __field(bool, positive)
2680 __field(unsigned long, parent_ino)
2681 __field(unsigned int, namelen)
2682 __dynamic_array(char, name, dentry->d_name.len)
2685 __entry->dev = mp->m_super->s_dev;
2686 __entry->flags = dentry->d_flags;
2687 __entry->positive = d_is_positive(dentry);
2688 if (dentry->d_parent && d_inode(dentry->d_parent))
2689 __entry->parent_ino = d_inode(dentry->d_parent)->i_ino;
2691 __entry->parent_ino = -1UL;
2692 __entry->ino = d_inode(dentry) ? d_inode(dentry)->i_ino : 0;
2693 __entry->namelen = dentry->d_name.len;
2694 memcpy(__get_str(name), dentry->d_name.name, dentry->d_name.len);
2696 TP_printk("dev %d:%d flags 0x%x positive? %d parent_ino 0x%lx ino 0x%lx name '%.*s'",
2697 MAJOR(__entry->dev), MINOR(__entry->dev),
2700 __entry->parent_ino,
2705 #define DEFINE_REPAIR_DENTRY_EVENT(name) \
2706 DEFINE_EVENT(xrep_dentry_class, name, \
2707 TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry), \
2708 TP_ARGS(mp, dentry))
2709 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_child);
2710 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_alias);
2711 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_dentry);
2712 DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_invalidate_child);
2714 TRACE_EVENT(xrep_symlink_salvage_target,
2715 TP_PROTO(struct xfs_inode *ip, char *target, unsigned int targetlen),
2716 TP_ARGS(ip, target, targetlen),
2719 __field(xfs_ino_t, ino)
2720 __field(unsigned int, targetlen)
2721 __dynamic_array(char, target, targetlen + 1)
2724 __entry->dev = ip->i_mount->m_super->s_dev;
2725 __entry->ino = ip->i_ino;
2726 __entry->targetlen = targetlen;
2727 memcpy(__get_str(target), target, targetlen);
2728 __get_str(target)[targetlen] = 0;
2730 TP_printk("dev %d:%d ip 0x%llx target '%.*s'",
2731 MAJOR(__entry->dev), MINOR(__entry->dev),
2737 DECLARE_EVENT_CLASS(xrep_symlink_class,
2738 TP_PROTO(struct xfs_inode *ip),
2742 __field(xfs_ino_t, ino)
2745 __entry->dev = ip->i_mount->m_super->s_dev;
2746 __entry->ino = ip->i_ino;
2748 TP_printk("dev %d:%d ip 0x%llx",
2749 MAJOR(__entry->dev), MINOR(__entry->dev),
2753 #define DEFINE_XREP_SYMLINK_EVENT(name) \
2754 DEFINE_EVENT(xrep_symlink_class, name, \
2755 TP_PROTO(struct xfs_inode *ip), \
2757 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_rebuild);
2758 DEFINE_XREP_SYMLINK_EVENT(xrep_symlink_reset_fork);
2760 TRACE_EVENT(xrep_iunlink_visit,
2761 TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
2762 xfs_agino_t bucket_agino, struct xfs_inode *ip),
2763 TP_ARGS(pag, bucket, bucket_agino, ip),
2766 __field(xfs_agnumber_t, agno)
2767 __field(xfs_agino_t, agino)
2768 __field(unsigned int, bucket)
2769 __field(xfs_agino_t, bucket_agino)
2770 __field(xfs_agino_t, prev_agino)
2771 __field(xfs_agino_t, next_agino)
2774 __entry->dev = pag->pag_mount->m_super->s_dev;
2775 __entry->agno = pag->pag_agno;
2776 __entry->agino = XFS_INO_TO_AGINO(pag->pag_mount, ip->i_ino);
2777 __entry->bucket = bucket;
2778 __entry->bucket_agino = bucket_agino;
2779 __entry->prev_agino = ip->i_prev_unlinked;
2780 __entry->next_agino = ip->i_next_unlinked;
2782 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",
2783 MAJOR(__entry->dev), MINOR(__entry->dev),
2787 __entry->bucket_agino,
2788 __entry->prev_agino,
2789 __entry->next_agino)
2792 TRACE_EVENT(xrep_iunlink_reload_next,
2793 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
2794 TP_ARGS(ip, prev_agino),
2797 __field(xfs_agnumber_t, agno)
2798 __field(xfs_agino_t, agino)
2799 __field(xfs_agino_t, old_prev_agino)
2800 __field(xfs_agino_t, prev_agino)
2801 __field(xfs_agino_t, next_agino)
2802 __field(unsigned int, nlink)
2805 __entry->dev = ip->i_mount->m_super->s_dev;
2806 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
2807 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
2808 __entry->old_prev_agino = ip->i_prev_unlinked;
2809 __entry->prev_agino = prev_agino;
2810 __entry->next_agino = ip->i_next_unlinked;
2811 __entry->nlink = VFS_I(ip)->i_nlink;
2813 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",
2814 MAJOR(__entry->dev), MINOR(__entry->dev),
2816 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
2819 __entry->old_prev_agino,
2820 __entry->prev_agino,
2821 __entry->next_agino)
2824 TRACE_EVENT(xrep_iunlink_reload_ondisk,
2825 TP_PROTO(struct xfs_inode *ip),
2829 __field(xfs_agnumber_t, agno)
2830 __field(xfs_agino_t, agino)
2831 __field(unsigned int, nlink)
2832 __field(xfs_agino_t, next_agino)
2835 __entry->dev = ip->i_mount->m_super->s_dev;
2836 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
2837 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
2838 __entry->nlink = VFS_I(ip)->i_nlink;
2839 __entry->next_agino = ip->i_next_unlinked;
2841 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x nlink %u next_agino 0x%x",
2842 MAJOR(__entry->dev), MINOR(__entry->dev),
2844 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
2847 __entry->next_agino)
2850 TRACE_EVENT(xrep_iunlink_walk_ondisk_bucket,
2851 TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
2852 xfs_agino_t prev_agino, xfs_agino_t next_agino),
2853 TP_ARGS(pag, bucket, prev_agino, next_agino),
2856 __field(xfs_agnumber_t, agno)
2857 __field(unsigned int, bucket)
2858 __field(xfs_agino_t, prev_agino)
2859 __field(xfs_agino_t, next_agino)
2862 __entry->dev = pag->pag_mount->m_super->s_dev;
2863 __entry->agno = pag->pag_agno;
2864 __entry->bucket = bucket;
2865 __entry->prev_agino = prev_agino;
2866 __entry->next_agino = next_agino;
2868 TP_printk("dev %d:%d agno 0x%x bucket %u prev_agino 0x%x next_agino 0x%x",
2869 MAJOR(__entry->dev), MINOR(__entry->dev),
2872 __entry->prev_agino,
2873 __entry->next_agino)
2876 DECLARE_EVENT_CLASS(xrep_iunlink_resolve_class,
2877 TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
2878 xfs_agino_t prev_agino, xfs_agino_t next_agino),
2879 TP_ARGS(pag, bucket, prev_agino, next_agino),
2882 __field(xfs_agnumber_t, agno)
2883 __field(unsigned int, bucket)
2884 __field(xfs_agino_t, prev_agino)
2885 __field(xfs_agino_t, next_agino)
2888 __entry->dev = pag->pag_mount->m_super->s_dev;
2889 __entry->agno = pag->pag_agno;
2890 __entry->bucket = bucket;
2891 __entry->prev_agino = prev_agino;
2892 __entry->next_agino = next_agino;
2894 TP_printk("dev %d:%d agno 0x%x bucket %u prev_agino 0x%x next_agino 0x%x",
2895 MAJOR(__entry->dev), MINOR(__entry->dev),
2898 __entry->prev_agino,
2899 __entry->next_agino)
2901 #define DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(name) \
2902 DEFINE_EVENT(xrep_iunlink_resolve_class, name, \
2903 TP_PROTO(struct xfs_perag *pag, unsigned int bucket, \
2904 xfs_agino_t prev_agino, xfs_agino_t next_agino), \
2905 TP_ARGS(pag, bucket, prev_agino, next_agino))
2906 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_uncached);
2907 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_wronglist);
2908 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_nolist);
2909 DEFINE_REPAIR_IUNLINK_RESOLVE_EVENT(xrep_iunlink_resolve_ok);
2911 TRACE_EVENT(xrep_iunlink_relink_next,
2912 TP_PROTO(struct xfs_inode *ip, xfs_agino_t next_agino),
2913 TP_ARGS(ip, next_agino),
2916 __field(xfs_agnumber_t, agno)
2917 __field(xfs_agino_t, agino)
2918 __field(xfs_agino_t, next_agino)
2919 __field(xfs_agino_t, new_next_agino)
2922 __entry->dev = ip->i_mount->m_super->s_dev;
2923 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
2924 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
2925 __entry->next_agino = ip->i_next_unlinked;
2926 __entry->new_next_agino = next_agino;
2928 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x -> 0x%x",
2929 MAJOR(__entry->dev), MINOR(__entry->dev),
2931 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
2933 __entry->next_agino,
2934 __entry->new_next_agino)
2937 TRACE_EVENT(xrep_iunlink_relink_prev,
2938 TP_PROTO(struct xfs_inode *ip, xfs_agino_t prev_agino),
2939 TP_ARGS(ip, prev_agino),
2942 __field(xfs_agnumber_t, agno)
2943 __field(xfs_agino_t, agino)
2944 __field(xfs_agino_t, prev_agino)
2945 __field(xfs_agino_t, new_prev_agino)
2948 __entry->dev = ip->i_mount->m_super->s_dev;
2949 __entry->agno = XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino);
2950 __entry->agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino);
2951 __entry->prev_agino = ip->i_prev_unlinked;
2952 __entry->new_prev_agino = prev_agino;
2954 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x prev_agino 0x%x -> 0x%x",
2955 MAJOR(__entry->dev), MINOR(__entry->dev),
2957 __entry->agino % XFS_AGI_UNLINKED_BUCKETS,
2959 __entry->prev_agino,
2960 __entry->new_prev_agino)
2963 TRACE_EVENT(xrep_iunlink_add_to_bucket,
2964 TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
2965 xfs_agino_t agino, xfs_agino_t curr_head),
2966 TP_ARGS(pag, bucket, agino, curr_head),
2969 __field(xfs_agnumber_t, agno)
2970 __field(unsigned int, bucket)
2971 __field(xfs_agino_t, agino)
2972 __field(xfs_agino_t, next_agino)
2975 __entry->dev = pag->pag_mount->m_super->s_dev;
2976 __entry->agno = pag->pag_agno;
2977 __entry->bucket = bucket;
2978 __entry->agino = agino;
2979 __entry->next_agino = curr_head;
2981 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x next_agino 0x%x",
2982 MAJOR(__entry->dev), MINOR(__entry->dev),
2986 __entry->next_agino)
2989 TRACE_EVENT(xrep_iunlink_commit_bucket,
2990 TP_PROTO(struct xfs_perag *pag, unsigned int bucket,
2991 xfs_agino_t old_agino, xfs_agino_t agino),
2992 TP_ARGS(pag, bucket, old_agino, agino),
2995 __field(xfs_agnumber_t, agno)
2996 __field(unsigned int, bucket)
2997 __field(xfs_agino_t, old_agino)
2998 __field(xfs_agino_t, agino)
3001 __entry->dev = pag->pag_mount->m_super->s_dev;
3002 __entry->agno = pag->pag_agno;
3003 __entry->bucket = bucket;
3004 __entry->old_agino = old_agino;
3005 __entry->agino = agino;
3007 TP_printk("dev %d:%d agno 0x%x bucket %u agino 0x%x -> 0x%x",
3008 MAJOR(__entry->dev), MINOR(__entry->dev),
3015 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
3017 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
3019 #undef TRACE_INCLUDE_PATH
3020 #define TRACE_INCLUDE_PATH .
3021 #define TRACE_INCLUDE_FILE scrub/trace
3022 #include <trace/define_trace.h>