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