1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* CacheFiles tracepoints
3  *
4  * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 #undef TRACE_SYSTEM
8 #define TRACE_SYSTEM cachefiles
9 
10 #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_CACHEFILES_H
12 
13 #include <linux/tracepoint.h>
14 
15 /*
16  * Define enums for tracing information.
17  */
18 #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
19 #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
20 
21 enum cachefiles_obj_ref_trace {
22 	cachefiles_obj_get_ioreq,
23 	cachefiles_obj_new,
24 	cachefiles_obj_put_alloc_fail,
25 	cachefiles_obj_put_detach,
26 	cachefiles_obj_put_ioreq,
27 	cachefiles_obj_see_clean_commit,
28 	cachefiles_obj_see_clean_delete,
29 	cachefiles_obj_see_clean_drop_tmp,
30 	cachefiles_obj_see_lookup_cookie,
31 	cachefiles_obj_see_lookup_failed,
32 	cachefiles_obj_see_withdraw_cookie,
33 	cachefiles_obj_see_withdrawal,
34 };
35 
36 enum fscache_why_object_killed {
37 	FSCACHE_OBJECT_IS_STALE,
38 	FSCACHE_OBJECT_IS_WEIRD,
39 	FSCACHE_OBJECT_INVALIDATED,
40 	FSCACHE_OBJECT_NO_SPACE,
41 	FSCACHE_OBJECT_WAS_RETIRED,
42 	FSCACHE_OBJECT_WAS_CULLED,
43 	FSCACHE_VOLUME_IS_WEIRD,
44 };
45 
46 enum cachefiles_coherency_trace {
47 	cachefiles_coherency_check_aux,
48 	cachefiles_coherency_check_content,
49 	cachefiles_coherency_check_dirty,
50 	cachefiles_coherency_check_len,
51 	cachefiles_coherency_check_objsize,
52 	cachefiles_coherency_check_ok,
53 	cachefiles_coherency_check_type,
54 	cachefiles_coherency_check_xattr,
55 	cachefiles_coherency_set_fail,
56 	cachefiles_coherency_set_ok,
57 	cachefiles_coherency_vol_check_cmp,
58 	cachefiles_coherency_vol_check_ok,
59 	cachefiles_coherency_vol_check_xattr,
60 	cachefiles_coherency_vol_set_fail,
61 	cachefiles_coherency_vol_set_ok,
62 };
63 
64 enum cachefiles_trunc_trace {
65 	cachefiles_trunc_dio_adjust,
66 	cachefiles_trunc_expand_tmpfile,
67 	cachefiles_trunc_shrink,
68 };
69 
70 enum cachefiles_prepare_read_trace {
71 	cachefiles_trace_read_after_eof,
72 	cachefiles_trace_read_found_hole,
73 	cachefiles_trace_read_found_part,
74 	cachefiles_trace_read_have_data,
75 	cachefiles_trace_read_no_data,
76 	cachefiles_trace_read_no_file,
77 	cachefiles_trace_read_seek_error,
78 	cachefiles_trace_read_seek_nxio,
79 };
80 
81 enum cachefiles_error_trace {
82 	cachefiles_trace_fallocate_error,
83 	cachefiles_trace_getxattr_error,
84 	cachefiles_trace_link_error,
85 	cachefiles_trace_lookup_error,
86 	cachefiles_trace_mkdir_error,
87 	cachefiles_trace_notify_change_error,
88 	cachefiles_trace_open_error,
89 	cachefiles_trace_read_error,
90 	cachefiles_trace_remxattr_error,
91 	cachefiles_trace_rename_error,
92 	cachefiles_trace_seek_error,
93 	cachefiles_trace_setxattr_error,
94 	cachefiles_trace_statfs_error,
95 	cachefiles_trace_tmpfile_error,
96 	cachefiles_trace_trunc_error,
97 	cachefiles_trace_unlink_error,
98 	cachefiles_trace_write_error,
99 };
100 
101 #endif
102 
103 /*
104  * Define enum -> string mappings for display.
105  */
106 #define cachefiles_obj_kill_traces				\
107 	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\
108 	EM(FSCACHE_OBJECT_IS_WEIRD,	"weird")		\
109 	EM(FSCACHE_OBJECT_INVALIDATED,	"inval")		\
110 	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\
111 	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\
112 	EM(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")		\
113 	E_(FSCACHE_VOLUME_IS_WEIRD,	"volume_weird")
114 
115 #define cachefiles_obj_ref_traces					\
116 	EM(cachefiles_obj_get_ioreq,		"GET ioreq")		\
117 	EM(cachefiles_obj_new,			"NEW obj")		\
118 	EM(cachefiles_obj_put_alloc_fail,	"PUT alloc_fail")	\
119 	EM(cachefiles_obj_put_detach,		"PUT detach")		\
120 	EM(cachefiles_obj_put_ioreq,		"PUT ioreq")		\
121 	EM(cachefiles_obj_see_clean_commit,	"SEE clean_commit")	\
122 	EM(cachefiles_obj_see_clean_delete,	"SEE clean_delete")	\
123 	EM(cachefiles_obj_see_clean_drop_tmp,	"SEE clean_drop_tmp")	\
124 	EM(cachefiles_obj_see_lookup_cookie,	"SEE lookup_cookie")	\
125 	EM(cachefiles_obj_see_lookup_failed,	"SEE lookup_failed")	\
126 	EM(cachefiles_obj_see_withdraw_cookie,	"SEE withdraw_cookie")	\
127 	E_(cachefiles_obj_see_withdrawal,	"SEE withdrawal")
128 
129 #define cachefiles_coherency_traces					\
130 	EM(cachefiles_coherency_check_aux,	"BAD aux ")		\
131 	EM(cachefiles_coherency_check_content,	"BAD cont")		\
132 	EM(cachefiles_coherency_check_dirty,	"BAD dirt")		\
133 	EM(cachefiles_coherency_check_len,	"BAD len ")		\
134 	EM(cachefiles_coherency_check_objsize,	"BAD osiz")		\
135 	EM(cachefiles_coherency_check_ok,	"OK      ")		\
136 	EM(cachefiles_coherency_check_type,	"BAD type")		\
137 	EM(cachefiles_coherency_check_xattr,	"BAD xatt")		\
138 	EM(cachefiles_coherency_set_fail,	"SET fail")		\
139 	EM(cachefiles_coherency_set_ok,		"SET ok  ")		\
140 	EM(cachefiles_coherency_vol_check_cmp,	"VOL BAD cmp ")		\
141 	EM(cachefiles_coherency_vol_check_ok,	"VOL OK      ")		\
142 	EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt")		\
143 	EM(cachefiles_coherency_vol_set_fail,	"VOL SET fail")		\
144 	E_(cachefiles_coherency_vol_set_ok,	"VOL SET ok  ")
145 
146 #define cachefiles_trunc_traces						\
147 	EM(cachefiles_trunc_dio_adjust,		"DIOADJ")		\
148 	EM(cachefiles_trunc_expand_tmpfile,	"EXPTMP")		\
149 	E_(cachefiles_trunc_shrink,		"SHRINK")
150 
151 #define cachefiles_prepare_read_traces					\
152 	EM(cachefiles_trace_read_after_eof,	"after-eof ")		\
153 	EM(cachefiles_trace_read_found_hole,	"found-hole")		\
154 	EM(cachefiles_trace_read_found_part,	"found-part")		\
155 	EM(cachefiles_trace_read_have_data,	"have-data ")		\
156 	EM(cachefiles_trace_read_no_data,	"no-data   ")		\
157 	EM(cachefiles_trace_read_no_file,	"no-file   ")		\
158 	EM(cachefiles_trace_read_seek_error,	"seek-error")		\
159 	E_(cachefiles_trace_read_seek_nxio,	"seek-enxio")
160 
161 #define cachefiles_error_traces						\
162 	EM(cachefiles_trace_fallocate_error,	"fallocate")		\
163 	EM(cachefiles_trace_getxattr_error,	"getxattr")		\
164 	EM(cachefiles_trace_link_error,		"link")			\
165 	EM(cachefiles_trace_lookup_error,	"lookup")		\
166 	EM(cachefiles_trace_mkdir_error,	"mkdir")		\
167 	EM(cachefiles_trace_notify_change_error, "notify_change")	\
168 	EM(cachefiles_trace_open_error,		"open")			\
169 	EM(cachefiles_trace_read_error,		"read")			\
170 	EM(cachefiles_trace_remxattr_error,	"remxattr")		\
171 	EM(cachefiles_trace_rename_error,	"rename")		\
172 	EM(cachefiles_trace_seek_error,		"seek")			\
173 	EM(cachefiles_trace_setxattr_error,	"setxattr")		\
174 	EM(cachefiles_trace_statfs_error,	"statfs")		\
175 	EM(cachefiles_trace_tmpfile_error,	"tmpfile")		\
176 	EM(cachefiles_trace_trunc_error,	"trunc")		\
177 	EM(cachefiles_trace_unlink_error,	"unlink")		\
178 	E_(cachefiles_trace_write_error,	"write")
179 
180 
181 /*
182  * Export enum symbols via userspace.
183  */
184 #undef EM
185 #undef E_
186 #define EM(a, b) TRACE_DEFINE_ENUM(a);
187 #define E_(a, b) TRACE_DEFINE_ENUM(a);
188 
189 cachefiles_obj_kill_traces;
190 cachefiles_obj_ref_traces;
191 cachefiles_coherency_traces;
192 cachefiles_trunc_traces;
193 cachefiles_prepare_read_traces;
194 cachefiles_error_traces;
195 
196 /*
197  * Now redefine the EM() and E_() macros to map the enums to the strings that
198  * will be printed in the output.
199  */
200 #undef EM
201 #undef E_
202 #define EM(a, b)	{ a, b },
203 #define E_(a, b)	{ a, b }
204 
205 
206 TRACE_EVENT(cachefiles_ref,
207 	    TP_PROTO(unsigned int object_debug_id,
208 		     unsigned int cookie_debug_id,
209 		     int usage,
210 		     enum cachefiles_obj_ref_trace why),
211 
212 	    TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
213 
214 	    /* Note that obj may be NULL */
215 	    TP_STRUCT__entry(
216 		    __field(unsigned int,			obj		)
217 		    __field(unsigned int,			cookie		)
218 		    __field(enum cachefiles_obj_ref_trace,	why		)
219 		    __field(int,				usage		)
220 			     ),
221 
222 	    TP_fast_assign(
223 		    __entry->obj	= object_debug_id;
224 		    __entry->cookie	= cookie_debug_id;
225 		    __entry->usage	= usage;
226 		    __entry->why	= why;
227 			   ),
228 
229 	    TP_printk("c=%08x o=%08x u=%d %s",
230 		      __entry->cookie, __entry->obj, __entry->usage,
231 		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
232 	    );
233 
234 TRACE_EVENT(cachefiles_lookup,
235 	    TP_PROTO(struct cachefiles_object *obj,
236 		     struct dentry *de),
237 
238 	    TP_ARGS(obj, de),
239 
240 	    TP_STRUCT__entry(
241 		    __field(unsigned int,		obj	)
242 		    __field(short,			error	)
243 		    __field(unsigned long,		ino	)
244 			     ),
245 
246 	    TP_fast_assign(
247 		    __entry->obj	= obj->debug_id;
248 		    __entry->ino	= (!IS_ERR(de) && d_backing_inode(de) ?
249 					   d_backing_inode(de)->i_ino : 0);
250 		    __entry->error	= IS_ERR(de) ? PTR_ERR(de) : 0;
251 			   ),
252 
253 	    TP_printk("o=%08x i=%lx e=%d",
254 		      __entry->obj, __entry->ino, __entry->error)
255 	    );
256 
257 TRACE_EVENT(cachefiles_tmpfile,
258 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
259 
260 	    TP_ARGS(obj, backer),
261 
262 	    TP_STRUCT__entry(
263 		    __field(unsigned int,			obj	)
264 		    __field(unsigned int,			backer	)
265 			     ),
266 
267 	    TP_fast_assign(
268 		    __entry->obj	= obj->debug_id;
269 		    __entry->backer	= backer->i_ino;
270 			   ),
271 
272 	    TP_printk("o=%08x b=%08x",
273 		      __entry->obj,
274 		      __entry->backer)
275 	    );
276 
277 TRACE_EVENT(cachefiles_link,
278 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
279 
280 	    TP_ARGS(obj, backer),
281 
282 	    TP_STRUCT__entry(
283 		    __field(unsigned int,			obj	)
284 		    __field(unsigned int,			backer	)
285 			     ),
286 
287 	    TP_fast_assign(
288 		    __entry->obj	= obj->debug_id;
289 		    __entry->backer	= backer->i_ino;
290 			   ),
291 
292 	    TP_printk("o=%08x b=%08x",
293 		      __entry->obj,
294 		      __entry->backer)
295 	    );
296 
297 TRACE_EVENT(cachefiles_unlink,
298 	    TP_PROTO(struct cachefiles_object *obj,
299 		     struct dentry *de,
300 		     enum fscache_why_object_killed why),
301 
302 	    TP_ARGS(obj, de, why),
303 
304 	    /* Note that obj may be NULL */
305 	    TP_STRUCT__entry(
306 		    __field(unsigned int,		obj		)
307 		    __field(struct dentry *,		de		)
308 		    __field(enum fscache_why_object_killed, why		)
309 			     ),
310 
311 	    TP_fast_assign(
312 		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
313 		    __entry->de		= de;
314 		    __entry->why	= why;
315 			   ),
316 
317 	    TP_printk("o=%08x d=%p w=%s",
318 		      __entry->obj, __entry->de,
319 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
320 	    );
321 
322 TRACE_EVENT(cachefiles_rename,
323 	    TP_PROTO(struct cachefiles_object *obj,
324 		     struct dentry *de,
325 		     struct dentry *to,
326 		     enum fscache_why_object_killed why),
327 
328 	    TP_ARGS(obj, de, to, why),
329 
330 	    /* Note that obj may be NULL */
331 	    TP_STRUCT__entry(
332 		    __field(unsigned int,		obj		)
333 		    __field(struct dentry *,		de		)
334 		    __field(struct dentry *,		to		)
335 		    __field(enum fscache_why_object_killed, why		)
336 			     ),
337 
338 	    TP_fast_assign(
339 		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
340 		    __entry->de		= de;
341 		    __entry->to		= to;
342 		    __entry->why	= why;
343 			   ),
344 
345 	    TP_printk("o=%08x d=%p t=%p w=%s",
346 		      __entry->obj, __entry->de, __entry->to,
347 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
348 	    );
349 
350 TRACE_EVENT(cachefiles_coherency,
351 	    TP_PROTO(struct cachefiles_object *obj,
352 		     ino_t ino,
353 		     enum cachefiles_content content,
354 		     enum cachefiles_coherency_trace why),
355 
356 	    TP_ARGS(obj, ino, content, why),
357 
358 	    /* Note that obj may be NULL */
359 	    TP_STRUCT__entry(
360 		    __field(unsigned int,			obj	)
361 		    __field(enum cachefiles_coherency_trace,	why	)
362 		    __field(enum cachefiles_content,		content	)
363 		    __field(u64,				ino	)
364 			     ),
365 
366 	    TP_fast_assign(
367 		    __entry->obj	= obj->debug_id;
368 		    __entry->why	= why;
369 		    __entry->content	= content;
370 		    __entry->ino	= ino;
371 			   ),
372 
373 	    TP_printk("o=%08x %s i=%llx c=%u",
374 		      __entry->obj,
375 		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
376 		      __entry->ino,
377 		      __entry->content)
378 	    );
379 
380 TRACE_EVENT(cachefiles_vol_coherency,
381 	    TP_PROTO(struct cachefiles_volume *volume,
382 		     ino_t ino,
383 		     enum cachefiles_coherency_trace why),
384 
385 	    TP_ARGS(volume, ino, why),
386 
387 	    /* Note that obj may be NULL */
388 	    TP_STRUCT__entry(
389 		    __field(unsigned int,			vol	)
390 		    __field(enum cachefiles_coherency_trace,	why	)
391 		    __field(u64,				ino	)
392 			     ),
393 
394 	    TP_fast_assign(
395 		    __entry->vol	= volume->vcookie->debug_id;
396 		    __entry->why	= why;
397 		    __entry->ino	= ino;
398 			   ),
399 
400 	    TP_printk("V=%08x %s i=%llx",
401 		      __entry->vol,
402 		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
403 		      __entry->ino)
404 	    );
405 
406 TRACE_EVENT(cachefiles_prep_read,
407 	    TP_PROTO(struct netfs_read_subrequest *sreq,
408 		     enum netfs_read_source source,
409 		     enum cachefiles_prepare_read_trace why,
410 		     ino_t cache_inode),
411 
412 	    TP_ARGS(sreq, source, why, cache_inode),
413 
414 	    TP_STRUCT__entry(
415 		    __field(unsigned int,		rreq		)
416 		    __field(unsigned short,		index		)
417 		    __field(unsigned short,		flags		)
418 		    __field(enum netfs_read_source,	source		)
419 		    __field(enum cachefiles_prepare_read_trace,	why	)
420 		    __field(size_t,			len		)
421 		    __field(loff_t,			start		)
422 		    __field(unsigned int,		netfs_inode	)
423 		    __field(unsigned int,		cache_inode	)
424 			     ),
425 
426 	    TP_fast_assign(
427 		    __entry->rreq	= sreq->rreq->debug_id;
428 		    __entry->index	= sreq->debug_index;
429 		    __entry->flags	= sreq->flags;
430 		    __entry->source	= source;
431 		    __entry->why	= why;
432 		    __entry->len	= sreq->len;
433 		    __entry->start	= sreq->start;
434 		    __entry->netfs_inode = sreq->rreq->inode->i_ino;
435 		    __entry->cache_inode = cache_inode;
436 			   ),
437 
438 	    TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x b=%x",
439 		      __entry->rreq, __entry->index,
440 		      __print_symbolic(__entry->source, netfs_sreq_sources),
441 		      __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
442 		      __entry->flags,
443 		      __entry->start, __entry->len,
444 		      __entry->netfs_inode, __entry->cache_inode)
445 	    );
446 
447 TRACE_EVENT(cachefiles_read,
448 	    TP_PROTO(struct cachefiles_object *obj,
449 		     struct inode *backer,
450 		     loff_t start,
451 		     size_t len),
452 
453 	    TP_ARGS(obj, backer, start, len),
454 
455 	    TP_STRUCT__entry(
456 		    __field(unsigned int,			obj	)
457 		    __field(unsigned int,			backer	)
458 		    __field(size_t,				len	)
459 		    __field(loff_t,				start	)
460 			     ),
461 
462 	    TP_fast_assign(
463 		    __entry->obj	= obj->debug_id;
464 		    __entry->backer	= backer->i_ino;
465 		    __entry->start	= start;
466 		    __entry->len	= len;
467 			   ),
468 
469 	    TP_printk("o=%08x b=%08x s=%llx l=%zx",
470 		      __entry->obj,
471 		      __entry->backer,
472 		      __entry->start,
473 		      __entry->len)
474 	    );
475 
476 TRACE_EVENT(cachefiles_write,
477 	    TP_PROTO(struct cachefiles_object *obj,
478 		     struct inode *backer,
479 		     loff_t start,
480 		     size_t len),
481 
482 	    TP_ARGS(obj, backer, start, len),
483 
484 	    TP_STRUCT__entry(
485 		    __field(unsigned int,			obj	)
486 		    __field(unsigned int,			backer	)
487 		    __field(size_t,				len	)
488 		    __field(loff_t,				start	)
489 			     ),
490 
491 	    TP_fast_assign(
492 		    __entry->obj	= obj->debug_id;
493 		    __entry->backer	= backer->i_ino;
494 		    __entry->start	= start;
495 		    __entry->len	= len;
496 			   ),
497 
498 	    TP_printk("o=%08x b=%08x s=%llx l=%zx",
499 		      __entry->obj,
500 		      __entry->backer,
501 		      __entry->start,
502 		      __entry->len)
503 	    );
504 
505 TRACE_EVENT(cachefiles_trunc,
506 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
507 		     loff_t from, loff_t to, enum cachefiles_trunc_trace why),
508 
509 	    TP_ARGS(obj, backer, from, to, why),
510 
511 	    TP_STRUCT__entry(
512 		    __field(unsigned int,			obj	)
513 		    __field(unsigned int,			backer	)
514 		    __field(enum cachefiles_trunc_trace,	why	)
515 		    __field(loff_t,				from	)
516 		    __field(loff_t,				to	)
517 			     ),
518 
519 	    TP_fast_assign(
520 		    __entry->obj	= obj->debug_id;
521 		    __entry->backer	= backer->i_ino;
522 		    __entry->from	= from;
523 		    __entry->to		= to;
524 		    __entry->why	= why;
525 			   ),
526 
527 	    TP_printk("o=%08x b=%08x %s l=%llx->%llx",
528 		      __entry->obj,
529 		      __entry->backer,
530 		      __print_symbolic(__entry->why, cachefiles_trunc_traces),
531 		      __entry->from,
532 		      __entry->to)
533 	    );
534 
535 TRACE_EVENT(cachefiles_mark_active,
536 	    TP_PROTO(struct cachefiles_object *obj,
537 		     struct inode *inode),
538 
539 	    TP_ARGS(obj, inode),
540 
541 	    /* Note that obj may be NULL */
542 	    TP_STRUCT__entry(
543 		    __field(unsigned int,		obj		)
544 		    __field(ino_t,			inode		)
545 			     ),
546 
547 	    TP_fast_assign(
548 		    __entry->obj	= obj ? obj->debug_id : 0;
549 		    __entry->inode	= inode->i_ino;
550 			   ),
551 
552 	    TP_printk("o=%08x i=%lx",
553 		      __entry->obj, __entry->inode)
554 	    );
555 
556 TRACE_EVENT(cachefiles_mark_inactive,
557 	    TP_PROTO(struct cachefiles_object *obj,
558 		     struct inode *inode),
559 
560 	    TP_ARGS(obj, inode),
561 
562 	    /* Note that obj may be NULL */
563 	    TP_STRUCT__entry(
564 		    __field(unsigned int,		obj		)
565 		    __field(ino_t,			inode		)
566 			     ),
567 
568 	    TP_fast_assign(
569 		    __entry->obj	= obj ? obj->debug_id : 0;
570 		    __entry->inode	= inode->i_ino;
571 			   ),
572 
573 	    TP_printk("o=%08x i=%lx",
574 		      __entry->obj, __entry->inode)
575 	    );
576 
577 TRACE_EVENT(cachefiles_vfs_error,
578 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
579 		     int error, enum cachefiles_error_trace where),
580 
581 	    TP_ARGS(obj, backer, error, where),
582 
583 	    TP_STRUCT__entry(
584 		    __field(unsigned int,			obj	)
585 		    __field(unsigned int,			backer	)
586 		    __field(enum cachefiles_error_trace,	where	)
587 		    __field(short,				error	)
588 			     ),
589 
590 	    TP_fast_assign(
591 		    __entry->obj	= obj ? obj->debug_id : 0;
592 		    __entry->backer	= backer->i_ino;
593 		    __entry->error	= error;
594 		    __entry->where	= where;
595 			   ),
596 
597 	    TP_printk("o=%08x b=%08x %s e=%d",
598 		      __entry->obj,
599 		      __entry->backer,
600 		      __print_symbolic(__entry->where, cachefiles_error_traces),
601 		      __entry->error)
602 	    );
603 
604 TRACE_EVENT(cachefiles_io_error,
605 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
606 		     int error, enum cachefiles_error_trace where),
607 
608 	    TP_ARGS(obj, backer, error, where),
609 
610 	    TP_STRUCT__entry(
611 		    __field(unsigned int,			obj	)
612 		    __field(unsigned int,			backer	)
613 		    __field(enum cachefiles_error_trace,	where	)
614 		    __field(short,				error	)
615 			     ),
616 
617 	    TP_fast_assign(
618 		    __entry->obj	= obj ? obj->debug_id : 0;
619 		    __entry->backer	= backer->i_ino;
620 		    __entry->error	= error;
621 		    __entry->where	= where;
622 			   ),
623 
624 	    TP_printk("o=%08x b=%08x %s e=%d",
625 		      __entry->obj,
626 		      __entry->backer,
627 		      __print_symbolic(__entry->where, cachefiles_error_traces),
628 		      __entry->error)
629 	    );
630 
631 #endif /* _TRACE_CACHEFILES_H */
632 
633 /* This part must be outside protection */
634 #include <trace/define_trace.h>
635