Linux Audio

Check our new training course

Loading...
v6.2
  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
 21enum 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	cachefiles_obj_get_ondemand_fd,
 35	cachefiles_obj_put_ondemand_fd,
 
 
 36};
 37
 38enum fscache_why_object_killed {
 39	FSCACHE_OBJECT_IS_STALE,
 40	FSCACHE_OBJECT_IS_WEIRD,
 41	FSCACHE_OBJECT_INVALIDATED,
 42	FSCACHE_OBJECT_NO_SPACE,
 43	FSCACHE_OBJECT_WAS_RETIRED,
 44	FSCACHE_OBJECT_WAS_CULLED,
 45	FSCACHE_VOLUME_IS_WEIRD,
 46};
 47
 48enum cachefiles_coherency_trace {
 49	cachefiles_coherency_check_aux,
 50	cachefiles_coherency_check_content,
 51	cachefiles_coherency_check_dirty,
 52	cachefiles_coherency_check_len,
 53	cachefiles_coherency_check_objsize,
 54	cachefiles_coherency_check_ok,
 55	cachefiles_coherency_check_type,
 56	cachefiles_coherency_check_xattr,
 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
 67enum cachefiles_trunc_trace {
 68	cachefiles_trunc_dio_adjust,
 69	cachefiles_trunc_expand_tmpfile,
 70	cachefiles_trunc_shrink,
 71};
 72
 73enum cachefiles_prepare_read_trace {
 74	cachefiles_trace_read_after_eof,
 75	cachefiles_trace_read_found_hole,
 76	cachefiles_trace_read_found_part,
 77	cachefiles_trace_read_have_data,
 78	cachefiles_trace_read_no_data,
 79	cachefiles_trace_read_no_file,
 80	cachefiles_trace_read_seek_error,
 81	cachefiles_trace_read_seek_nxio,
 82};
 83
 84enum cachefiles_error_trace {
 85	cachefiles_trace_fallocate_error,
 86	cachefiles_trace_getxattr_error,
 87	cachefiles_trace_link_error,
 88	cachefiles_trace_lookup_error,
 89	cachefiles_trace_mkdir_error,
 90	cachefiles_trace_notify_change_error,
 91	cachefiles_trace_open_error,
 92	cachefiles_trace_read_error,
 93	cachefiles_trace_remxattr_error,
 94	cachefiles_trace_rename_error,
 95	cachefiles_trace_seek_error,
 96	cachefiles_trace_setxattr_error,
 97	cachefiles_trace_statfs_error,
 98	cachefiles_trace_tmpfile_error,
 99	cachefiles_trace_trunc_error,
100	cachefiles_trace_unlink_error,
101	cachefiles_trace_write_error,
102};
103
104#endif
105
106/*
107 * Define enum -> string mappings for display.
108 */
109#define cachefiles_obj_kill_traces				\
110	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\
111	EM(FSCACHE_OBJECT_IS_WEIRD,	"weird")		\
112	EM(FSCACHE_OBJECT_INVALIDATED,	"inval")		\
113	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\
114	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\
115	EM(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")		\
116	E_(FSCACHE_VOLUME_IS_WEIRD,	"volume_weird")
117
118#define cachefiles_obj_ref_traces					\
119	EM(cachefiles_obj_get_ioreq,		"GET ioreq")		\
120	EM(cachefiles_obj_new,			"NEW obj")		\
121	EM(cachefiles_obj_put_alloc_fail,	"PUT alloc_fail")	\
122	EM(cachefiles_obj_put_detach,		"PUT detach")		\
123	EM(cachefiles_obj_put_ioreq,		"PUT ioreq")		\
124	EM(cachefiles_obj_see_clean_commit,	"SEE clean_commit")	\
125	EM(cachefiles_obj_see_clean_delete,	"SEE clean_delete")	\
126	EM(cachefiles_obj_see_clean_drop_tmp,	"SEE clean_drop_tmp")	\
127	EM(cachefiles_obj_see_lookup_cookie,	"SEE lookup_cookie")	\
128	EM(cachefiles_obj_see_lookup_failed,	"SEE lookup_failed")	\
129	EM(cachefiles_obj_see_withdraw_cookie,	"SEE withdraw_cookie")	\
130	E_(cachefiles_obj_see_withdrawal,	"SEE withdrawal")
 
 
 
 
131
132#define cachefiles_coherency_traces					\
133	EM(cachefiles_coherency_check_aux,	"BAD aux ")		\
134	EM(cachefiles_coherency_check_content,	"BAD cont")		\
135	EM(cachefiles_coherency_check_dirty,	"BAD dirt")		\
136	EM(cachefiles_coherency_check_len,	"BAD len ")		\
137	EM(cachefiles_coherency_check_objsize,	"BAD osiz")		\
138	EM(cachefiles_coherency_check_ok,	"OK      ")		\
139	EM(cachefiles_coherency_check_type,	"BAD type")		\
140	EM(cachefiles_coherency_check_xattr,	"BAD xatt")		\
141	EM(cachefiles_coherency_set_fail,	"SET fail")		\
142	EM(cachefiles_coherency_set_ok,		"SET ok  ")		\
143	EM(cachefiles_coherency_vol_check_cmp,	"VOL BAD cmp ")		\
144	EM(cachefiles_coherency_vol_check_ok,	"VOL OK      ")		\
145	EM(cachefiles_coherency_vol_check_resv,	"VOL BAD resv")	\
146	EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt")		\
147	EM(cachefiles_coherency_vol_set_fail,	"VOL SET fail")		\
148	E_(cachefiles_coherency_vol_set_ok,	"VOL SET ok  ")
149
150#define cachefiles_trunc_traces						\
151	EM(cachefiles_trunc_dio_adjust,		"DIOADJ")		\
152	EM(cachefiles_trunc_expand_tmpfile,	"EXPTMP")		\
153	E_(cachefiles_trunc_shrink,		"SHRINK")
154
155#define cachefiles_prepare_read_traces					\
156	EM(cachefiles_trace_read_after_eof,	"after-eof ")		\
157	EM(cachefiles_trace_read_found_hole,	"found-hole")		\
158	EM(cachefiles_trace_read_found_part,	"found-part")		\
159	EM(cachefiles_trace_read_have_data,	"have-data ")		\
160	EM(cachefiles_trace_read_no_data,	"no-data   ")		\
161	EM(cachefiles_trace_read_no_file,	"no-file   ")		\
162	EM(cachefiles_trace_read_seek_error,	"seek-error")		\
163	E_(cachefiles_trace_read_seek_nxio,	"seek-enxio")
164
165#define cachefiles_error_traces						\
166	EM(cachefiles_trace_fallocate_error,	"fallocate")		\
167	EM(cachefiles_trace_getxattr_error,	"getxattr")		\
168	EM(cachefiles_trace_link_error,		"link")			\
169	EM(cachefiles_trace_lookup_error,	"lookup")		\
170	EM(cachefiles_trace_mkdir_error,	"mkdir")		\
171	EM(cachefiles_trace_notify_change_error, "notify_change")	\
172	EM(cachefiles_trace_open_error,		"open")			\
173	EM(cachefiles_trace_read_error,		"read")			\
174	EM(cachefiles_trace_remxattr_error,	"remxattr")		\
175	EM(cachefiles_trace_rename_error,	"rename")		\
176	EM(cachefiles_trace_seek_error,		"seek")			\
177	EM(cachefiles_trace_setxattr_error,	"setxattr")		\
178	EM(cachefiles_trace_statfs_error,	"statfs")		\
179	EM(cachefiles_trace_tmpfile_error,	"tmpfile")		\
180	EM(cachefiles_trace_trunc_error,	"trunc")		\
181	EM(cachefiles_trace_unlink_error,	"unlink")		\
182	E_(cachefiles_trace_write_error,	"write")
183
184
185/*
186 * Export enum symbols via userspace.
187 */
188#undef EM
189#undef E_
190#define EM(a, b) TRACE_DEFINE_ENUM(a);
191#define E_(a, b) TRACE_DEFINE_ENUM(a);
192
193cachefiles_obj_kill_traces;
194cachefiles_obj_ref_traces;
195cachefiles_coherency_traces;
196cachefiles_trunc_traces;
197cachefiles_prepare_read_traces;
198cachefiles_error_traces;
199
200/*
201 * Now redefine the EM() and E_() macros to map the enums to the strings that
202 * will be printed in the output.
203 */
204#undef EM
205#undef E_
206#define EM(a, b)	{ a, b },
207#define E_(a, b)	{ a, b }
208
209
210TRACE_EVENT(cachefiles_ref,
211	    TP_PROTO(unsigned int object_debug_id,
212		     unsigned int cookie_debug_id,
213		     int usage,
214		     enum cachefiles_obj_ref_trace why),
215
216	    TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
217
218	    /* Note that obj may be NULL */
219	    TP_STRUCT__entry(
220		    __field(unsigned int,			obj		)
221		    __field(unsigned int,			cookie		)
222		    __field(enum cachefiles_obj_ref_trace,	why		)
223		    __field(int,				usage		)
224			     ),
225
226	    TP_fast_assign(
227		    __entry->obj	= object_debug_id;
228		    __entry->cookie	= cookie_debug_id;
229		    __entry->usage	= usage;
230		    __entry->why	= why;
231			   ),
232
233	    TP_printk("c=%08x o=%08x u=%d %s",
234		      __entry->cookie, __entry->obj, __entry->usage,
235		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
236	    );
237
238TRACE_EVENT(cachefiles_lookup,
239	    TP_PROTO(struct cachefiles_object *obj,
240		     struct dentry *dir,
241		     struct dentry *de),
242
243	    TP_ARGS(obj, dir, de),
244
245	    TP_STRUCT__entry(
246		    __field(unsigned int,		obj	)
247		    __field(short,			error	)
248		    __field(unsigned long,		dino	)
249		    __field(unsigned long,		ino	)
250			     ),
251
252	    TP_fast_assign(
253		    __entry->obj	= obj ? obj->debug_id : 0;
254		    __entry->dino	= d_backing_inode(dir)->i_ino;
255		    __entry->ino	= (!IS_ERR(de) && d_backing_inode(de) ?
256					   d_backing_inode(de)->i_ino : 0);
257		    __entry->error	= IS_ERR(de) ? PTR_ERR(de) : 0;
258			   ),
259
260	    TP_printk("o=%08x dB=%lx B=%lx e=%d",
261		      __entry->obj, __entry->dino, __entry->ino, __entry->error)
262	    );
263
264TRACE_EVENT(cachefiles_mkdir,
265	    TP_PROTO(struct dentry *dir, struct dentry *subdir),
266
267	    TP_ARGS(dir, subdir),
268
269	    TP_STRUCT__entry(
270		    __field(unsigned int,			dir	)
271		    __field(unsigned int,			subdir	)
272			     ),
273
274	    TP_fast_assign(
275		    __entry->dir	= d_backing_inode(dir)->i_ino;
276		    __entry->subdir	= d_backing_inode(subdir)->i_ino;
277			   ),
278
279	    TP_printk("dB=%x sB=%x",
280		      __entry->dir,
281		      __entry->subdir)
282	    );
283
284TRACE_EVENT(cachefiles_tmpfile,
285	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
286
287	    TP_ARGS(obj, backer),
288
289	    TP_STRUCT__entry(
290		    __field(unsigned int,			obj	)
291		    __field(unsigned int,			backer	)
292			     ),
293
294	    TP_fast_assign(
295		    __entry->obj	= obj->debug_id;
296		    __entry->backer	= backer->i_ino;
297			   ),
298
299	    TP_printk("o=%08x B=%x",
300		      __entry->obj,
301		      __entry->backer)
302	    );
303
304TRACE_EVENT(cachefiles_link,
305	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
306
307	    TP_ARGS(obj, backer),
308
309	    TP_STRUCT__entry(
310		    __field(unsigned int,			obj	)
311		    __field(unsigned int,			backer	)
312			     ),
313
314	    TP_fast_assign(
315		    __entry->obj	= obj->debug_id;
316		    __entry->backer	= backer->i_ino;
317			   ),
318
319	    TP_printk("o=%08x B=%x",
320		      __entry->obj,
321		      __entry->backer)
322	    );
323
324TRACE_EVENT(cachefiles_unlink,
325	    TP_PROTO(struct cachefiles_object *obj,
326		     ino_t ino,
327		     enum fscache_why_object_killed why),
328
329	    TP_ARGS(obj, ino, why),
330
331	    /* Note that obj may be NULL */
332	    TP_STRUCT__entry(
333		    __field(unsigned int,		obj		)
334		    __field(unsigned int,		ino		)
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->ino	= ino;
341		    __entry->why	= why;
342			   ),
343
344	    TP_printk("o=%08x B=%x w=%s",
345		      __entry->obj, __entry->ino,
346		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
347	    );
348
349TRACE_EVENT(cachefiles_rename,
350	    TP_PROTO(struct cachefiles_object *obj,
351		     ino_t ino,
352		     enum fscache_why_object_killed why),
353
354	    TP_ARGS(obj, ino, why),
355
356	    /* Note that obj may be NULL */
357	    TP_STRUCT__entry(
358		    __field(unsigned int,		obj		)
359		    __field(unsigned int,		ino		)
360		    __field(enum fscache_why_object_killed, why		)
361			     ),
362
363	    TP_fast_assign(
364		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
365		    __entry->ino	= ino;
366		    __entry->why	= why;
367			   ),
368
369	    TP_printk("o=%08x B=%x w=%s",
370		      __entry->obj, __entry->ino,
371		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
372	    );
373
374TRACE_EVENT(cachefiles_coherency,
375	    TP_PROTO(struct cachefiles_object *obj,
376		     ino_t ino,
377		     enum cachefiles_content content,
378		     enum cachefiles_coherency_trace why),
379
380	    TP_ARGS(obj, ino, content, why),
381
382	    /* Note that obj may be NULL */
383	    TP_STRUCT__entry(
384		    __field(unsigned int,			obj	)
385		    __field(enum cachefiles_coherency_trace,	why	)
386		    __field(enum cachefiles_content,		content	)
387		    __field(u64,				ino	)
388			     ),
389
390	    TP_fast_assign(
391		    __entry->obj	= obj->debug_id;
392		    __entry->why	= why;
393		    __entry->content	= content;
394		    __entry->ino	= ino;
395			   ),
396
397	    TP_printk("o=%08x %s B=%llx c=%u",
398		      __entry->obj,
399		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
400		      __entry->ino,
401		      __entry->content)
402	    );
403
404TRACE_EVENT(cachefiles_vol_coherency,
405	    TP_PROTO(struct cachefiles_volume *volume,
406		     ino_t ino,
407		     enum cachefiles_coherency_trace why),
408
409	    TP_ARGS(volume, ino, why),
410
411	    /* Note that obj may be NULL */
412	    TP_STRUCT__entry(
413		    __field(unsigned int,			vol	)
414		    __field(enum cachefiles_coherency_trace,	why	)
415		    __field(u64,				ino	)
416			     ),
417
418	    TP_fast_assign(
419		    __entry->vol	= volume->vcookie->debug_id;
420		    __entry->why	= why;
421		    __entry->ino	= ino;
422			   ),
423
424	    TP_printk("V=%08x %s B=%llx",
425		      __entry->vol,
426		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
427		      __entry->ino)
428	    );
429
430TRACE_EVENT(cachefiles_prep_read,
431	    TP_PROTO(struct cachefiles_object *obj,
432		     loff_t start,
433		     size_t len,
434		     unsigned short flags,
435		     enum netfs_io_source source,
436		     enum cachefiles_prepare_read_trace why,
437		     ino_t cache_inode, ino_t netfs_inode),
438
439	    TP_ARGS(obj, start, len, flags, source, why, cache_inode, netfs_inode),
440
441	    TP_STRUCT__entry(
442		    __field(unsigned int,		obj		)
443		    __field(unsigned short,		flags		)
444		    __field(enum netfs_io_source,	source		)
445		    __field(enum cachefiles_prepare_read_trace,	why	)
446		    __field(size_t,			len		)
447		    __field(loff_t,			start		)
448		    __field(unsigned int,		netfs_inode	)
449		    __field(unsigned int,		cache_inode	)
450			     ),
451
452	    TP_fast_assign(
453		    __entry->obj	= obj ? obj->debug_id : 0;
454		    __entry->flags	= flags;
455		    __entry->source	= source;
456		    __entry->why	= why;
457		    __entry->len	= len;
458		    __entry->start	= start;
459		    __entry->netfs_inode = netfs_inode;
460		    __entry->cache_inode = cache_inode;
461			   ),
462
463	    TP_printk("o=%08x %s %s f=%02x s=%llx %zx ni=%x B=%x",
464		      __entry->obj,
465		      __print_symbolic(__entry->source, netfs_sreq_sources),
466		      __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
467		      __entry->flags,
468		      __entry->start, __entry->len,
469		      __entry->netfs_inode, __entry->cache_inode)
470	    );
471
472TRACE_EVENT(cachefiles_read,
473	    TP_PROTO(struct cachefiles_object *obj,
474		     struct inode *backer,
475		     loff_t start,
476		     size_t len),
477
478	    TP_ARGS(obj, backer, start, len),
479
480	    TP_STRUCT__entry(
481		    __field(unsigned int,			obj	)
482		    __field(unsigned int,			backer	)
483		    __field(size_t,				len	)
484		    __field(loff_t,				start	)
485			     ),
486
487	    TP_fast_assign(
488		    __entry->obj	= obj->debug_id;
489		    __entry->backer	= backer->i_ino;
490		    __entry->start	= start;
491		    __entry->len	= len;
492			   ),
493
494	    TP_printk("o=%08x B=%x s=%llx l=%zx",
495		      __entry->obj,
496		      __entry->backer,
497		      __entry->start,
498		      __entry->len)
499	    );
500
501TRACE_EVENT(cachefiles_write,
502	    TP_PROTO(struct cachefiles_object *obj,
503		     struct inode *backer,
504		     loff_t start,
505		     size_t len),
506
507	    TP_ARGS(obj, backer, start, len),
508
509	    TP_STRUCT__entry(
510		    __field(unsigned int,			obj	)
511		    __field(unsigned int,			backer	)
512		    __field(size_t,				len	)
513		    __field(loff_t,				start	)
514			     ),
515
516	    TP_fast_assign(
517		    __entry->obj	= obj->debug_id;
518		    __entry->backer	= backer->i_ino;
519		    __entry->start	= start;
520		    __entry->len	= len;
521			   ),
522
523	    TP_printk("o=%08x B=%x s=%llx l=%zx",
524		      __entry->obj,
525		      __entry->backer,
526		      __entry->start,
527		      __entry->len)
528	    );
529
530TRACE_EVENT(cachefiles_trunc,
531	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
532		     loff_t from, loff_t to, enum cachefiles_trunc_trace why),
533
534	    TP_ARGS(obj, backer, from, to, why),
535
536	    TP_STRUCT__entry(
537		    __field(unsigned int,			obj	)
538		    __field(unsigned int,			backer	)
539		    __field(enum cachefiles_trunc_trace,	why	)
540		    __field(loff_t,				from	)
541		    __field(loff_t,				to	)
542			     ),
543
544	    TP_fast_assign(
545		    __entry->obj	= obj->debug_id;
546		    __entry->backer	= backer->i_ino;
547		    __entry->from	= from;
548		    __entry->to		= to;
549		    __entry->why	= why;
550			   ),
551
552	    TP_printk("o=%08x B=%x %s l=%llx->%llx",
553		      __entry->obj,
554		      __entry->backer,
555		      __print_symbolic(__entry->why, cachefiles_trunc_traces),
556		      __entry->from,
557		      __entry->to)
558	    );
559
560TRACE_EVENT(cachefiles_mark_active,
561	    TP_PROTO(struct cachefiles_object *obj,
562		     struct inode *inode),
563
564	    TP_ARGS(obj, inode),
565
566	    /* Note that obj may be NULL */
567	    TP_STRUCT__entry(
568		    __field(unsigned int,		obj		)
569		    __field(ino_t,			inode		)
570			     ),
571
572	    TP_fast_assign(
573		    __entry->obj	= obj ? obj->debug_id : 0;
574		    __entry->inode	= inode->i_ino;
575			   ),
576
577	    TP_printk("o=%08x B=%lx",
578		      __entry->obj, __entry->inode)
579	    );
580
581TRACE_EVENT(cachefiles_mark_failed,
582	    TP_PROTO(struct cachefiles_object *obj,
583		     struct inode *inode),
584
585	    TP_ARGS(obj, inode),
586
587	    /* Note that obj may be NULL */
588	    TP_STRUCT__entry(
589		    __field(unsigned int,		obj		)
590		    __field(ino_t,			inode		)
591			     ),
592
593	    TP_fast_assign(
594		    __entry->obj	= obj ? obj->debug_id : 0;
595		    __entry->inode	= inode->i_ino;
596			   ),
597
598	    TP_printk("o=%08x B=%lx",
599		      __entry->obj, __entry->inode)
600	    );
601
602TRACE_EVENT(cachefiles_mark_inactive,
603	    TP_PROTO(struct cachefiles_object *obj,
604		     struct inode *inode),
605
606	    TP_ARGS(obj, inode),
607
608	    /* Note that obj may be NULL */
609	    TP_STRUCT__entry(
610		    __field(unsigned int,		obj		)
611		    __field(ino_t,			inode		)
612			     ),
613
614	    TP_fast_assign(
615		    __entry->obj	= obj ? obj->debug_id : 0;
616		    __entry->inode	= inode->i_ino;
617			   ),
618
619	    TP_printk("o=%08x B=%lx",
620		      __entry->obj, __entry->inode)
621	    );
622
623TRACE_EVENT(cachefiles_vfs_error,
624	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
625		     int error, enum cachefiles_error_trace where),
626
627	    TP_ARGS(obj, backer, error, where),
628
629	    TP_STRUCT__entry(
630		    __field(unsigned int,			obj	)
631		    __field(unsigned int,			backer	)
632		    __field(enum cachefiles_error_trace,	where	)
633		    __field(short,				error	)
634			     ),
635
636	    TP_fast_assign(
637		    __entry->obj	= obj ? obj->debug_id : 0;
638		    __entry->backer	= backer->i_ino;
639		    __entry->error	= error;
640		    __entry->where	= where;
641			   ),
642
643	    TP_printk("o=%08x B=%x %s e=%d",
644		      __entry->obj,
645		      __entry->backer,
646		      __print_symbolic(__entry->where, cachefiles_error_traces),
647		      __entry->error)
648	    );
649
650TRACE_EVENT(cachefiles_io_error,
651	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
652		     int error, enum cachefiles_error_trace where),
653
654	    TP_ARGS(obj, backer, error, where),
655
656	    TP_STRUCT__entry(
657		    __field(unsigned int,			obj	)
658		    __field(unsigned int,			backer	)
659		    __field(enum cachefiles_error_trace,	where	)
660		    __field(short,				error	)
661			     ),
662
663	    TP_fast_assign(
664		    __entry->obj	= obj ? obj->debug_id : 0;
665		    __entry->backer	= backer->i_ino;
666		    __entry->error	= error;
667		    __entry->where	= where;
668			   ),
669
670	    TP_printk("o=%08x B=%x %s e=%d",
671		      __entry->obj,
672		      __entry->backer,
673		      __print_symbolic(__entry->where, cachefiles_error_traces),
674		      __entry->error)
675	    );
676
677TRACE_EVENT(cachefiles_ondemand_open,
678	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
679		     struct cachefiles_open *load),
680
681	    TP_ARGS(obj, msg, load),
682
683	    TP_STRUCT__entry(
684		    __field(unsigned int,	obj		)
685		    __field(unsigned int,	msg_id		)
686		    __field(unsigned int,	object_id	)
687		    __field(unsigned int,	fd		)
688		    __field(unsigned int,	flags		)
689			     ),
690
691	    TP_fast_assign(
692		    __entry->obj	= obj ? obj->debug_id : 0;
693		    __entry->msg_id	= msg->msg_id;
694		    __entry->object_id	= msg->object_id;
695		    __entry->fd		= load->fd;
696		    __entry->flags	= load->flags;
697			   ),
698
699	    TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x",
700		      __entry->obj,
701		      __entry->msg_id,
702		      __entry->object_id,
703		      __entry->fd,
704		      __entry->flags)
705	    );
706
707TRACE_EVENT(cachefiles_ondemand_copen,
708	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id,
709		     long len),
710
711	    TP_ARGS(obj, msg_id, len),
712
713	    TP_STRUCT__entry(
714		    __field(unsigned int,	obj	)
715		    __field(unsigned int,	msg_id	)
716		    __field(long,		len	)
717			     ),
718
719	    TP_fast_assign(
720		    __entry->obj	= obj ? obj->debug_id : 0;
721		    __entry->msg_id	= msg_id;
722		    __entry->len	= len;
723			   ),
724
725	    TP_printk("o=%08x mid=%x l=%lx",
726		      __entry->obj,
727		      __entry->msg_id,
728		      __entry->len)
729	    );
730
731TRACE_EVENT(cachefiles_ondemand_close,
732	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg),
733
734	    TP_ARGS(obj, msg),
735
736	    TP_STRUCT__entry(
737		    __field(unsigned int,	obj		)
738		    __field(unsigned int,	msg_id		)
739		    __field(unsigned int,	object_id	)
740			     ),
741
742	    TP_fast_assign(
743		    __entry->obj	= obj ? obj->debug_id : 0;
744		    __entry->msg_id	= msg->msg_id;
745		    __entry->object_id	= msg->object_id;
746			   ),
747
748	    TP_printk("o=%08x mid=%x oid=%x",
749		      __entry->obj,
750		      __entry->msg_id,
751		      __entry->object_id)
752	    );
753
754TRACE_EVENT(cachefiles_ondemand_read,
755	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
756		     struct cachefiles_read *load),
757
758	    TP_ARGS(obj, msg, load),
759
760	    TP_STRUCT__entry(
761		    __field(unsigned int,	obj		)
762		    __field(unsigned int,	msg_id		)
763		    __field(unsigned int,	object_id	)
764		    __field(loff_t,		start		)
765		    __field(size_t,		len		)
766			     ),
767
768	    TP_fast_assign(
769		    __entry->obj	= obj ? obj->debug_id : 0;
770		    __entry->msg_id	= msg->msg_id;
771		    __entry->object_id	= msg->object_id;
772		    __entry->start	= load->off;
773		    __entry->len	= load->len;
774			   ),
775
776	    TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx",
777		      __entry->obj,
778		      __entry->msg_id,
779		      __entry->object_id,
780		      __entry->start,
781		      __entry->len)
782	    );
783
784TRACE_EVENT(cachefiles_ondemand_cread,
785	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id),
786
787	    TP_ARGS(obj, msg_id),
788
789	    TP_STRUCT__entry(
790		    __field(unsigned int,	obj	)
791		    __field(unsigned int,	msg_id	)
792			     ),
793
794	    TP_fast_assign(
795		    __entry->obj	= obj ? obj->debug_id : 0;
796		    __entry->msg_id	= msg_id;
797			   ),
798
799	    TP_printk("o=%08x mid=%x",
800		      __entry->obj,
801		      __entry->msg_id)
802	    );
803
804TRACE_EVENT(cachefiles_ondemand_fd_write,
805	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
806		     loff_t start, size_t len),
807
808	    TP_ARGS(obj, backer, start, len),
809
810	    TP_STRUCT__entry(
811		    __field(unsigned int,	obj	)
812		    __field(unsigned int,	backer	)
813		    __field(loff_t,		start	)
814		    __field(size_t,		len	)
815			     ),
816
817	    TP_fast_assign(
818		    __entry->obj	= obj ? obj->debug_id : 0;
819		    __entry->backer	= backer->i_ino;
820		    __entry->start	= start;
821		    __entry->len	= len;
822			   ),
823
824	    TP_printk("o=%08x iB=%x s=%llx l=%zx",
825		      __entry->obj,
826		      __entry->backer,
827		      __entry->start,
828		      __entry->len)
829	    );
830
831TRACE_EVENT(cachefiles_ondemand_fd_release,
832	    TP_PROTO(struct cachefiles_object *obj, int object_id),
833
834	    TP_ARGS(obj, object_id),
835
836	    TP_STRUCT__entry(
837		    __field(unsigned int,	obj		)
838		    __field(unsigned int,	object_id	)
839			     ),
840
841	    TP_fast_assign(
842		    __entry->obj	= obj ? obj->debug_id : 0;
843		    __entry->object_id	= object_id;
844			   ),
845
846	    TP_printk("o=%08x oid=%x",
847		      __entry->obj,
848		      __entry->object_id)
849	    );
850
851#endif /* _TRACE_CACHEFILES_H */
852
853/* This part must be outside protection */
854#include <trace/define_trace.h>
v6.13.7
  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
 21enum 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	cachefiles_obj_get_ondemand_fd,
 35	cachefiles_obj_put_ondemand_fd,
 36	cachefiles_obj_get_read_req,
 37	cachefiles_obj_put_read_req,
 38};
 39
 40enum fscache_why_object_killed {
 41	FSCACHE_OBJECT_IS_STALE,
 42	FSCACHE_OBJECT_IS_WEIRD,
 43	FSCACHE_OBJECT_INVALIDATED,
 44	FSCACHE_OBJECT_NO_SPACE,
 45	FSCACHE_OBJECT_WAS_RETIRED,
 46	FSCACHE_OBJECT_WAS_CULLED,
 47	FSCACHE_VOLUME_IS_WEIRD,
 48};
 49
 50enum cachefiles_coherency_trace {
 51	cachefiles_coherency_check_aux,
 52	cachefiles_coherency_check_content,
 53	cachefiles_coherency_check_dirty,
 54	cachefiles_coherency_check_len,
 55	cachefiles_coherency_check_objsize,
 56	cachefiles_coherency_check_ok,
 57	cachefiles_coherency_check_type,
 58	cachefiles_coherency_check_xattr,
 59	cachefiles_coherency_set_fail,
 60	cachefiles_coherency_set_ok,
 61	cachefiles_coherency_vol_check_cmp,
 62	cachefiles_coherency_vol_check_ok,
 63	cachefiles_coherency_vol_check_resv,
 64	cachefiles_coherency_vol_check_xattr,
 65	cachefiles_coherency_vol_set_fail,
 66	cachefiles_coherency_vol_set_ok,
 67};
 68
 69enum cachefiles_trunc_trace {
 70	cachefiles_trunc_dio_adjust,
 71	cachefiles_trunc_expand_tmpfile,
 72	cachefiles_trunc_shrink,
 73};
 74
 75enum 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
 86enum cachefiles_error_trace {
 87	cachefiles_trace_fallocate_error,
 88	cachefiles_trace_getxattr_error,
 89	cachefiles_trace_link_error,
 90	cachefiles_trace_lookup_error,
 91	cachefiles_trace_mkdir_error,
 92	cachefiles_trace_notify_change_error,
 93	cachefiles_trace_open_error,
 94	cachefiles_trace_read_error,
 95	cachefiles_trace_remxattr_error,
 96	cachefiles_trace_rename_error,
 97	cachefiles_trace_seek_error,
 98	cachefiles_trace_setxattr_error,
 99	cachefiles_trace_statfs_error,
100	cachefiles_trace_tmpfile_error,
101	cachefiles_trace_trunc_error,
102	cachefiles_trace_unlink_error,
103	cachefiles_trace_write_error,
104};
105
106#endif
107
108/*
109 * Define enum -> string mappings for display.
110 */
111#define cachefiles_obj_kill_traces				\
112	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\
113	EM(FSCACHE_OBJECT_IS_WEIRD,	"weird")		\
114	EM(FSCACHE_OBJECT_INVALIDATED,	"inval")		\
115	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\
116	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\
117	EM(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")		\
118	E_(FSCACHE_VOLUME_IS_WEIRD,	"volume_weird")
119
120#define cachefiles_obj_ref_traces					\
121	EM(cachefiles_obj_get_ioreq,		"GET ioreq")		\
122	EM(cachefiles_obj_new,			"NEW obj")		\
123	EM(cachefiles_obj_put_alloc_fail,	"PUT alloc_fail")	\
124	EM(cachefiles_obj_put_detach,		"PUT detach")		\
125	EM(cachefiles_obj_put_ioreq,		"PUT ioreq")		\
126	EM(cachefiles_obj_see_clean_commit,	"SEE clean_commit")	\
127	EM(cachefiles_obj_see_clean_delete,	"SEE clean_delete")	\
128	EM(cachefiles_obj_see_clean_drop_tmp,	"SEE clean_drop_tmp")	\
129	EM(cachefiles_obj_see_lookup_cookie,	"SEE lookup_cookie")	\
130	EM(cachefiles_obj_see_lookup_failed,	"SEE lookup_failed")	\
131	EM(cachefiles_obj_see_withdraw_cookie,	"SEE withdraw_cookie")	\
132	EM(cachefiles_obj_see_withdrawal,	"SEE withdrawal")	\
133	EM(cachefiles_obj_get_ondemand_fd,      "GET ondemand_fd")	\
134	EM(cachefiles_obj_put_ondemand_fd,      "PUT ondemand_fd")	\
135	EM(cachefiles_obj_get_read_req,		"GET read_req")		\
136	E_(cachefiles_obj_put_read_req,		"PUT read_req")
137
138#define cachefiles_coherency_traces					\
139	EM(cachefiles_coherency_check_aux,	"BAD aux ")		\
140	EM(cachefiles_coherency_check_content,	"BAD cont")		\
141	EM(cachefiles_coherency_check_dirty,	"BAD dirt")		\
142	EM(cachefiles_coherency_check_len,	"BAD len ")		\
143	EM(cachefiles_coherency_check_objsize,	"BAD osiz")		\
144	EM(cachefiles_coherency_check_ok,	"OK      ")		\
145	EM(cachefiles_coherency_check_type,	"BAD type")		\
146	EM(cachefiles_coherency_check_xattr,	"BAD xatt")		\
147	EM(cachefiles_coherency_set_fail,	"SET fail")		\
148	EM(cachefiles_coherency_set_ok,		"SET ok  ")		\
149	EM(cachefiles_coherency_vol_check_cmp,	"VOL BAD cmp ")		\
150	EM(cachefiles_coherency_vol_check_ok,	"VOL OK      ")		\
151	EM(cachefiles_coherency_vol_check_resv,	"VOL BAD resv")	\
152	EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt")		\
153	EM(cachefiles_coherency_vol_set_fail,	"VOL SET fail")		\
154	E_(cachefiles_coherency_vol_set_ok,	"VOL SET ok  ")
155
156#define cachefiles_trunc_traces						\
157	EM(cachefiles_trunc_dio_adjust,		"DIOADJ")		\
158	EM(cachefiles_trunc_expand_tmpfile,	"EXPTMP")		\
159	E_(cachefiles_trunc_shrink,		"SHRINK")
160
161#define cachefiles_prepare_read_traces					\
162	EM(cachefiles_trace_read_after_eof,	"after-eof ")		\
163	EM(cachefiles_trace_read_found_hole,	"found-hole")		\
164	EM(cachefiles_trace_read_found_part,	"found-part")		\
165	EM(cachefiles_trace_read_have_data,	"have-data ")		\
166	EM(cachefiles_trace_read_no_data,	"no-data   ")		\
167	EM(cachefiles_trace_read_no_file,	"no-file   ")		\
168	EM(cachefiles_trace_read_seek_error,	"seek-error")		\
169	E_(cachefiles_trace_read_seek_nxio,	"seek-enxio")
170
171#define cachefiles_error_traces						\
172	EM(cachefiles_trace_fallocate_error,	"fallocate")		\
173	EM(cachefiles_trace_getxattr_error,	"getxattr")		\
174	EM(cachefiles_trace_link_error,		"link")			\
175	EM(cachefiles_trace_lookup_error,	"lookup")		\
176	EM(cachefiles_trace_mkdir_error,	"mkdir")		\
177	EM(cachefiles_trace_notify_change_error, "notify_change")	\
178	EM(cachefiles_trace_open_error,		"open")			\
179	EM(cachefiles_trace_read_error,		"read")			\
180	EM(cachefiles_trace_remxattr_error,	"remxattr")		\
181	EM(cachefiles_trace_rename_error,	"rename")		\
182	EM(cachefiles_trace_seek_error,		"seek")			\
183	EM(cachefiles_trace_setxattr_error,	"setxattr")		\
184	EM(cachefiles_trace_statfs_error,	"statfs")		\
185	EM(cachefiles_trace_tmpfile_error,	"tmpfile")		\
186	EM(cachefiles_trace_trunc_error,	"trunc")		\
187	EM(cachefiles_trace_unlink_error,	"unlink")		\
188	E_(cachefiles_trace_write_error,	"write")
189
190
191/*
192 * Export enum symbols via userspace.
193 */
194#undef EM
195#undef E_
196#define EM(a, b) TRACE_DEFINE_ENUM(a);
197#define E_(a, b) TRACE_DEFINE_ENUM(a);
198
199cachefiles_obj_kill_traces;
200cachefiles_obj_ref_traces;
201cachefiles_coherency_traces;
202cachefiles_trunc_traces;
203cachefiles_prepare_read_traces;
204cachefiles_error_traces;
205
206/*
207 * Now redefine the EM() and E_() macros to map the enums to the strings that
208 * will be printed in the output.
209 */
210#undef EM
211#undef E_
212#define EM(a, b)	{ a, b },
213#define E_(a, b)	{ a, b }
214
215
216TRACE_EVENT(cachefiles_ref,
217	    TP_PROTO(unsigned int object_debug_id,
218		     unsigned int cookie_debug_id,
219		     int usage,
220		     enum cachefiles_obj_ref_trace why),
221
222	    TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
223
224	    /* Note that obj may be NULL */
225	    TP_STRUCT__entry(
226		    __field(unsigned int,			obj		)
227		    __field(unsigned int,			cookie		)
228		    __field(enum cachefiles_obj_ref_trace,	why		)
229		    __field(int,				usage		)
230			     ),
231
232	    TP_fast_assign(
233		    __entry->obj	= object_debug_id;
234		    __entry->cookie	= cookie_debug_id;
235		    __entry->usage	= usage;
236		    __entry->why	= why;
237			   ),
238
239	    TP_printk("c=%08x o=%08x u=%d %s",
240		      __entry->cookie, __entry->obj, __entry->usage,
241		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
242	    );
243
244TRACE_EVENT(cachefiles_lookup,
245	    TP_PROTO(struct cachefiles_object *obj,
246		     struct dentry *dir,
247		     struct dentry *de),
248
249	    TP_ARGS(obj, dir, de),
250
251	    TP_STRUCT__entry(
252		    __field(unsigned int,		obj	)
253		    __field(short,			error	)
254		    __field(unsigned long,		dino	)
255		    __field(unsigned long,		ino	)
256			     ),
257
258	    TP_fast_assign(
259		    __entry->obj	= obj ? obj->debug_id : 0;
260		    __entry->dino	= d_backing_inode(dir)->i_ino;
261		    __entry->ino	= (!IS_ERR(de) && d_backing_inode(de) ?
262					   d_backing_inode(de)->i_ino : 0);
263		    __entry->error	= IS_ERR(de) ? PTR_ERR(de) : 0;
264			   ),
265
266	    TP_printk("o=%08x dB=%lx B=%lx e=%d",
267		      __entry->obj, __entry->dino, __entry->ino, __entry->error)
268	    );
269
270TRACE_EVENT(cachefiles_mkdir,
271	    TP_PROTO(struct dentry *dir, struct dentry *subdir),
272
273	    TP_ARGS(dir, subdir),
274
275	    TP_STRUCT__entry(
276		    __field(unsigned int,			dir	)
277		    __field(unsigned int,			subdir	)
278			     ),
279
280	    TP_fast_assign(
281		    __entry->dir	= d_backing_inode(dir)->i_ino;
282		    __entry->subdir	= d_backing_inode(subdir)->i_ino;
283			   ),
284
285	    TP_printk("dB=%x sB=%x",
286		      __entry->dir,
287		      __entry->subdir)
288	    );
289
290TRACE_EVENT(cachefiles_tmpfile,
291	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
292
293	    TP_ARGS(obj, backer),
294
295	    TP_STRUCT__entry(
296		    __field(unsigned int,			obj	)
297		    __field(unsigned int,			backer	)
298			     ),
299
300	    TP_fast_assign(
301		    __entry->obj	= obj->debug_id;
302		    __entry->backer	= backer->i_ino;
303			   ),
304
305	    TP_printk("o=%08x B=%x",
306		      __entry->obj,
307		      __entry->backer)
308	    );
309
310TRACE_EVENT(cachefiles_link,
311	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
312
313	    TP_ARGS(obj, backer),
314
315	    TP_STRUCT__entry(
316		    __field(unsigned int,			obj	)
317		    __field(unsigned int,			backer	)
318			     ),
319
320	    TP_fast_assign(
321		    __entry->obj	= obj->debug_id;
322		    __entry->backer	= backer->i_ino;
323			   ),
324
325	    TP_printk("o=%08x B=%x",
326		      __entry->obj,
327		      __entry->backer)
328	    );
329
330TRACE_EVENT(cachefiles_unlink,
331	    TP_PROTO(struct cachefiles_object *obj,
332		     ino_t ino,
333		     enum fscache_why_object_killed why),
334
335	    TP_ARGS(obj, ino, why),
336
337	    /* Note that obj may be NULL */
338	    TP_STRUCT__entry(
339		    __field(unsigned int,		obj		)
340		    __field(unsigned int,		ino		)
341		    __field(enum fscache_why_object_killed, why		)
342			     ),
343
344	    TP_fast_assign(
345		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
346		    __entry->ino	= ino;
347		    __entry->why	= why;
348			   ),
349
350	    TP_printk("o=%08x B=%x w=%s",
351		      __entry->obj, __entry->ino,
352		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
353	    );
354
355TRACE_EVENT(cachefiles_rename,
356	    TP_PROTO(struct cachefiles_object *obj,
357		     ino_t ino,
358		     enum fscache_why_object_killed why),
359
360	    TP_ARGS(obj, ino, why),
361
362	    /* Note that obj may be NULL */
363	    TP_STRUCT__entry(
364		    __field(unsigned int,		obj		)
365		    __field(unsigned int,		ino		)
366		    __field(enum fscache_why_object_killed, why		)
367			     ),
368
369	    TP_fast_assign(
370		    __entry->obj	= obj ? obj->debug_id : UINT_MAX;
371		    __entry->ino	= ino;
372		    __entry->why	= why;
373			   ),
374
375	    TP_printk("o=%08x B=%x w=%s",
376		      __entry->obj, __entry->ino,
377		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
378	    );
379
380TRACE_EVENT(cachefiles_coherency,
381	    TP_PROTO(struct cachefiles_object *obj,
382		     ino_t ino,
383		     enum cachefiles_content content,
384		     enum cachefiles_coherency_trace why),
385
386	    TP_ARGS(obj, ino, content, why),
387
388	    /* Note that obj may be NULL */
389	    TP_STRUCT__entry(
390		    __field(unsigned int,			obj	)
391		    __field(enum cachefiles_coherency_trace,	why	)
392		    __field(enum cachefiles_content,		content	)
393		    __field(u64,				ino	)
394			     ),
395
396	    TP_fast_assign(
397		    __entry->obj	= obj->debug_id;
398		    __entry->why	= why;
399		    __entry->content	= content;
400		    __entry->ino	= ino;
401			   ),
402
403	    TP_printk("o=%08x %s B=%llx c=%u",
404		      __entry->obj,
405		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
406		      __entry->ino,
407		      __entry->content)
408	    );
409
410TRACE_EVENT(cachefiles_vol_coherency,
411	    TP_PROTO(struct cachefiles_volume *volume,
412		     ino_t ino,
413		     enum cachefiles_coherency_trace why),
414
415	    TP_ARGS(volume, ino, why),
416
417	    /* Note that obj may be NULL */
418	    TP_STRUCT__entry(
419		    __field(unsigned int,			vol	)
420		    __field(enum cachefiles_coherency_trace,	why	)
421		    __field(u64,				ino	)
422			     ),
423
424	    TP_fast_assign(
425		    __entry->vol	= volume->vcookie->debug_id;
426		    __entry->why	= why;
427		    __entry->ino	= ino;
428			   ),
429
430	    TP_printk("V=%08x %s B=%llx",
431		      __entry->vol,
432		      __print_symbolic(__entry->why, cachefiles_coherency_traces),
433		      __entry->ino)
434	    );
435
436TRACE_EVENT(cachefiles_prep_read,
437	    TP_PROTO(struct cachefiles_object *obj,
438		     loff_t start,
439		     size_t len,
440		     unsigned short flags,
441		     enum netfs_io_source source,
442		     enum cachefiles_prepare_read_trace why,
443		     ino_t cache_inode, ino_t netfs_inode),
444
445	    TP_ARGS(obj, start, len, flags, source, why, cache_inode, netfs_inode),
446
447	    TP_STRUCT__entry(
448		    __field(unsigned int,		obj		)
449		    __field(unsigned short,		flags		)
450		    __field(enum netfs_io_source,	source		)
451		    __field(enum cachefiles_prepare_read_trace,	why	)
452		    __field(size_t,			len		)
453		    __field(loff_t,			start		)
454		    __field(unsigned int,		netfs_inode	)
455		    __field(unsigned int,		cache_inode	)
456			     ),
457
458	    TP_fast_assign(
459		    __entry->obj	= obj ? obj->debug_id : 0;
460		    __entry->flags	= flags;
461		    __entry->source	= source;
462		    __entry->why	= why;
463		    __entry->len	= len;
464		    __entry->start	= start;
465		    __entry->netfs_inode = netfs_inode;
466		    __entry->cache_inode = cache_inode;
467			   ),
468
469	    TP_printk("o=%08x %s %s f=%02x s=%llx %zx ni=%x B=%x",
470		      __entry->obj,
471		      __print_symbolic(__entry->source, netfs_sreq_sources),
472		      __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
473		      __entry->flags,
474		      __entry->start, __entry->len,
475		      __entry->netfs_inode, __entry->cache_inode)
476	    );
477
478TRACE_EVENT(cachefiles_read,
479	    TP_PROTO(struct cachefiles_object *obj,
480		     struct inode *backer,
481		     loff_t start,
482		     size_t len),
483
484	    TP_ARGS(obj, backer, start, len),
485
486	    TP_STRUCT__entry(
487		    __field(unsigned int,			obj	)
488		    __field(unsigned int,			backer	)
489		    __field(size_t,				len	)
490		    __field(loff_t,				start	)
491			     ),
492
493	    TP_fast_assign(
494		    __entry->obj	= obj->debug_id;
495		    __entry->backer	= backer->i_ino;
496		    __entry->start	= start;
497		    __entry->len	= len;
498			   ),
499
500	    TP_printk("o=%08x B=%x s=%llx l=%zx",
501		      __entry->obj,
502		      __entry->backer,
503		      __entry->start,
504		      __entry->len)
505	    );
506
507TRACE_EVENT(cachefiles_write,
508	    TP_PROTO(struct cachefiles_object *obj,
509		     struct inode *backer,
510		     loff_t start,
511		     size_t len),
512
513	    TP_ARGS(obj, backer, start, len),
514
515	    TP_STRUCT__entry(
516		    __field(unsigned int,			obj	)
517		    __field(unsigned int,			backer	)
518		    __field(size_t,				len	)
519		    __field(loff_t,				start	)
520			     ),
521
522	    TP_fast_assign(
523		    __entry->obj	= obj->debug_id;
524		    __entry->backer	= backer->i_ino;
525		    __entry->start	= start;
526		    __entry->len	= len;
527			   ),
528
529	    TP_printk("o=%08x B=%x s=%llx l=%zx",
530		      __entry->obj,
531		      __entry->backer,
532		      __entry->start,
533		      __entry->len)
534	    );
535
536TRACE_EVENT(cachefiles_trunc,
537	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
538		     loff_t from, loff_t to, enum cachefiles_trunc_trace why),
539
540	    TP_ARGS(obj, backer, from, to, why),
541
542	    TP_STRUCT__entry(
543		    __field(unsigned int,			obj	)
544		    __field(unsigned int,			backer	)
545		    __field(enum cachefiles_trunc_trace,	why	)
546		    __field(loff_t,				from	)
547		    __field(loff_t,				to	)
548			     ),
549
550	    TP_fast_assign(
551		    __entry->obj	= obj->debug_id;
552		    __entry->backer	= backer->i_ino;
553		    __entry->from	= from;
554		    __entry->to		= to;
555		    __entry->why	= why;
556			   ),
557
558	    TP_printk("o=%08x B=%x %s l=%llx->%llx",
559		      __entry->obj,
560		      __entry->backer,
561		      __print_symbolic(__entry->why, cachefiles_trunc_traces),
562		      __entry->from,
563		      __entry->to)
564	    );
565
566TRACE_EVENT(cachefiles_mark_active,
567	    TP_PROTO(struct cachefiles_object *obj,
568		     struct inode *inode),
569
570	    TP_ARGS(obj, inode),
571
572	    /* Note that obj may be NULL */
573	    TP_STRUCT__entry(
574		    __field(unsigned int,		obj		)
575		    __field(ino_t,			inode		)
576			     ),
577
578	    TP_fast_assign(
579		    __entry->obj	= obj ? obj->debug_id : 0;
580		    __entry->inode	= inode->i_ino;
581			   ),
582
583	    TP_printk("o=%08x B=%lx",
584		      __entry->obj, __entry->inode)
585	    );
586
587TRACE_EVENT(cachefiles_mark_failed,
588	    TP_PROTO(struct cachefiles_object *obj,
589		     struct inode *inode),
590
591	    TP_ARGS(obj, inode),
592
593	    /* Note that obj may be NULL */
594	    TP_STRUCT__entry(
595		    __field(unsigned int,		obj		)
596		    __field(ino_t,			inode		)
597			     ),
598
599	    TP_fast_assign(
600		    __entry->obj	= obj ? obj->debug_id : 0;
601		    __entry->inode	= inode->i_ino;
602			   ),
603
604	    TP_printk("o=%08x B=%lx",
605		      __entry->obj, __entry->inode)
606	    );
607
608TRACE_EVENT(cachefiles_mark_inactive,
609	    TP_PROTO(struct cachefiles_object *obj,
610		     struct inode *inode),
611
612	    TP_ARGS(obj, inode),
613
614	    /* Note that obj may be NULL */
615	    TP_STRUCT__entry(
616		    __field(unsigned int,		obj		)
617		    __field(ino_t,			inode		)
618			     ),
619
620	    TP_fast_assign(
621		    __entry->obj	= obj ? obj->debug_id : 0;
622		    __entry->inode	= inode->i_ino;
623			   ),
624
625	    TP_printk("o=%08x B=%lx",
626		      __entry->obj, __entry->inode)
627	    );
628
629TRACE_EVENT(cachefiles_vfs_error,
630	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
631		     int error, enum cachefiles_error_trace where),
632
633	    TP_ARGS(obj, backer, error, where),
634
635	    TP_STRUCT__entry(
636		    __field(unsigned int,			obj	)
637		    __field(unsigned int,			backer	)
638		    __field(enum cachefiles_error_trace,	where	)
639		    __field(short,				error	)
640			     ),
641
642	    TP_fast_assign(
643		    __entry->obj	= obj ? obj->debug_id : 0;
644		    __entry->backer	= backer->i_ino;
645		    __entry->error	= error;
646		    __entry->where	= where;
647			   ),
648
649	    TP_printk("o=%08x B=%x %s e=%d",
650		      __entry->obj,
651		      __entry->backer,
652		      __print_symbolic(__entry->where, cachefiles_error_traces),
653		      __entry->error)
654	    );
655
656TRACE_EVENT(cachefiles_io_error,
657	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
658		     int error, enum cachefiles_error_trace where),
659
660	    TP_ARGS(obj, backer, error, where),
661
662	    TP_STRUCT__entry(
663		    __field(unsigned int,			obj	)
664		    __field(unsigned int,			backer	)
665		    __field(enum cachefiles_error_trace,	where	)
666		    __field(short,				error	)
667			     ),
668
669	    TP_fast_assign(
670		    __entry->obj	= obj ? obj->debug_id : 0;
671		    __entry->backer	= backer->i_ino;
672		    __entry->error	= error;
673		    __entry->where	= where;
674			   ),
675
676	    TP_printk("o=%08x B=%x %s e=%d",
677		      __entry->obj,
678		      __entry->backer,
679		      __print_symbolic(__entry->where, cachefiles_error_traces),
680		      __entry->error)
681	    );
682
683TRACE_EVENT(cachefiles_ondemand_open,
684	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
685		     struct cachefiles_open *load),
686
687	    TP_ARGS(obj, msg, load),
688
689	    TP_STRUCT__entry(
690		    __field(unsigned int,	obj		)
691		    __field(unsigned int,	msg_id		)
692		    __field(unsigned int,	object_id	)
693		    __field(unsigned int,	fd		)
694		    __field(unsigned int,	flags		)
695			     ),
696
697	    TP_fast_assign(
698		    __entry->obj	= obj ? obj->debug_id : 0;
699		    __entry->msg_id	= msg->msg_id;
700		    __entry->object_id	= msg->object_id;
701		    __entry->fd		= load->fd;
702		    __entry->flags	= load->flags;
703			   ),
704
705	    TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x",
706		      __entry->obj,
707		      __entry->msg_id,
708		      __entry->object_id,
709		      __entry->fd,
710		      __entry->flags)
711	    );
712
713TRACE_EVENT(cachefiles_ondemand_copen,
714	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id,
715		     long len),
716
717	    TP_ARGS(obj, msg_id, len),
718
719	    TP_STRUCT__entry(
720		    __field(unsigned int,	obj	)
721		    __field(unsigned int,	msg_id	)
722		    __field(long,		len	)
723			     ),
724
725	    TP_fast_assign(
726		    __entry->obj	= obj ? obj->debug_id : 0;
727		    __entry->msg_id	= msg_id;
728		    __entry->len	= len;
729			   ),
730
731	    TP_printk("o=%08x mid=%x l=%lx",
732		      __entry->obj,
733		      __entry->msg_id,
734		      __entry->len)
735	    );
736
737TRACE_EVENT(cachefiles_ondemand_close,
738	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg),
739
740	    TP_ARGS(obj, msg),
741
742	    TP_STRUCT__entry(
743		    __field(unsigned int,	obj		)
744		    __field(unsigned int,	msg_id		)
745		    __field(unsigned int,	object_id	)
746			     ),
747
748	    TP_fast_assign(
749		    __entry->obj	= obj ? obj->debug_id : 0;
750		    __entry->msg_id	= msg->msg_id;
751		    __entry->object_id	= msg->object_id;
752			   ),
753
754	    TP_printk("o=%08x mid=%x oid=%x",
755		      __entry->obj,
756		      __entry->msg_id,
757		      __entry->object_id)
758	    );
759
760TRACE_EVENT(cachefiles_ondemand_read,
761	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
762		     struct cachefiles_read *load),
763
764	    TP_ARGS(obj, msg, load),
765
766	    TP_STRUCT__entry(
767		    __field(unsigned int,	obj		)
768		    __field(unsigned int,	msg_id		)
769		    __field(unsigned int,	object_id	)
770		    __field(loff_t,		start		)
771		    __field(size_t,		len		)
772			     ),
773
774	    TP_fast_assign(
775		    __entry->obj	= obj ? obj->debug_id : 0;
776		    __entry->msg_id	= msg->msg_id;
777		    __entry->object_id	= msg->object_id;
778		    __entry->start	= load->off;
779		    __entry->len	= load->len;
780			   ),
781
782	    TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx",
783		      __entry->obj,
784		      __entry->msg_id,
785		      __entry->object_id,
786		      __entry->start,
787		      __entry->len)
788	    );
789
790TRACE_EVENT(cachefiles_ondemand_cread,
791	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id),
792
793	    TP_ARGS(obj, msg_id),
794
795	    TP_STRUCT__entry(
796		    __field(unsigned int,	obj	)
797		    __field(unsigned int,	msg_id	)
798			     ),
799
800	    TP_fast_assign(
801		    __entry->obj	= obj ? obj->debug_id : 0;
802		    __entry->msg_id	= msg_id;
803			   ),
804
805	    TP_printk("o=%08x mid=%x",
806		      __entry->obj,
807		      __entry->msg_id)
808	    );
809
810TRACE_EVENT(cachefiles_ondemand_fd_write,
811	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
812		     loff_t start, size_t len),
813
814	    TP_ARGS(obj, backer, start, len),
815
816	    TP_STRUCT__entry(
817		    __field(unsigned int,	obj	)
818		    __field(unsigned int,	backer	)
819		    __field(loff_t,		start	)
820		    __field(size_t,		len	)
821			     ),
822
823	    TP_fast_assign(
824		    __entry->obj	= obj ? obj->debug_id : 0;
825		    __entry->backer	= backer->i_ino;
826		    __entry->start	= start;
827		    __entry->len	= len;
828			   ),
829
830	    TP_printk("o=%08x iB=%x s=%llx l=%zx",
831		      __entry->obj,
832		      __entry->backer,
833		      __entry->start,
834		      __entry->len)
835	    );
836
837TRACE_EVENT(cachefiles_ondemand_fd_release,
838	    TP_PROTO(struct cachefiles_object *obj, int object_id),
839
840	    TP_ARGS(obj, object_id),
841
842	    TP_STRUCT__entry(
843		    __field(unsigned int,	obj		)
844		    __field(unsigned int,	object_id	)
845			     ),
846
847	    TP_fast_assign(
848		    __entry->obj	= obj ? obj->debug_id : 0;
849		    __entry->object_id	= object_id;
850			   ),
851
852	    TP_printk("o=%08x oid=%x",
853		      __entry->obj,
854		      __entry->object_id)
855	    );
856
857#endif /* _TRACE_CACHEFILES_H */
858
859/* This part must be outside protection */
860#include <trace/define_trace.h>