xref: /openbmc/linux/fs/xfs/scrub/trace.h (revision c03e4b9e6b645a5020f128aeb739a5424c6abe8c)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5  */
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM xfs_scrub
8 
9 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
10 #define _TRACE_XFS_SCRUB_TRACE_H
11 
12 #include <linux/tracepoint.h>
13 #include "xfs_bit.h"
14 
15 /*
16  * ftrace's __print_symbolic requires that all enum values be wrapped in the
17  * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace
18  * ring buffer.  Somehow this was only worth mentioning in the ftrace sample
19  * code.
20  */
21 TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi);
22 TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi);
23 TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi);
24 TRACE_DEFINE_ENUM(XFS_BTNUM_INOi);
25 TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
26 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
27 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
28 
29 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
30 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
31 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
32 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL);
33 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI);
34 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT);
35 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT);
36 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT);
37 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT);
38 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT);
39 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT);
40 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE);
41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD);
42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA);
43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC);
44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR);
45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR);
46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK);
47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT);
48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP);
49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM);
50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA);
51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA);
52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA);
53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
54 
55 #define XFS_SCRUB_TYPE_STRINGS \
56 	{ XFS_SCRUB_TYPE_PROBE,		"probe" }, \
57 	{ XFS_SCRUB_TYPE_SB,		"sb" }, \
58 	{ XFS_SCRUB_TYPE_AGF,		"agf" }, \
59 	{ XFS_SCRUB_TYPE_AGFL,		"agfl" }, \
60 	{ XFS_SCRUB_TYPE_AGI,		"agi" }, \
61 	{ XFS_SCRUB_TYPE_BNOBT,		"bnobt" }, \
62 	{ XFS_SCRUB_TYPE_CNTBT,		"cntbt" }, \
63 	{ XFS_SCRUB_TYPE_INOBT,		"inobt" }, \
64 	{ XFS_SCRUB_TYPE_FINOBT,	"finobt" }, \
65 	{ XFS_SCRUB_TYPE_RMAPBT,	"rmapbt" }, \
66 	{ XFS_SCRUB_TYPE_REFCNTBT,	"refcountbt" }, \
67 	{ XFS_SCRUB_TYPE_INODE,		"inode" }, \
68 	{ XFS_SCRUB_TYPE_BMBTD,		"bmapbtd" }, \
69 	{ XFS_SCRUB_TYPE_BMBTA,		"bmapbta" }, \
70 	{ XFS_SCRUB_TYPE_BMBTC,		"bmapbtc" }, \
71 	{ XFS_SCRUB_TYPE_DIR,		"directory" }, \
72 	{ XFS_SCRUB_TYPE_XATTR,		"xattr" }, \
73 	{ XFS_SCRUB_TYPE_SYMLINK,	"symlink" }, \
74 	{ XFS_SCRUB_TYPE_PARENT,	"parent" }, \
75 	{ XFS_SCRUB_TYPE_RTBITMAP,	"rtbitmap" }, \
76 	{ XFS_SCRUB_TYPE_RTSUM,		"rtsummary" }, \
77 	{ XFS_SCRUB_TYPE_UQUOTA,	"usrquota" }, \
78 	{ XFS_SCRUB_TYPE_GQUOTA,	"grpquota" }, \
79 	{ XFS_SCRUB_TYPE_PQUOTA,	"prjquota" }, \
80 	{ XFS_SCRUB_TYPE_FSCOUNTERS,	"fscounters" }
81 
82 #define XFS_SCRUB_FLAG_STRINGS \
83 	{ XFS_SCRUB_IFLAG_REPAIR,		"repair" }, \
84 	{ XFS_SCRUB_OFLAG_CORRUPT,		"corrupt" }, \
85 	{ XFS_SCRUB_OFLAG_PREEN,		"preen" }, \
86 	{ XFS_SCRUB_OFLAG_XFAIL,		"xfail" }, \
87 	{ XFS_SCRUB_OFLAG_XCORRUPT,		"xcorrupt" }, \
88 	{ XFS_SCRUB_OFLAG_INCOMPLETE,		"incomplete" }, \
89 	{ XFS_SCRUB_OFLAG_WARNING,		"warning" }, \
90 	{ XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED,	"norepair" }
91 
92 DECLARE_EVENT_CLASS(xchk_class,
93 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
94 		 int error),
95 	TP_ARGS(ip, sm, error),
96 	TP_STRUCT__entry(
97 		__field(dev_t, dev)
98 		__field(xfs_ino_t, ino)
99 		__field(unsigned int, type)
100 		__field(xfs_agnumber_t, agno)
101 		__field(xfs_ino_t, inum)
102 		__field(unsigned int, gen)
103 		__field(unsigned int, flags)
104 		__field(int, error)
105 	),
106 	TP_fast_assign(
107 		__entry->dev = ip->i_mount->m_super->s_dev;
108 		__entry->ino = ip->i_ino;
109 		__entry->type = sm->sm_type;
110 		__entry->agno = sm->sm_agno;
111 		__entry->inum = sm->sm_ino;
112 		__entry->gen = sm->sm_gen;
113 		__entry->flags = sm->sm_flags;
114 		__entry->error = error;
115 	),
116 	TP_printk("dev %d:%d ino 0x%llx type %s agno 0x%x inum 0x%llx gen 0x%x flags (%s) error %d",
117 		  MAJOR(__entry->dev), MINOR(__entry->dev),
118 		  __entry->ino,
119 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
120 		  __entry->agno,
121 		  __entry->inum,
122 		  __entry->gen,
123 		  __print_flags(__entry->flags, "|", XFS_SCRUB_FLAG_STRINGS),
124 		  __entry->error)
125 )
126 #define DEFINE_SCRUB_EVENT(name) \
127 DEFINE_EVENT(xchk_class, name, \
128 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
129 		 int error), \
130 	TP_ARGS(ip, sm, error))
131 
132 DEFINE_SCRUB_EVENT(xchk_start);
133 DEFINE_SCRUB_EVENT(xchk_done);
134 DEFINE_SCRUB_EVENT(xchk_deadlock_retry);
135 DEFINE_SCRUB_EVENT(xrep_attempt);
136 DEFINE_SCRUB_EVENT(xrep_done);
137 
138 TRACE_EVENT(xchk_op_error,
139 	TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno,
140 		 xfs_agblock_t bno, int error, void *ret_ip),
141 	TP_ARGS(sc, agno, bno, error, ret_ip),
142 	TP_STRUCT__entry(
143 		__field(dev_t, dev)
144 		__field(unsigned int, type)
145 		__field(xfs_agnumber_t, agno)
146 		__field(xfs_agblock_t, bno)
147 		__field(int, error)
148 		__field(void *, ret_ip)
149 	),
150 	TP_fast_assign(
151 		__entry->dev = sc->mp->m_super->s_dev;
152 		__entry->type = sc->sm->sm_type;
153 		__entry->agno = agno;
154 		__entry->bno = bno;
155 		__entry->error = error;
156 		__entry->ret_ip = ret_ip;
157 	),
158 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x error %d ret_ip %pS",
159 		  MAJOR(__entry->dev), MINOR(__entry->dev),
160 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
161 		  __entry->agno,
162 		  __entry->bno,
163 		  __entry->error,
164 		  __entry->ret_ip)
165 );
166 
167 TRACE_EVENT(xchk_file_op_error,
168 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
169 		 xfs_fileoff_t offset, int error, void *ret_ip),
170 	TP_ARGS(sc, whichfork, offset, error, ret_ip),
171 	TP_STRUCT__entry(
172 		__field(dev_t, dev)
173 		__field(xfs_ino_t, ino)
174 		__field(int, whichfork)
175 		__field(unsigned int, type)
176 		__field(xfs_fileoff_t, offset)
177 		__field(int, error)
178 		__field(void *, ret_ip)
179 	),
180 	TP_fast_assign(
181 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
182 		__entry->ino = sc->ip->i_ino;
183 		__entry->whichfork = whichfork;
184 		__entry->type = sc->sm->sm_type;
185 		__entry->offset = offset;
186 		__entry->error = error;
187 		__entry->ret_ip = ret_ip;
188 	),
189 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx error %d ret_ip %pS",
190 		  MAJOR(__entry->dev), MINOR(__entry->dev),
191 		  __entry->ino,
192 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
193 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
194 		  __entry->offset,
195 		  __entry->error,
196 		  __entry->ret_ip)
197 );
198 
199 DECLARE_EVENT_CLASS(xchk_block_error_class,
200 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip),
201 	TP_ARGS(sc, daddr, ret_ip),
202 	TP_STRUCT__entry(
203 		__field(dev_t, dev)
204 		__field(unsigned int, type)
205 		__field(xfs_agnumber_t, agno)
206 		__field(xfs_agblock_t, agbno)
207 		__field(void *, ret_ip)
208 	),
209 	TP_fast_assign(
210 		__entry->dev = sc->mp->m_super->s_dev;
211 		__entry->type = sc->sm->sm_type;
212 		__entry->agno = xfs_daddr_to_agno(sc->mp, daddr);
213 		__entry->agbno = xfs_daddr_to_agbno(sc->mp, daddr);
214 		__entry->ret_ip = ret_ip;
215 	),
216 	TP_printk("dev %d:%d type %s agno 0x%x agbno 0x%x ret_ip %pS",
217 		  MAJOR(__entry->dev), MINOR(__entry->dev),
218 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
219 		  __entry->agno,
220 		  __entry->agbno,
221 		  __entry->ret_ip)
222 )
223 
224 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
225 DEFINE_EVENT(xchk_block_error_class, name, \
226 	TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \
227 		 void *ret_ip), \
228 	TP_ARGS(sc, daddr, ret_ip))
229 
230 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error);
231 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error);
232 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen);
233 
234 DECLARE_EVENT_CLASS(xchk_ino_error_class,
235 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip),
236 	TP_ARGS(sc, ino, ret_ip),
237 	TP_STRUCT__entry(
238 		__field(dev_t, dev)
239 		__field(xfs_ino_t, ino)
240 		__field(unsigned int, type)
241 		__field(void *, ret_ip)
242 	),
243 	TP_fast_assign(
244 		__entry->dev = sc->mp->m_super->s_dev;
245 		__entry->ino = ino;
246 		__entry->type = sc->sm->sm_type;
247 		__entry->ret_ip = ret_ip;
248 	),
249 	TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS",
250 		  MAJOR(__entry->dev), MINOR(__entry->dev),
251 		  __entry->ino,
252 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
253 		  __entry->ret_ip)
254 )
255 
256 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
257 DEFINE_EVENT(xchk_ino_error_class, name, \
258 	TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \
259 		 void *ret_ip), \
260 	TP_ARGS(sc, ino, ret_ip))
261 
262 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error);
263 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen);
264 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning);
265 
266 DECLARE_EVENT_CLASS(xchk_fblock_error_class,
267 	TP_PROTO(struct xfs_scrub *sc, int whichfork,
268 		 xfs_fileoff_t offset, void *ret_ip),
269 	TP_ARGS(sc, whichfork, offset, ret_ip),
270 	TP_STRUCT__entry(
271 		__field(dev_t, dev)
272 		__field(xfs_ino_t, ino)
273 		__field(int, whichfork)
274 		__field(unsigned int, type)
275 		__field(xfs_fileoff_t, offset)
276 		__field(void *, ret_ip)
277 	),
278 	TP_fast_assign(
279 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
280 		__entry->ino = sc->ip->i_ino;
281 		__entry->whichfork = whichfork;
282 		__entry->type = sc->sm->sm_type;
283 		__entry->offset = offset;
284 		__entry->ret_ip = ret_ip;
285 	),
286 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s fileoff 0x%llx ret_ip %pS",
287 		  MAJOR(__entry->dev), MINOR(__entry->dev),
288 		  __entry->ino,
289 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
290 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
291 		  __entry->offset,
292 		  __entry->ret_ip)
293 );
294 
295 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
296 DEFINE_EVENT(xchk_fblock_error_class, name, \
297 	TP_PROTO(struct xfs_scrub *sc, int whichfork, \
298 		 xfs_fileoff_t offset, void *ret_ip), \
299 	TP_ARGS(sc, whichfork, offset, ret_ip))
300 
301 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error);
302 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning);
303 
304 TRACE_EVENT(xchk_incomplete,
305 	TP_PROTO(struct xfs_scrub *sc, void *ret_ip),
306 	TP_ARGS(sc, ret_ip),
307 	TP_STRUCT__entry(
308 		__field(dev_t, dev)
309 		__field(unsigned int, type)
310 		__field(void *, ret_ip)
311 	),
312 	TP_fast_assign(
313 		__entry->dev = sc->mp->m_super->s_dev;
314 		__entry->type = sc->sm->sm_type;
315 		__entry->ret_ip = ret_ip;
316 	),
317 	TP_printk("dev %d:%d type %s ret_ip %pS",
318 		  MAJOR(__entry->dev), MINOR(__entry->dev),
319 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
320 		  __entry->ret_ip)
321 );
322 
323 TRACE_EVENT(xchk_btree_op_error,
324 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
325 		 int level, int error, void *ret_ip),
326 	TP_ARGS(sc, cur, level, error, ret_ip),
327 	TP_STRUCT__entry(
328 		__field(dev_t, dev)
329 		__field(unsigned int, type)
330 		__field(xfs_btnum_t, btnum)
331 		__field(int, level)
332 		__field(xfs_agnumber_t, agno)
333 		__field(xfs_agblock_t, bno)
334 		__field(int, ptr)
335 		__field(int, error)
336 		__field(void *, ret_ip)
337 	),
338 	TP_fast_assign(
339 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
340 
341 		__entry->dev = sc->mp->m_super->s_dev;
342 		__entry->type = sc->sm->sm_type;
343 		__entry->btnum = cur->bc_btnum;
344 		__entry->level = level;
345 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
346 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
347 		__entry->ptr = cur->bc_ptrs[level];
348 		__entry->error = error;
349 		__entry->ret_ip = ret_ip;
350 	),
351 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
352 		  MAJOR(__entry->dev), MINOR(__entry->dev),
353 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
354 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
355 		  __entry->level,
356 		  __entry->ptr,
357 		  __entry->agno,
358 		  __entry->bno,
359 		  __entry->error,
360 		  __entry->ret_ip)
361 );
362 
363 TRACE_EVENT(xchk_ifork_btree_op_error,
364 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
365 		 int level, int error, void *ret_ip),
366 	TP_ARGS(sc, cur, level, error, ret_ip),
367 	TP_STRUCT__entry(
368 		__field(dev_t, dev)
369 		__field(xfs_ino_t, ino)
370 		__field(int, whichfork)
371 		__field(unsigned int, type)
372 		__field(xfs_btnum_t, btnum)
373 		__field(int, level)
374 		__field(int, ptr)
375 		__field(xfs_agnumber_t, agno)
376 		__field(xfs_agblock_t, bno)
377 		__field(int, error)
378 		__field(void *, ret_ip)
379 	),
380 	TP_fast_assign(
381 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
382 		__entry->dev = sc->mp->m_super->s_dev;
383 		__entry->ino = sc->ip->i_ino;
384 		__entry->whichfork = cur->bc_ino.whichfork;
385 		__entry->type = sc->sm->sm_type;
386 		__entry->btnum = cur->bc_btnum;
387 		__entry->level = level;
388 		__entry->ptr = cur->bc_ptrs[level];
389 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
390 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
391 		__entry->error = error;
392 		__entry->ret_ip = ret_ip;
393 	),
394 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x error %d ret_ip %pS",
395 		  MAJOR(__entry->dev), MINOR(__entry->dev),
396 		  __entry->ino,
397 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
398 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
399 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
400 		  __entry->level,
401 		  __entry->ptr,
402 		  __entry->agno,
403 		  __entry->bno,
404 		  __entry->error,
405 		  __entry->ret_ip)
406 );
407 
408 TRACE_EVENT(xchk_btree_error,
409 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
410 		 int level, void *ret_ip),
411 	TP_ARGS(sc, cur, level, ret_ip),
412 	TP_STRUCT__entry(
413 		__field(dev_t, dev)
414 		__field(unsigned int, type)
415 		__field(xfs_btnum_t, btnum)
416 		__field(int, level)
417 		__field(xfs_agnumber_t, agno)
418 		__field(xfs_agblock_t, bno)
419 		__field(int, ptr)
420 		__field(void *, ret_ip)
421 	),
422 	TP_fast_assign(
423 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
424 		__entry->dev = sc->mp->m_super->s_dev;
425 		__entry->type = sc->sm->sm_type;
426 		__entry->btnum = cur->bc_btnum;
427 		__entry->level = level;
428 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
429 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
430 		__entry->ptr = cur->bc_ptrs[level];
431 		__entry->ret_ip = ret_ip;
432 	),
433 	TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
434 		  MAJOR(__entry->dev), MINOR(__entry->dev),
435 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
436 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
437 		  __entry->level,
438 		  __entry->ptr,
439 		  __entry->agno,
440 		  __entry->bno,
441 		  __entry->ret_ip)
442 );
443 
444 TRACE_EVENT(xchk_ifork_btree_error,
445 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
446 		 int level, void *ret_ip),
447 	TP_ARGS(sc, cur, level, ret_ip),
448 	TP_STRUCT__entry(
449 		__field(dev_t, dev)
450 		__field(xfs_ino_t, ino)
451 		__field(int, whichfork)
452 		__field(unsigned int, type)
453 		__field(xfs_btnum_t, btnum)
454 		__field(int, level)
455 		__field(xfs_agnumber_t, agno)
456 		__field(xfs_agblock_t, bno)
457 		__field(int, ptr)
458 		__field(void *, ret_ip)
459 	),
460 	TP_fast_assign(
461 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
462 		__entry->dev = sc->mp->m_super->s_dev;
463 		__entry->ino = sc->ip->i_ino;
464 		__entry->whichfork = cur->bc_ino.whichfork;
465 		__entry->type = sc->sm->sm_type;
466 		__entry->btnum = cur->bc_btnum;
467 		__entry->level = level;
468 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
469 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
470 		__entry->ptr = cur->bc_ptrs[level];
471 		__entry->ret_ip = ret_ip;
472 	),
473 	TP_printk("dev %d:%d ino 0x%llx fork %s type %s btree %s level %d ptr %d agno 0x%x agbno 0x%x ret_ip %pS",
474 		  MAJOR(__entry->dev), MINOR(__entry->dev),
475 		  __entry->ino,
476 		  __print_symbolic(__entry->whichfork, XFS_WHICHFORK_STRINGS),
477 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
478 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
479 		  __entry->level,
480 		  __entry->ptr,
481 		  __entry->agno,
482 		  __entry->bno,
483 		  __entry->ret_ip)
484 );
485 
486 DECLARE_EVENT_CLASS(xchk_sbtree_class,
487 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
488 		 int level),
489 	TP_ARGS(sc, cur, level),
490 	TP_STRUCT__entry(
491 		__field(dev_t, dev)
492 		__field(int, type)
493 		__field(xfs_btnum_t, btnum)
494 		__field(xfs_agnumber_t, agno)
495 		__field(xfs_agblock_t, bno)
496 		__field(int, level)
497 		__field(int, nlevels)
498 		__field(int, ptr)
499 	),
500 	TP_fast_assign(
501 		xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level);
502 
503 		__entry->dev = sc->mp->m_super->s_dev;
504 		__entry->type = sc->sm->sm_type;
505 		__entry->btnum = cur->bc_btnum;
506 		__entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
507 		__entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
508 		__entry->level = level;
509 		__entry->nlevels = cur->bc_nlevels;
510 		__entry->ptr = cur->bc_ptrs[level];
511 	),
512 	TP_printk("dev %d:%d type %s btree %s agno 0x%x agbno 0x%x level %d nlevels %d ptr %d",
513 		  MAJOR(__entry->dev), MINOR(__entry->dev),
514 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
515 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS),
516 		  __entry->agno,
517 		  __entry->bno,
518 		  __entry->level,
519 		  __entry->nlevels,
520 		  __entry->ptr)
521 )
522 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
523 DEFINE_EVENT(xchk_sbtree_class, name, \
524 	TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \
525 		 int level), \
526 	TP_ARGS(sc, cur, level))
527 
528 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec);
529 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key);
530 
531 TRACE_EVENT(xchk_xref_error,
532 	TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip),
533 	TP_ARGS(sc, error, ret_ip),
534 	TP_STRUCT__entry(
535 		__field(dev_t, dev)
536 		__field(int, type)
537 		__field(int, error)
538 		__field(void *, ret_ip)
539 	),
540 	TP_fast_assign(
541 		__entry->dev = sc->mp->m_super->s_dev;
542 		__entry->type = sc->sm->sm_type;
543 		__entry->error = error;
544 		__entry->ret_ip = ret_ip;
545 	),
546 	TP_printk("dev %d:%d type %s xref error %d ret_ip %pS",
547 		  MAJOR(__entry->dev), MINOR(__entry->dev),
548 		  __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS),
549 		  __entry->error,
550 		  __entry->ret_ip)
551 );
552 
553 TRACE_EVENT(xchk_iallocbt_check_cluster,
554 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
555 		 xfs_agino_t startino, xfs_daddr_t map_daddr,
556 		 unsigned short map_len, unsigned int chunk_ino,
557 		 unsigned int nr_inodes, uint16_t cluster_mask,
558 		 uint16_t holemask, unsigned int cluster_ino),
559 	TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes,
560 		cluster_mask, holemask, cluster_ino),
561 	TP_STRUCT__entry(
562 		__field(dev_t, dev)
563 		__field(xfs_agnumber_t, agno)
564 		__field(xfs_agino_t, startino)
565 		__field(xfs_daddr_t, map_daddr)
566 		__field(unsigned short, map_len)
567 		__field(unsigned int, chunk_ino)
568 		__field(unsigned int, nr_inodes)
569 		__field(unsigned int, cluster_ino)
570 		__field(uint16_t, cluster_mask)
571 		__field(uint16_t, holemask)
572 	),
573 	TP_fast_assign(
574 		__entry->dev = mp->m_super->s_dev;
575 		__entry->agno = agno;
576 		__entry->startino = startino;
577 		__entry->map_daddr = map_daddr;
578 		__entry->map_len = map_len;
579 		__entry->chunk_ino = chunk_ino;
580 		__entry->nr_inodes = nr_inodes;
581 		__entry->cluster_mask = cluster_mask;
582 		__entry->holemask = holemask;
583 		__entry->cluster_ino = cluster_ino;
584 	),
585 	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",
586 		  MAJOR(__entry->dev), MINOR(__entry->dev),
587 		  __entry->agno,
588 		  __entry->startino,
589 		  __entry->map_daddr,
590 		  __entry->map_len,
591 		  __entry->chunk_ino,
592 		  __entry->nr_inodes,
593 		  __entry->cluster_mask,
594 		  __entry->holemask,
595 		  __entry->cluster_ino)
596 )
597 
598 TRACE_EVENT(xchk_fscounters_calc,
599 	TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree,
600 		 uint64_t fdblocks, uint64_t delalloc),
601 	TP_ARGS(mp, icount, ifree, fdblocks, delalloc),
602 	TP_STRUCT__entry(
603 		__field(dev_t, dev)
604 		__field(int64_t, icount_sb)
605 		__field(uint64_t, icount_calculated)
606 		__field(int64_t, ifree_sb)
607 		__field(uint64_t, ifree_calculated)
608 		__field(int64_t, fdblocks_sb)
609 		__field(uint64_t, fdblocks_calculated)
610 		__field(uint64_t, delalloc)
611 	),
612 	TP_fast_assign(
613 		__entry->dev = mp->m_super->s_dev;
614 		__entry->icount_sb = mp->m_sb.sb_icount;
615 		__entry->icount_calculated = icount;
616 		__entry->ifree_sb = mp->m_sb.sb_ifree;
617 		__entry->ifree_calculated = ifree;
618 		__entry->fdblocks_sb = mp->m_sb.sb_fdblocks;
619 		__entry->fdblocks_calculated = fdblocks;
620 		__entry->delalloc = delalloc;
621 	),
622 	TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu",
623 		  MAJOR(__entry->dev), MINOR(__entry->dev),
624 		  __entry->icount_sb,
625 		  __entry->icount_calculated,
626 		  __entry->ifree_sb,
627 		  __entry->ifree_calculated,
628 		  __entry->fdblocks_sb,
629 		  __entry->fdblocks_calculated,
630 		  __entry->delalloc)
631 )
632 
633 TRACE_EVENT(xchk_fscounters_within_range,
634 	TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value,
635 		 int64_t old_value),
636 	TP_ARGS(mp, expected, curr_value, old_value),
637 	TP_STRUCT__entry(
638 		__field(dev_t, dev)
639 		__field(uint64_t, expected)
640 		__field(int64_t, curr_value)
641 		__field(int64_t, old_value)
642 	),
643 	TP_fast_assign(
644 		__entry->dev = mp->m_super->s_dev;
645 		__entry->expected = expected;
646 		__entry->curr_value = curr_value;
647 		__entry->old_value = old_value;
648 	),
649 	TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld",
650 		  MAJOR(__entry->dev), MINOR(__entry->dev),
651 		  __entry->expected,
652 		  __entry->curr_value,
653 		  __entry->old_value)
654 )
655 
656 /* repair tracepoints */
657 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)
658 
659 DECLARE_EVENT_CLASS(xrep_extent_class,
660 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
661 		 xfs_agblock_t agbno, xfs_extlen_t len),
662 	TP_ARGS(mp, agno, agbno, len),
663 	TP_STRUCT__entry(
664 		__field(dev_t, dev)
665 		__field(xfs_agnumber_t, agno)
666 		__field(xfs_agblock_t, agbno)
667 		__field(xfs_extlen_t, len)
668 	),
669 	TP_fast_assign(
670 		__entry->dev = mp->m_super->s_dev;
671 		__entry->agno = agno;
672 		__entry->agbno = agbno;
673 		__entry->len = len;
674 	),
675 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x",
676 		  MAJOR(__entry->dev), MINOR(__entry->dev),
677 		  __entry->agno,
678 		  __entry->agbno,
679 		  __entry->len)
680 );
681 #define DEFINE_REPAIR_EXTENT_EVENT(name) \
682 DEFINE_EVENT(xrep_extent_class, name, \
683 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
684 		 xfs_agblock_t agbno, xfs_extlen_t len), \
685 	TP_ARGS(mp, agno, agbno, len))
686 DEFINE_REPAIR_EXTENT_EVENT(xrep_dispose_btree_extent);
687 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert);
688 
689 DECLARE_EVENT_CLASS(xrep_rmap_class,
690 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
691 		 xfs_agblock_t agbno, xfs_extlen_t len,
692 		 uint64_t owner, uint64_t offset, unsigned int flags),
693 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags),
694 	TP_STRUCT__entry(
695 		__field(dev_t, dev)
696 		__field(xfs_agnumber_t, agno)
697 		__field(xfs_agblock_t, agbno)
698 		__field(xfs_extlen_t, len)
699 		__field(uint64_t, owner)
700 		__field(uint64_t, offset)
701 		__field(unsigned int, flags)
702 	),
703 	TP_fast_assign(
704 		__entry->dev = mp->m_super->s_dev;
705 		__entry->agno = agno;
706 		__entry->agbno = agbno;
707 		__entry->len = len;
708 		__entry->owner = owner;
709 		__entry->offset = offset;
710 		__entry->flags = flags;
711 	),
712 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
713 		  MAJOR(__entry->dev), MINOR(__entry->dev),
714 		  __entry->agno,
715 		  __entry->agbno,
716 		  __entry->len,
717 		  __entry->owner,
718 		  __entry->offset,
719 		  __entry->flags)
720 );
721 #define DEFINE_REPAIR_RMAP_EVENT(name) \
722 DEFINE_EVENT(xrep_rmap_class, name, \
723 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \
724 		 xfs_agblock_t agbno, xfs_extlen_t len, \
725 		 uint64_t owner, uint64_t offset, unsigned int flags), \
726 	TP_ARGS(mp, agno, agbno, len, owner, offset, flags))
727 DEFINE_REPAIR_RMAP_EVENT(xrep_alloc_extent_fn);
728 DEFINE_REPAIR_RMAP_EVENT(xrep_ialloc_extent_fn);
729 DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn);
730 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_extent_fn);
731 
732 TRACE_EVENT(xrep_refcount_extent_fn,
733 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
734 		 struct xfs_refcount_irec *irec),
735 	TP_ARGS(mp, agno, irec),
736 	TP_STRUCT__entry(
737 		__field(dev_t, dev)
738 		__field(xfs_agnumber_t, agno)
739 		__field(xfs_agblock_t, startblock)
740 		__field(xfs_extlen_t, blockcount)
741 		__field(xfs_nlink_t, refcount)
742 	),
743 	TP_fast_assign(
744 		__entry->dev = mp->m_super->s_dev;
745 		__entry->agno = agno;
746 		__entry->startblock = irec->rc_startblock;
747 		__entry->blockcount = irec->rc_blockcount;
748 		__entry->refcount = irec->rc_refcount;
749 	),
750 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x fsbcount 0x%x refcount %u",
751 		  MAJOR(__entry->dev), MINOR(__entry->dev),
752 		  __entry->agno,
753 		  __entry->startblock,
754 		  __entry->blockcount,
755 		  __entry->refcount)
756 )
757 
758 TRACE_EVENT(xrep_init_btblock,
759 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
760 		 xfs_btnum_t btnum),
761 	TP_ARGS(mp, agno, agbno, btnum),
762 	TP_STRUCT__entry(
763 		__field(dev_t, dev)
764 		__field(xfs_agnumber_t, agno)
765 		__field(xfs_agblock_t, agbno)
766 		__field(uint32_t, btnum)
767 	),
768 	TP_fast_assign(
769 		__entry->dev = mp->m_super->s_dev;
770 		__entry->agno = agno;
771 		__entry->agbno = agbno;
772 		__entry->btnum = btnum;
773 	),
774 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x btree %s",
775 		  MAJOR(__entry->dev), MINOR(__entry->dev),
776 		  __entry->agno,
777 		  __entry->agbno,
778 		  __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS))
779 )
780 TRACE_EVENT(xrep_findroot_block,
781 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno,
782 		 uint32_t magic, uint16_t level),
783 	TP_ARGS(mp, agno, agbno, magic, level),
784 	TP_STRUCT__entry(
785 		__field(dev_t, dev)
786 		__field(xfs_agnumber_t, agno)
787 		__field(xfs_agblock_t, agbno)
788 		__field(uint32_t, magic)
789 		__field(uint16_t, level)
790 	),
791 	TP_fast_assign(
792 		__entry->dev = mp->m_super->s_dev;
793 		__entry->agno = agno;
794 		__entry->agbno = agbno;
795 		__entry->magic = magic;
796 		__entry->level = level;
797 	),
798 	TP_printk("dev %d:%d agno 0x%x agbno 0x%x magic 0x%x level %u",
799 		  MAJOR(__entry->dev), MINOR(__entry->dev),
800 		  __entry->agno,
801 		  __entry->agbno,
802 		  __entry->magic,
803 		  __entry->level)
804 )
805 TRACE_EVENT(xrep_calc_ag_resblks,
806 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
807 		 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen,
808 		 xfs_agblock_t usedlen),
809 	TP_ARGS(mp, agno, icount, aglen, freelen, usedlen),
810 	TP_STRUCT__entry(
811 		__field(dev_t, dev)
812 		__field(xfs_agnumber_t, agno)
813 		__field(xfs_agino_t, icount)
814 		__field(xfs_agblock_t, aglen)
815 		__field(xfs_agblock_t, freelen)
816 		__field(xfs_agblock_t, usedlen)
817 	),
818 	TP_fast_assign(
819 		__entry->dev = mp->m_super->s_dev;
820 		__entry->agno = agno;
821 		__entry->icount = icount;
822 		__entry->aglen = aglen;
823 		__entry->freelen = freelen;
824 		__entry->usedlen = usedlen;
825 	),
826 	TP_printk("dev %d:%d agno 0x%x icount %u aglen %u freelen %u usedlen %u",
827 		  MAJOR(__entry->dev), MINOR(__entry->dev),
828 		  __entry->agno,
829 		  __entry->icount,
830 		  __entry->aglen,
831 		  __entry->freelen,
832 		  __entry->usedlen)
833 )
834 TRACE_EVENT(xrep_calc_ag_resblks_btsize,
835 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
836 		 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz,
837 		 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz),
838 	TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz),
839 	TP_STRUCT__entry(
840 		__field(dev_t, dev)
841 		__field(xfs_agnumber_t, agno)
842 		__field(xfs_agblock_t, bnobt_sz)
843 		__field(xfs_agblock_t, inobt_sz)
844 		__field(xfs_agblock_t, rmapbt_sz)
845 		__field(xfs_agblock_t, refcbt_sz)
846 	),
847 	TP_fast_assign(
848 		__entry->dev = mp->m_super->s_dev;
849 		__entry->agno = agno;
850 		__entry->bnobt_sz = bnobt_sz;
851 		__entry->inobt_sz = inobt_sz;
852 		__entry->rmapbt_sz = rmapbt_sz;
853 		__entry->refcbt_sz = refcbt_sz;
854 	),
855 	TP_printk("dev %d:%d agno 0x%x bnobt %u inobt %u rmapbt %u refcountbt %u",
856 		  MAJOR(__entry->dev), MINOR(__entry->dev),
857 		  __entry->agno,
858 		  __entry->bnobt_sz,
859 		  __entry->inobt_sz,
860 		  __entry->rmapbt_sz,
861 		  __entry->refcbt_sz)
862 )
863 TRACE_EVENT(xrep_reset_counters,
864 	TP_PROTO(struct xfs_mount *mp),
865 	TP_ARGS(mp),
866 	TP_STRUCT__entry(
867 		__field(dev_t, dev)
868 	),
869 	TP_fast_assign(
870 		__entry->dev = mp->m_super->s_dev;
871 	),
872 	TP_printk("dev %d:%d",
873 		  MAJOR(__entry->dev), MINOR(__entry->dev))
874 )
875 
876 TRACE_EVENT(xrep_ialloc_insert,
877 	TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno,
878 		 xfs_agino_t startino, uint16_t holemask, uint8_t count,
879 		 uint8_t freecount, uint64_t freemask),
880 	TP_ARGS(mp, agno, startino, holemask, count, freecount, freemask),
881 	TP_STRUCT__entry(
882 		__field(dev_t, dev)
883 		__field(xfs_agnumber_t, agno)
884 		__field(xfs_agino_t, startino)
885 		__field(uint16_t, holemask)
886 		__field(uint8_t, count)
887 		__field(uint8_t, freecount)
888 		__field(uint64_t, freemask)
889 	),
890 	TP_fast_assign(
891 		__entry->dev = mp->m_super->s_dev;
892 		__entry->agno = agno;
893 		__entry->startino = startino;
894 		__entry->holemask = holemask;
895 		__entry->count = count;
896 		__entry->freecount = freecount;
897 		__entry->freemask = freemask;
898 	),
899 	TP_printk("dev %d:%d agno 0x%x startino 0x%x holemask 0x%x count %u freecount %u freemask 0x%llx",
900 		  MAJOR(__entry->dev), MINOR(__entry->dev),
901 		  __entry->agno,
902 		  __entry->startino,
903 		  __entry->holemask,
904 		  __entry->count,
905 		  __entry->freecount,
906 		  __entry->freemask)
907 )
908 
909 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */
910 
911 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
912 
913 #undef TRACE_INCLUDE_PATH
914 #define TRACE_INCLUDE_PATH .
915 #define TRACE_INCLUDE_FILE scrub/trace
916 #include <trace/define_trace.h>
917