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