xref: /openbmc/linux/fs/xfs/scrub/trace.h (revision 4700d22980d459f6c20012a6cb9767a314ab1065)
136fd6e86SDarrick J. Wong /*
236fd6e86SDarrick J. Wong  * Copyright (C) 2017 Oracle.  All Rights Reserved.
336fd6e86SDarrick J. Wong  *
436fd6e86SDarrick J. Wong  * Author: Darrick J. Wong <darrick.wong@oracle.com>
536fd6e86SDarrick J. Wong  *
636fd6e86SDarrick J. Wong  * This program is free software; you can redistribute it and/or
736fd6e86SDarrick J. Wong  * modify it under the terms of the GNU General Public License
836fd6e86SDarrick J. Wong  * as published by the Free Software Foundation; either version 2
936fd6e86SDarrick J. Wong  * of the License, or (at your option) any later version.
1036fd6e86SDarrick J. Wong  *
1136fd6e86SDarrick J. Wong  * This program is distributed in the hope that it would be useful,
1236fd6e86SDarrick J. Wong  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1336fd6e86SDarrick J. Wong  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1436fd6e86SDarrick J. Wong  * GNU General Public License for more details.
1536fd6e86SDarrick J. Wong  *
1636fd6e86SDarrick J. Wong  * You should have received a copy of the GNU General Public License
1736fd6e86SDarrick J. Wong  * along with this program; if not, write the Free Software Foundation,
1836fd6e86SDarrick J. Wong  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
1936fd6e86SDarrick J. Wong  */
2036fd6e86SDarrick J. Wong #undef TRACE_SYSTEM
2136fd6e86SDarrick J. Wong #define TRACE_SYSTEM xfs_scrub
2236fd6e86SDarrick J. Wong 
2336fd6e86SDarrick J. Wong #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
2436fd6e86SDarrick J. Wong #define _TRACE_XFS_SCRUB_TRACE_H
2536fd6e86SDarrick J. Wong 
2636fd6e86SDarrick J. Wong #include <linux/tracepoint.h>
27*4700d229SDarrick J. Wong #include "xfs_bit.h"
2836fd6e86SDarrick J. Wong 
29a5637186SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_class,
30a5637186SDarrick J. Wong 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
31a5637186SDarrick J. Wong 		 int error),
32a5637186SDarrick J. Wong 	TP_ARGS(ip, sm, error),
33a5637186SDarrick J. Wong 	TP_STRUCT__entry(
34a5637186SDarrick J. Wong 		__field(dev_t, dev)
35a5637186SDarrick J. Wong 		__field(xfs_ino_t, ino)
36a5637186SDarrick J. Wong 		__field(unsigned int, type)
37a5637186SDarrick J. Wong 		__field(xfs_agnumber_t, agno)
38a5637186SDarrick J. Wong 		__field(xfs_ino_t, inum)
39a5637186SDarrick J. Wong 		__field(unsigned int, gen)
40a5637186SDarrick J. Wong 		__field(unsigned int, flags)
41a5637186SDarrick J. Wong 		__field(int, error)
42a5637186SDarrick J. Wong 	),
43a5637186SDarrick J. Wong 	TP_fast_assign(
44a5637186SDarrick J. Wong 		__entry->dev = ip->i_mount->m_super->s_dev;
45a5637186SDarrick J. Wong 		__entry->ino = ip->i_ino;
46a5637186SDarrick J. Wong 		__entry->type = sm->sm_type;
47a5637186SDarrick J. Wong 		__entry->agno = sm->sm_agno;
48a5637186SDarrick J. Wong 		__entry->inum = sm->sm_ino;
49a5637186SDarrick J. Wong 		__entry->gen = sm->sm_gen;
50a5637186SDarrick J. Wong 		__entry->flags = sm->sm_flags;
51a5637186SDarrick J. Wong 		__entry->error = error;
52a5637186SDarrick J. Wong 	),
53a5637186SDarrick J. Wong 	TP_printk("dev %d:%d ino %llu type %u agno %u inum %llu gen %u flags 0x%x error %d",
54a5637186SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
55a5637186SDarrick J. Wong 		  __entry->ino,
56a5637186SDarrick J. Wong 		  __entry->type,
57a5637186SDarrick J. Wong 		  __entry->agno,
58a5637186SDarrick J. Wong 		  __entry->inum,
59a5637186SDarrick J. Wong 		  __entry->gen,
60a5637186SDarrick J. Wong 		  __entry->flags,
61a5637186SDarrick J. Wong 		  __entry->error)
62a5637186SDarrick J. Wong )
63a5637186SDarrick J. Wong #define DEFINE_SCRUB_EVENT(name) \
64a5637186SDarrick J. Wong DEFINE_EVENT(xfs_scrub_class, name, \
65a5637186SDarrick J. Wong 	TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
66a5637186SDarrick J. Wong 		 int error), \
67a5637186SDarrick J. Wong 	TP_ARGS(ip, sm, error))
68a5637186SDarrick J. Wong 
69a5637186SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_start);
70a5637186SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_done);
71*4700d229SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry);
72*4700d229SDarrick J. Wong 
73*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_op_error,
74*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, xfs_agnumber_t agno,
75*4700d229SDarrick J. Wong 		 xfs_agblock_t bno, int error, void *ret_ip),
76*4700d229SDarrick J. Wong 	TP_ARGS(sc, agno, bno, error, ret_ip),
77*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
78*4700d229SDarrick J. Wong 		__field(dev_t, dev)
79*4700d229SDarrick J. Wong 		__field(unsigned int, type)
80*4700d229SDarrick J. Wong 		__field(xfs_agnumber_t, agno)
81*4700d229SDarrick J. Wong 		__field(xfs_agblock_t, bno)
82*4700d229SDarrick J. Wong 		__field(int, error)
83*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
84*4700d229SDarrick J. Wong 	),
85*4700d229SDarrick J. Wong 	TP_fast_assign(
86*4700d229SDarrick J. Wong 		__entry->dev = sc->mp->m_super->s_dev;
87*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
88*4700d229SDarrick J. Wong 		__entry->agno = agno;
89*4700d229SDarrick J. Wong 		__entry->bno = bno;
90*4700d229SDarrick J. Wong 		__entry->error = error;
91*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
92*4700d229SDarrick J. Wong 	),
93*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pF",
94*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
95*4700d229SDarrick J. Wong 		  __entry->type,
96*4700d229SDarrick J. Wong 		  __entry->agno,
97*4700d229SDarrick J. Wong 		  __entry->bno,
98*4700d229SDarrick J. Wong 		  __entry->error,
99*4700d229SDarrick J. Wong 		  __entry->ret_ip)
100*4700d229SDarrick J. Wong );
101*4700d229SDarrick J. Wong 
102*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_file_op_error,
103*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
104*4700d229SDarrick J. Wong 		 xfs_fileoff_t offset, int error, void *ret_ip),
105*4700d229SDarrick J. Wong 	TP_ARGS(sc, whichfork, offset, error, ret_ip),
106*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
107*4700d229SDarrick J. Wong 		__field(dev_t, dev)
108*4700d229SDarrick J. Wong 		__field(xfs_ino_t, ino)
109*4700d229SDarrick J. Wong 		__field(int, whichfork)
110*4700d229SDarrick J. Wong 		__field(unsigned int, type)
111*4700d229SDarrick J. Wong 		__field(xfs_fileoff_t, offset)
112*4700d229SDarrick J. Wong 		__field(int, error)
113*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
114*4700d229SDarrick J. Wong 	),
115*4700d229SDarrick J. Wong 	TP_fast_assign(
116*4700d229SDarrick J. Wong 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
117*4700d229SDarrick J. Wong 		__entry->ino = sc->ip->i_ino;
118*4700d229SDarrick J. Wong 		__entry->whichfork = whichfork;
119*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
120*4700d229SDarrick J. Wong 		__entry->offset = offset;
121*4700d229SDarrick J. Wong 		__entry->error = error;
122*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
123*4700d229SDarrick J. Wong 	),
124*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu error %d ret_ip %pF",
125*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
126*4700d229SDarrick J. Wong 		  __entry->ino,
127*4700d229SDarrick J. Wong 		  __entry->whichfork,
128*4700d229SDarrick J. Wong 		  __entry->type,
129*4700d229SDarrick J. Wong 		  __entry->offset,
130*4700d229SDarrick J. Wong 		  __entry->error,
131*4700d229SDarrick J. Wong 		  __entry->ret_ip)
132*4700d229SDarrick J. Wong );
133*4700d229SDarrick J. Wong 
134*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_block_error_class,
135*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, void *ret_ip),
136*4700d229SDarrick J. Wong 	TP_ARGS(sc, daddr, ret_ip),
137*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
138*4700d229SDarrick J. Wong 		__field(dev_t, dev)
139*4700d229SDarrick J. Wong 		__field(unsigned int, type)
140*4700d229SDarrick J. Wong 		__field(xfs_agnumber_t, agno)
141*4700d229SDarrick J. Wong 		__field(xfs_agblock_t, bno)
142*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
143*4700d229SDarrick J. Wong 	),
144*4700d229SDarrick J. Wong 	TP_fast_assign(
145*4700d229SDarrick J. Wong 		xfs_fsblock_t	fsbno;
146*4700d229SDarrick J. Wong 		xfs_agnumber_t	agno;
147*4700d229SDarrick J. Wong 		xfs_agblock_t	bno;
148*4700d229SDarrick J. Wong 
149*4700d229SDarrick J. Wong 		fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
150*4700d229SDarrick J. Wong 		agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
151*4700d229SDarrick J. Wong 		bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
152*4700d229SDarrick J. Wong 
153*4700d229SDarrick J. Wong 		__entry->dev = sc->mp->m_super->s_dev;
154*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
155*4700d229SDarrick J. Wong 		__entry->agno = agno;
156*4700d229SDarrick J. Wong 		__entry->bno = bno;
157*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
158*4700d229SDarrick J. Wong 	),
159*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pF",
160*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
161*4700d229SDarrick J. Wong 		  __entry->type,
162*4700d229SDarrick J. Wong 		  __entry->agno,
163*4700d229SDarrick J. Wong 		  __entry->bno,
164*4700d229SDarrick J. Wong 		  __entry->ret_ip)
165*4700d229SDarrick J. Wong )
166*4700d229SDarrick J. Wong 
167*4700d229SDarrick J. Wong #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
168*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_block_error_class, name, \
169*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, \
170*4700d229SDarrick J. Wong 		 void *ret_ip), \
171*4700d229SDarrick J. Wong 	TP_ARGS(sc, daddr, ret_ip))
172*4700d229SDarrick J. Wong 
173*4700d229SDarrick J. Wong DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error);
174*4700d229SDarrick J. Wong DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen);
175*4700d229SDarrick J. Wong 
176*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_ino_error_class,
177*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, xfs_daddr_t daddr,
178*4700d229SDarrick J. Wong 		 void *ret_ip),
179*4700d229SDarrick J. Wong 	TP_ARGS(sc, ino, daddr, ret_ip),
180*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
181*4700d229SDarrick J. Wong 		__field(dev_t, dev)
182*4700d229SDarrick J. Wong 		__field(xfs_ino_t, ino)
183*4700d229SDarrick J. Wong 		__field(unsigned int, type)
184*4700d229SDarrick J. Wong 		__field(xfs_agnumber_t, agno)
185*4700d229SDarrick J. Wong 		__field(xfs_agblock_t, bno)
186*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
187*4700d229SDarrick J. Wong 	),
188*4700d229SDarrick J. Wong 	TP_fast_assign(
189*4700d229SDarrick J. Wong 		xfs_fsblock_t	fsbno;
190*4700d229SDarrick J. Wong 		xfs_agnumber_t	agno;
191*4700d229SDarrick J. Wong 		xfs_agblock_t	bno;
192*4700d229SDarrick J. Wong 
193*4700d229SDarrick J. Wong 		if (daddr) {
194*4700d229SDarrick J. Wong 			fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
195*4700d229SDarrick J. Wong 			agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
196*4700d229SDarrick J. Wong 			bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
197*4700d229SDarrick J. Wong 		} else {
198*4700d229SDarrick J. Wong 			agno = XFS_INO_TO_AGNO(sc->mp, ino);
199*4700d229SDarrick J. Wong 			bno = XFS_AGINO_TO_AGBNO(sc->mp,
200*4700d229SDarrick J. Wong 					XFS_INO_TO_AGINO(sc->mp, ino));
201*4700d229SDarrick J. Wong 		}
202*4700d229SDarrick J. Wong 
203*4700d229SDarrick J. Wong 		__entry->dev = sc->mp->m_super->s_dev;
204*4700d229SDarrick J. Wong 		__entry->ino = ino;
205*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
206*4700d229SDarrick J. Wong 		__entry->agno = agno;
207*4700d229SDarrick J. Wong 		__entry->bno = bno;
208*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
209*4700d229SDarrick J. Wong 	),
210*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d ino %llu type %u agno %u agbno %u ret_ip %pF",
211*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
212*4700d229SDarrick J. Wong 		  __entry->ino,
213*4700d229SDarrick J. Wong 		  __entry->type,
214*4700d229SDarrick J. Wong 		  __entry->agno,
215*4700d229SDarrick J. Wong 		  __entry->bno,
216*4700d229SDarrick J. Wong 		  __entry->ret_ip)
217*4700d229SDarrick J. Wong )
218*4700d229SDarrick J. Wong 
219*4700d229SDarrick J. Wong #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
220*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_ino_error_class, name, \
221*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, \
222*4700d229SDarrick J. Wong 		 xfs_daddr_t daddr, void *ret_ip), \
223*4700d229SDarrick J. Wong 	TP_ARGS(sc, ino, daddr, ret_ip))
224*4700d229SDarrick J. Wong 
225*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_error);
226*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_preen);
227*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_warning);
228*4700d229SDarrick J. Wong 
229*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_fblock_error_class,
230*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
231*4700d229SDarrick J. Wong 		 xfs_fileoff_t offset, void *ret_ip),
232*4700d229SDarrick J. Wong 	TP_ARGS(sc, whichfork, offset, ret_ip),
233*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
234*4700d229SDarrick J. Wong 		__field(dev_t, dev)
235*4700d229SDarrick J. Wong 		__field(xfs_ino_t, ino)
236*4700d229SDarrick J. Wong 		__field(int, whichfork)
237*4700d229SDarrick J. Wong 		__field(unsigned int, type)
238*4700d229SDarrick J. Wong 		__field(xfs_fileoff_t, offset)
239*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
240*4700d229SDarrick J. Wong 	),
241*4700d229SDarrick J. Wong 	TP_fast_assign(
242*4700d229SDarrick J. Wong 		__entry->dev = sc->ip->i_mount->m_super->s_dev;
243*4700d229SDarrick J. Wong 		__entry->ino = sc->ip->i_ino;
244*4700d229SDarrick J. Wong 		__entry->whichfork = whichfork;
245*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
246*4700d229SDarrick J. Wong 		__entry->offset = offset;
247*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
248*4700d229SDarrick J. Wong 	),
249*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu ret_ip %pF",
250*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
251*4700d229SDarrick J. Wong 		  __entry->ino,
252*4700d229SDarrick J. Wong 		  __entry->whichfork,
253*4700d229SDarrick J. Wong 		  __entry->type,
254*4700d229SDarrick J. Wong 		  __entry->offset,
255*4700d229SDarrick J. Wong 		  __entry->ret_ip)
256*4700d229SDarrick J. Wong );
257*4700d229SDarrick J. Wong 
258*4700d229SDarrick J. Wong #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
259*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_fblock_error_class, name, \
260*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, int whichfork, \
261*4700d229SDarrick J. Wong 		 xfs_fileoff_t offset, void *ret_ip), \
262*4700d229SDarrick J. Wong 	TP_ARGS(sc, whichfork, offset, ret_ip))
263*4700d229SDarrick J. Wong 
264*4700d229SDarrick J. Wong DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error);
265*4700d229SDarrick J. Wong DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning);
266*4700d229SDarrick J. Wong 
267*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_incomplete,
268*4700d229SDarrick J. Wong 	TP_PROTO(struct xfs_scrub_context *sc, void *ret_ip),
269*4700d229SDarrick J. Wong 	TP_ARGS(sc, ret_ip),
270*4700d229SDarrick J. Wong 	TP_STRUCT__entry(
271*4700d229SDarrick J. Wong 		__field(dev_t, dev)
272*4700d229SDarrick J. Wong 		__field(unsigned int, type)
273*4700d229SDarrick J. Wong 		__field(void *, ret_ip)
274*4700d229SDarrick J. Wong 	),
275*4700d229SDarrick J. Wong 	TP_fast_assign(
276*4700d229SDarrick J. Wong 		__entry->dev = sc->mp->m_super->s_dev;
277*4700d229SDarrick J. Wong 		__entry->type = sc->sm->sm_type;
278*4700d229SDarrick J. Wong 		__entry->ret_ip = ret_ip;
279*4700d229SDarrick J. Wong 	),
280*4700d229SDarrick J. Wong 	TP_printk("dev %d:%d type %u ret_ip %pF",
281*4700d229SDarrick J. Wong 		  MAJOR(__entry->dev), MINOR(__entry->dev),
282*4700d229SDarrick J. Wong 		  __entry->type,
283*4700d229SDarrick J. Wong 		  __entry->ret_ip)
284*4700d229SDarrick J. Wong );
285a5637186SDarrick J. Wong 
28636fd6e86SDarrick J. Wong #endif /* _TRACE_XFS_SCRUB_TRACE_H */
28736fd6e86SDarrick J. Wong 
28836fd6e86SDarrick J. Wong #undef TRACE_INCLUDE_PATH
28936fd6e86SDarrick J. Wong #define TRACE_INCLUDE_PATH .
29036fd6e86SDarrick J. Wong #define TRACE_INCLUDE_FILE scrub/trace
29136fd6e86SDarrick J. Wong #include <trace/define_trace.h>
292