2 * Copyright (C) 2017 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it would be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
21 #define TRACE_SYSTEM xfs_scrub
23 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
24 #define _TRACE_XFS_SCRUB_TRACE_H
26 #include <linux/tracepoint.h>
29 DECLARE_EVENT_CLASS(xfs_scrub_class
,
30 TP_PROTO(struct xfs_inode
*ip
, struct xfs_scrub_metadata
*sm
,
32 TP_ARGS(ip
, sm
, error
),
35 __field(xfs_ino_t
, ino
)
36 __field(unsigned int, type
)
37 __field(xfs_agnumber_t
, agno
)
38 __field(xfs_ino_t
, inum
)
39 __field(unsigned int, gen
)
40 __field(unsigned int, flags
)
44 __entry
->dev
= ip
->i_mount
->m_super
->s_dev
;
45 __entry
->ino
= ip
->i_ino
;
46 __entry
->type
= sm
->sm_type
;
47 __entry
->agno
= sm
->sm_agno
;
48 __entry
->inum
= sm
->sm_ino
;
49 __entry
->gen
= sm
->sm_gen
;
50 __entry
->flags
= sm
->sm_flags
;
51 __entry
->error
= error
;
53 TP_printk("dev %d:%d ino 0x%llx type %u agno %u inum %llu gen %u flags 0x%x error %d",
54 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
63 #define DEFINE_SCRUB_EVENT(name) \
64 DEFINE_EVENT(xfs_scrub_class, name, \
65 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
67 TP_ARGS(ip, sm, error))
69 DEFINE_SCRUB_EVENT(xfs_scrub_start
);
70 DEFINE_SCRUB_EVENT(xfs_scrub_done
);
71 DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry
);
73 TRACE_EVENT(xfs_scrub_op_error
,
74 TP_PROTO(struct xfs_scrub_context
*sc
, xfs_agnumber_t agno
,
75 xfs_agblock_t bno
, int error
, void *ret_ip
),
76 TP_ARGS(sc
, agno
, bno
, error
, ret_ip
),
79 __field(unsigned int, type
)
80 __field(xfs_agnumber_t
, agno
)
81 __field(xfs_agblock_t
, bno
)
83 __field(void *, ret_ip
)
86 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
87 __entry
->type
= sc
->sm
->sm_type
;
90 __entry
->error
= error
;
91 __entry
->ret_ip
= ret_ip
;
93 TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pS",
94 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
102 TRACE_EVENT(xfs_scrub_file_op_error
,
103 TP_PROTO(struct xfs_scrub_context
*sc
, int whichfork
,
104 xfs_fileoff_t offset
, int error
, void *ret_ip
),
105 TP_ARGS(sc
, whichfork
, offset
, error
, ret_ip
),
108 __field(xfs_ino_t
, ino
)
109 __field(int, whichfork
)
110 __field(unsigned int, type
)
111 __field(xfs_fileoff_t
, offset
)
113 __field(void *, ret_ip
)
116 __entry
->dev
= sc
->ip
->i_mount
->m_super
->s_dev
;
117 __entry
->ino
= sc
->ip
->i_ino
;
118 __entry
->whichfork
= whichfork
;
119 __entry
->type
= sc
->sm
->sm_type
;
120 __entry
->offset
= offset
;
121 __entry
->error
= error
;
122 __entry
->ret_ip
= ret_ip
;
124 TP_printk("dev %d:%d ino 0x%llx fork %d type %u offset %llu error %d ret_ip %pS",
125 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
134 DECLARE_EVENT_CLASS(xfs_scrub_block_error_class
,
135 TP_PROTO(struct xfs_scrub_context
*sc
, xfs_daddr_t daddr
, void *ret_ip
),
136 TP_ARGS(sc
, daddr
, ret_ip
),
139 __field(unsigned int, type
)
140 __field(xfs_agnumber_t
, agno
)
141 __field(xfs_agblock_t
, bno
)
142 __field(void *, ret_ip
)
149 fsbno
= XFS_DADDR_TO_FSB(sc
->mp
, daddr
);
150 agno
= XFS_FSB_TO_AGNO(sc
->mp
, fsbno
);
151 bno
= XFS_FSB_TO_AGBNO(sc
->mp
, fsbno
);
153 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
154 __entry
->type
= sc
->sm
->sm_type
;
155 __entry
->agno
= agno
;
157 __entry
->ret_ip
= ret_ip
;
159 TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pS",
160 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
167 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
168 DEFINE_EVENT(xfs_scrub_block_error_class, name, \
169 TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, \
171 TP_ARGS(sc, daddr, ret_ip))
173 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error
);
174 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen
);
176 DECLARE_EVENT_CLASS(xfs_scrub_ino_error_class
,
177 TP_PROTO(struct xfs_scrub_context
*sc
, xfs_ino_t ino
, xfs_daddr_t daddr
,
179 TP_ARGS(sc
, ino
, daddr
, ret_ip
),
182 __field(xfs_ino_t
, ino
)
183 __field(unsigned int, type
)
184 __field(xfs_agnumber_t
, agno
)
185 __field(xfs_agblock_t
, bno
)
186 __field(void *, ret_ip
)
194 fsbno
= XFS_DADDR_TO_FSB(sc
->mp
, daddr
);
195 agno
= XFS_FSB_TO_AGNO(sc
->mp
, fsbno
);
196 bno
= XFS_FSB_TO_AGBNO(sc
->mp
, fsbno
);
198 agno
= XFS_INO_TO_AGNO(sc
->mp
, ino
);
199 bno
= XFS_AGINO_TO_AGBNO(sc
->mp
,
200 XFS_INO_TO_AGINO(sc
->mp
, ino
));
203 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
205 __entry
->type
= sc
->sm
->sm_type
;
206 __entry
->agno
= agno
;
208 __entry
->ret_ip
= ret_ip
;
210 TP_printk("dev %d:%d ino 0x%llx type %u agno %u agbno %u ret_ip %pS",
211 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
219 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
220 DEFINE_EVENT(xfs_scrub_ino_error_class, name, \
221 TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, \
222 xfs_daddr_t daddr, void *ret_ip), \
223 TP_ARGS(sc, ino, daddr, ret_ip))
225 DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_error
);
226 DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_preen
);
227 DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_warning
);
229 DECLARE_EVENT_CLASS(xfs_scrub_fblock_error_class
,
230 TP_PROTO(struct xfs_scrub_context
*sc
, int whichfork
,
231 xfs_fileoff_t offset
, void *ret_ip
),
232 TP_ARGS(sc
, whichfork
, offset
, ret_ip
),
235 __field(xfs_ino_t
, ino
)
236 __field(int, whichfork
)
237 __field(unsigned int, type
)
238 __field(xfs_fileoff_t
, offset
)
239 __field(void *, ret_ip
)
242 __entry
->dev
= sc
->ip
->i_mount
->m_super
->s_dev
;
243 __entry
->ino
= sc
->ip
->i_ino
;
244 __entry
->whichfork
= whichfork
;
245 __entry
->type
= sc
->sm
->sm_type
;
246 __entry
->offset
= offset
;
247 __entry
->ret_ip
= ret_ip
;
249 TP_printk("dev %d:%d ino 0x%llx fork %d type %u offset %llu ret_ip %pS",
250 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
258 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
259 DEFINE_EVENT(xfs_scrub_fblock_error_class, name, \
260 TP_PROTO(struct xfs_scrub_context *sc, int whichfork, \
261 xfs_fileoff_t offset, void *ret_ip), \
262 TP_ARGS(sc, whichfork, offset, ret_ip))
264 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error
);
265 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning
);
267 TRACE_EVENT(xfs_scrub_incomplete
,
268 TP_PROTO(struct xfs_scrub_context
*sc
, void *ret_ip
),
272 __field(unsigned int, type
)
273 __field(void *, ret_ip
)
276 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
277 __entry
->type
= sc
->sm
->sm_type
;
278 __entry
->ret_ip
= ret_ip
;
280 TP_printk("dev %d:%d type %u ret_ip %pS",
281 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
286 TRACE_EVENT(xfs_scrub_btree_op_error
,
287 TP_PROTO(struct xfs_scrub_context
*sc
, struct xfs_btree_cur
*cur
,
288 int level
, int error
, void *ret_ip
),
289 TP_ARGS(sc
, cur
, level
, error
, ret_ip
),
292 __field(unsigned int, type
)
293 __field(xfs_btnum_t
, btnum
)
295 __field(xfs_agnumber_t
, agno
)
296 __field(xfs_agblock_t
, bno
)
299 __field(void *, ret_ip
)
302 xfs_fsblock_t fsbno
= xfs_scrub_btree_cur_fsbno(cur
, level
);
304 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
305 __entry
->type
= sc
->sm
->sm_type
;
306 __entry
->btnum
= cur
->bc_btnum
;
307 __entry
->level
= level
;
308 __entry
->agno
= XFS_FSB_TO_AGNO(cur
->bc_mp
, fsbno
);
309 __entry
->bno
= XFS_FSB_TO_AGBNO(cur
->bc_mp
, fsbno
);
310 __entry
->ptr
= cur
->bc_ptrs
[level
];
311 __entry
->error
= error
;
312 __entry
->ret_ip
= ret_ip
;
314 TP_printk("dev %d:%d type %u btnum %d level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
315 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
326 TRACE_EVENT(xfs_scrub_ifork_btree_op_error
,
327 TP_PROTO(struct xfs_scrub_context
*sc
, struct xfs_btree_cur
*cur
,
328 int level
, int error
, void *ret_ip
),
329 TP_ARGS(sc
, cur
, level
, error
, ret_ip
),
332 __field(xfs_ino_t
, ino
)
333 __field(int, whichfork
)
334 __field(unsigned int, type
)
335 __field(xfs_btnum_t
, btnum
)
338 __field(xfs_agnumber_t
, agno
)
339 __field(xfs_agblock_t
, bno
)
341 __field(void *, ret_ip
)
344 xfs_fsblock_t fsbno
= xfs_scrub_btree_cur_fsbno(cur
, level
);
345 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
346 __entry
->ino
= sc
->ip
->i_ino
;
347 __entry
->whichfork
= cur
->bc_private
.b
.whichfork
;
348 __entry
->type
= sc
->sm
->sm_type
;
349 __entry
->btnum
= cur
->bc_btnum
;
350 __entry
->level
= level
;
351 __entry
->ptr
= cur
->bc_ptrs
[level
];
352 __entry
->agno
= XFS_FSB_TO_AGNO(cur
->bc_mp
, fsbno
);
353 __entry
->bno
= XFS_FSB_TO_AGBNO(cur
->bc_mp
, fsbno
);
354 __entry
->error
= error
;
355 __entry
->ret_ip
= ret_ip
;
357 TP_printk("dev %d:%d ino 0x%llx fork %d type %u btnum %d level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
358 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
371 TRACE_EVENT(xfs_scrub_btree_error
,
372 TP_PROTO(struct xfs_scrub_context
*sc
, struct xfs_btree_cur
*cur
,
373 int level
, void *ret_ip
),
374 TP_ARGS(sc
, cur
, level
, ret_ip
),
377 __field(unsigned int, type
)
378 __field(xfs_btnum_t
, btnum
)
380 __field(xfs_agnumber_t
, agno
)
381 __field(xfs_agblock_t
, bno
)
383 __field(void *, ret_ip
)
386 xfs_fsblock_t fsbno
= xfs_scrub_btree_cur_fsbno(cur
, level
);
387 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
388 __entry
->type
= sc
->sm
->sm_type
;
389 __entry
->btnum
= cur
->bc_btnum
;
390 __entry
->level
= level
;
391 __entry
->agno
= XFS_FSB_TO_AGNO(cur
->bc_mp
, fsbno
);
392 __entry
->bno
= XFS_FSB_TO_AGBNO(cur
->bc_mp
, fsbno
);
393 __entry
->ptr
= cur
->bc_ptrs
[level
];
394 __entry
->ret_ip
= ret_ip
;
396 TP_printk("dev %d:%d type %u btnum %d level %d ptr %d agno %u agbno %u ret_ip %pS",
397 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
407 TRACE_EVENT(xfs_scrub_ifork_btree_error
,
408 TP_PROTO(struct xfs_scrub_context
*sc
, struct xfs_btree_cur
*cur
,
409 int level
, void *ret_ip
),
410 TP_ARGS(sc
, cur
, level
, ret_ip
),
413 __field(xfs_ino_t
, ino
)
414 __field(int, whichfork
)
415 __field(unsigned int, type
)
416 __field(xfs_btnum_t
, btnum
)
418 __field(xfs_agnumber_t
, agno
)
419 __field(xfs_agblock_t
, bno
)
421 __field(void *, ret_ip
)
424 xfs_fsblock_t fsbno
= xfs_scrub_btree_cur_fsbno(cur
, level
);
425 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
426 __entry
->ino
= sc
->ip
->i_ino
;
427 __entry
->whichfork
= cur
->bc_private
.b
.whichfork
;
428 __entry
->type
= sc
->sm
->sm_type
;
429 __entry
->btnum
= cur
->bc_btnum
;
430 __entry
->level
= level
;
431 __entry
->agno
= XFS_FSB_TO_AGNO(cur
->bc_mp
, fsbno
);
432 __entry
->bno
= XFS_FSB_TO_AGBNO(cur
->bc_mp
, fsbno
);
433 __entry
->ptr
= cur
->bc_ptrs
[level
];
434 __entry
->ret_ip
= ret_ip
;
436 TP_printk("dev %d:%d ino 0x%llx fork %d type %u btnum %d level %d ptr %d agno %u agbno %u ret_ip %pS",
437 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
449 DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class
,
450 TP_PROTO(struct xfs_scrub_context
*sc
, struct xfs_btree_cur
*cur
,
452 TP_ARGS(sc
, cur
, level
),
456 __field(xfs_btnum_t
, btnum
)
457 __field(xfs_agnumber_t
, agno
)
458 __field(xfs_agblock_t
, bno
)
460 __field(int, nlevels
)
464 xfs_fsblock_t fsbno
= xfs_scrub_btree_cur_fsbno(cur
, level
);
466 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
467 __entry
->type
= sc
->sm
->sm_type
;
468 __entry
->btnum
= cur
->bc_btnum
;
469 __entry
->agno
= XFS_FSB_TO_AGNO(cur
->bc_mp
, fsbno
);
470 __entry
->bno
= XFS_FSB_TO_AGBNO(cur
->bc_mp
, fsbno
);
471 __entry
->level
= level
;
472 __entry
->nlevels
= cur
->bc_nlevels
;
473 __entry
->ptr
= cur
->bc_ptrs
[level
];
475 TP_printk("dev %d:%d type %u btnum %d agno %u agbno %u level %d nlevels %d ptr %d",
476 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
485 #define DEFINE_SCRUB_SBTREE_EVENT(name) \
486 DEFINE_EVENT(xfs_scrub_sbtree_class, name, \
487 TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur, \
489 TP_ARGS(sc, cur, level))
491 DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec
);
492 DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key
);
494 TRACE_EVENT(xfs_scrub_xref_error
,
495 TP_PROTO(struct xfs_scrub_context
*sc
, int error
, void *ret_ip
),
496 TP_ARGS(sc
, error
, ret_ip
),
501 __field(void *, ret_ip
)
504 __entry
->dev
= sc
->mp
->m_super
->s_dev
;
505 __entry
->type
= sc
->sm
->sm_type
;
506 __entry
->error
= error
;
507 __entry
->ret_ip
= ret_ip
;
509 TP_printk("dev %d:%d type %u xref error %d ret_ip %pF",
510 MAJOR(__entry
->dev
), MINOR(__entry
->dev
),
516 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
518 #undef TRACE_INCLUDE_PATH
519 #define TRACE_INCLUDE_PATH .
520 #define TRACE_INCLUDE_FILE scrub/trace
521 #include <trace/define_trace.h>