xref: /openbmc/linux/fs/xfs/scrub/trace.h (revision e2c75e76)
1 /*
2  * Copyright (C) 2017 Oracle.  All Rights Reserved.
3  *
4  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5  *
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.
10  *
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.
15  *
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.
19  */
20 #undef TRACE_SYSTEM
21 #define TRACE_SYSTEM xfs_scrub
22 
23 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
24 #define _TRACE_XFS_SCRUB_TRACE_H
25 
26 #include <linux/tracepoint.h>
27 #include "xfs_bit.h"
28 
29 DECLARE_EVENT_CLASS(xfs_scrub_class,
30 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
31 		 int error),
32 	TP_ARGS(ip, sm, error),
33 	TP_STRUCT__entry(
34 		__field(dev_t, dev)
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)
41 		__field(int, error)
42 	),
43 	TP_fast_assign(
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;
52 	),
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),
55 		  __entry->ino,
56 		  __entry->type,
57 		  __entry->agno,
58 		  __entry->inum,
59 		  __entry->gen,
60 		  __entry->flags,
61 		  __entry->error)
62 )
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, \
66 		 int error), \
67 	TP_ARGS(ip, sm, error))
68 
69 DEFINE_SCRUB_EVENT(xfs_scrub_start);
70 DEFINE_SCRUB_EVENT(xfs_scrub_done);
71 DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry);
72 
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),
77 	TP_STRUCT__entry(
78 		__field(dev_t, dev)
79 		__field(unsigned int, type)
80 		__field(xfs_agnumber_t, agno)
81 		__field(xfs_agblock_t, bno)
82 		__field(int, error)
83 		__field(void *, ret_ip)
84 	),
85 	TP_fast_assign(
86 		__entry->dev = sc->mp->m_super->s_dev;
87 		__entry->type = sc->sm->sm_type;
88 		__entry->agno = agno;
89 		__entry->bno = bno;
90 		__entry->error = error;
91 		__entry->ret_ip = ret_ip;
92 	),
93 	TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pS",
94 		  MAJOR(__entry->dev), MINOR(__entry->dev),
95 		  __entry->type,
96 		  __entry->agno,
97 		  __entry->bno,
98 		  __entry->error,
99 		  __entry->ret_ip)
100 );
101 
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),
106 	TP_STRUCT__entry(
107 		__field(dev_t, dev)
108 		__field(xfs_ino_t, ino)
109 		__field(int, whichfork)
110 		__field(unsigned int, type)
111 		__field(xfs_fileoff_t, offset)
112 		__field(int, error)
113 		__field(void *, ret_ip)
114 	),
115 	TP_fast_assign(
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;
123 	),
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),
126 		  __entry->ino,
127 		  __entry->whichfork,
128 		  __entry->type,
129 		  __entry->offset,
130 		  __entry->error,
131 		  __entry->ret_ip)
132 );
133 
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),
137 	TP_STRUCT__entry(
138 		__field(dev_t, dev)
139 		__field(unsigned int, type)
140 		__field(xfs_agnumber_t, agno)
141 		__field(xfs_agblock_t, bno)
142 		__field(void *, ret_ip)
143 	),
144 	TP_fast_assign(
145 		xfs_fsblock_t	fsbno;
146 		xfs_agnumber_t	agno;
147 		xfs_agblock_t	bno;
148 
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);
152 
153 		__entry->dev = sc->mp->m_super->s_dev;
154 		__entry->type = sc->sm->sm_type;
155 		__entry->agno = agno;
156 		__entry->bno = bno;
157 		__entry->ret_ip = ret_ip;
158 	),
159 	TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pS",
160 		  MAJOR(__entry->dev), MINOR(__entry->dev),
161 		  __entry->type,
162 		  __entry->agno,
163 		  __entry->bno,
164 		  __entry->ret_ip)
165 )
166 
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, \
170 		 void *ret_ip), \
171 	TP_ARGS(sc, daddr, ret_ip))
172 
173 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error);
174 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen);
175 
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,
178 		 void *ret_ip),
179 	TP_ARGS(sc, ino, daddr, ret_ip),
180 	TP_STRUCT__entry(
181 		__field(dev_t, dev)
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)
187 	),
188 	TP_fast_assign(
189 		xfs_fsblock_t	fsbno;
190 		xfs_agnumber_t	agno;
191 		xfs_agblock_t	bno;
192 
193 		if (daddr) {
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);
197 		} else {
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));
201 		}
202 
203 		__entry->dev = sc->mp->m_super->s_dev;
204 		__entry->ino = ino;
205 		__entry->type = sc->sm->sm_type;
206 		__entry->agno = agno;
207 		__entry->bno = bno;
208 		__entry->ret_ip = ret_ip;
209 	),
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),
212 		  __entry->ino,
213 		  __entry->type,
214 		  __entry->agno,
215 		  __entry->bno,
216 		  __entry->ret_ip)
217 )
218 
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))
224 
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);
228 
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),
233 	TP_STRUCT__entry(
234 		__field(dev_t, dev)
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)
240 	),
241 	TP_fast_assign(
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;
248 	),
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),
251 		  __entry->ino,
252 		  __entry->whichfork,
253 		  __entry->type,
254 		  __entry->offset,
255 		  __entry->ret_ip)
256 );
257 
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))
263 
264 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error);
265 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning);
266 
267 TRACE_EVENT(xfs_scrub_incomplete,
268 	TP_PROTO(struct xfs_scrub_context *sc, void *ret_ip),
269 	TP_ARGS(sc, ret_ip),
270 	TP_STRUCT__entry(
271 		__field(dev_t, dev)
272 		__field(unsigned int, type)
273 		__field(void *, ret_ip)
274 	),
275 	TP_fast_assign(
276 		__entry->dev = sc->mp->m_super->s_dev;
277 		__entry->type = sc->sm->sm_type;
278 		__entry->ret_ip = ret_ip;
279 	),
280 	TP_printk("dev %d:%d type %u ret_ip %pS",
281 		  MAJOR(__entry->dev), MINOR(__entry->dev),
282 		  __entry->type,
283 		  __entry->ret_ip)
284 );
285 
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),
290 	TP_STRUCT__entry(
291 		__field(dev_t, dev)
292 		__field(unsigned int, type)
293 		__field(xfs_btnum_t, btnum)
294 		__field(int, level)
295 		__field(xfs_agnumber_t, agno)
296 		__field(xfs_agblock_t, bno)
297 		__field(int, ptr);
298 		__field(int, error)
299 		__field(void *, ret_ip)
300 	),
301 	TP_fast_assign(
302 		xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
303 
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;
313 	),
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),
316 		  __entry->type,
317 		  __entry->btnum,
318 		  __entry->level,
319 		  __entry->ptr,
320 		  __entry->agno,
321 		  __entry->bno,
322 		  __entry->error,
323 		  __entry->ret_ip)
324 );
325 
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),
330 	TP_STRUCT__entry(
331 		__field(dev_t, dev)
332 		__field(xfs_ino_t, ino)
333 		__field(int, whichfork)
334 		__field(unsigned int, type)
335 		__field(xfs_btnum_t, btnum)
336 		__field(int, level)
337 		__field(int, ptr)
338 		__field(xfs_agnumber_t, agno)
339 		__field(xfs_agblock_t, bno)
340 		__field(int, error)
341 		__field(void *, ret_ip)
342 	),
343 	TP_fast_assign(
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;
356 	),
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),
359 		  __entry->ino,
360 		  __entry->whichfork,
361 		  __entry->type,
362 		  __entry->btnum,
363 		  __entry->level,
364 		  __entry->ptr,
365 		  __entry->agno,
366 		  __entry->bno,
367 		  __entry->error,
368 		  __entry->ret_ip)
369 );
370 
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),
375 	TP_STRUCT__entry(
376 		__field(dev_t, dev)
377 		__field(unsigned int, type)
378 		__field(xfs_btnum_t, btnum)
379 		__field(int, level)
380 		__field(xfs_agnumber_t, agno)
381 		__field(xfs_agblock_t, bno)
382 		__field(int, ptr);
383 		__field(void *, ret_ip)
384 	),
385 	TP_fast_assign(
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;
395 	),
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),
398 		  __entry->type,
399 		  __entry->btnum,
400 		  __entry->level,
401 		  __entry->ptr,
402 		  __entry->agno,
403 		  __entry->bno,
404 		  __entry->ret_ip)
405 );
406 
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),
411 	TP_STRUCT__entry(
412 		__field(dev_t, dev)
413 		__field(xfs_ino_t, ino)
414 		__field(int, whichfork)
415 		__field(unsigned int, type)
416 		__field(xfs_btnum_t, btnum)
417 		__field(int, level)
418 		__field(xfs_agnumber_t, agno)
419 		__field(xfs_agblock_t, bno)
420 		__field(int, ptr);
421 		__field(void *, ret_ip)
422 	),
423 	TP_fast_assign(
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;
435 	),
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),
438 		  __entry->ino,
439 		  __entry->whichfork,
440 		  __entry->type,
441 		  __entry->btnum,
442 		  __entry->level,
443 		  __entry->ptr,
444 		  __entry->agno,
445 		  __entry->bno,
446 		  __entry->ret_ip)
447 );
448 
449 DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class,
450 	TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
451 		 int level),
452 	TP_ARGS(sc, cur, level),
453 	TP_STRUCT__entry(
454 		__field(dev_t, dev)
455 		__field(int, type)
456 		__field(xfs_btnum_t, btnum)
457 		__field(xfs_agnumber_t, agno)
458 		__field(xfs_agblock_t, bno)
459 		__field(int, level)
460 		__field(int, nlevels)
461 		__field(int, ptr)
462 	),
463 	TP_fast_assign(
464 		xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
465 
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];
474 	),
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),
477 		  __entry->type,
478 		  __entry->btnum,
479 		  __entry->agno,
480 		  __entry->bno,
481 		  __entry->level,
482 		  __entry->nlevels,
483 		  __entry->ptr)
484 )
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, \
488 		 int level), \
489 	TP_ARGS(sc, cur, level))
490 
491 DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec);
492 DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key);
493 
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),
497 	TP_STRUCT__entry(
498 		__field(dev_t, dev)
499 		__field(int, type)
500 		__field(int, error)
501 		__field(void *, ret_ip)
502 	),
503 	TP_fast_assign(
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;
508 	),
509 	TP_printk("dev %d:%d type %u xref error %d ret_ip %pF",
510 		  MAJOR(__entry->dev), MINOR(__entry->dev),
511 		  __entry->type,
512 		  __entry->error,
513 		  __entry->ret_ip)
514 );
515 
516 #endif /* _TRACE_XFS_SCRUB_TRACE_H */
517 
518 #undef TRACE_INCLUDE_PATH
519 #define TRACE_INCLUDE_PATH .
520 #define TRACE_INCLUDE_FILE scrub/trace
521 #include <trace/define_trace.h>
522