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