| /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
 | /* CacheFiles tracepoints | 
 |  * | 
 |  * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved. | 
 |  * Written by David Howells (dhowells@redhat.com) | 
 |  */ | 
 | #undef TRACE_SYSTEM | 
 | #define TRACE_SYSTEM cachefiles | 
 |  | 
 | #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ) | 
 | #define _TRACE_CACHEFILES_H | 
 |  | 
 | #include <linux/tracepoint.h> | 
 |  | 
 | /* | 
 |  * Define enums for tracing information. | 
 |  */ | 
 | #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY | 
 | #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY | 
 |  | 
 | enum cachefiles_obj_ref_trace { | 
 | 	cachefiles_obj_get_ioreq, | 
 | 	cachefiles_obj_new, | 
 | 	cachefiles_obj_put_alloc_fail, | 
 | 	cachefiles_obj_put_detach, | 
 | 	cachefiles_obj_put_ioreq, | 
 | 	cachefiles_obj_see_clean_commit, | 
 | 	cachefiles_obj_see_clean_delete, | 
 | 	cachefiles_obj_see_clean_drop_tmp, | 
 | 	cachefiles_obj_see_lookup_cookie, | 
 | 	cachefiles_obj_see_lookup_failed, | 
 | 	cachefiles_obj_see_withdraw_cookie, | 
 | 	cachefiles_obj_see_withdrawal, | 
 | 	cachefiles_obj_get_ondemand_fd, | 
 | 	cachefiles_obj_put_ondemand_fd, | 
 | 	cachefiles_obj_get_read_req, | 
 | 	cachefiles_obj_put_read_req, | 
 | }; | 
 |  | 
 | enum fscache_why_object_killed { | 
 | 	FSCACHE_OBJECT_IS_STALE, | 
 | 	FSCACHE_OBJECT_IS_WEIRD, | 
 | 	FSCACHE_OBJECT_INVALIDATED, | 
 | 	FSCACHE_OBJECT_NO_SPACE, | 
 | 	FSCACHE_OBJECT_WAS_RETIRED, | 
 | 	FSCACHE_OBJECT_WAS_CULLED, | 
 | 	FSCACHE_VOLUME_IS_WEIRD, | 
 | }; | 
 |  | 
 | enum cachefiles_coherency_trace { | 
 | 	cachefiles_coherency_check_aux, | 
 | 	cachefiles_coherency_check_content, | 
 | 	cachefiles_coherency_check_dirty, | 
 | 	cachefiles_coherency_check_len, | 
 | 	cachefiles_coherency_check_objsize, | 
 | 	cachefiles_coherency_check_ok, | 
 | 	cachefiles_coherency_check_type, | 
 | 	cachefiles_coherency_check_xattr, | 
 | 	cachefiles_coherency_set_fail, | 
 | 	cachefiles_coherency_set_ok, | 
 | 	cachefiles_coherency_vol_check_cmp, | 
 | 	cachefiles_coherency_vol_check_ok, | 
 | 	cachefiles_coherency_vol_check_resv, | 
 | 	cachefiles_coherency_vol_check_xattr, | 
 | 	cachefiles_coherency_vol_set_fail, | 
 | 	cachefiles_coherency_vol_set_ok, | 
 | }; | 
 |  | 
 | enum cachefiles_trunc_trace { | 
 | 	cachefiles_trunc_dio_adjust, | 
 | 	cachefiles_trunc_expand_tmpfile, | 
 | 	cachefiles_trunc_shrink, | 
 | }; | 
 |  | 
 | enum cachefiles_prepare_read_trace { | 
 | 	cachefiles_trace_read_after_eof, | 
 | 	cachefiles_trace_read_found_hole, | 
 | 	cachefiles_trace_read_found_part, | 
 | 	cachefiles_trace_read_have_data, | 
 | 	cachefiles_trace_read_no_data, | 
 | 	cachefiles_trace_read_no_file, | 
 | 	cachefiles_trace_read_seek_error, | 
 | 	cachefiles_trace_read_seek_nxio, | 
 | }; | 
 |  | 
 | enum cachefiles_error_trace { | 
 | 	cachefiles_trace_fallocate_error, | 
 | 	cachefiles_trace_getxattr_error, | 
 | 	cachefiles_trace_link_error, | 
 | 	cachefiles_trace_lookup_error, | 
 | 	cachefiles_trace_mkdir_error, | 
 | 	cachefiles_trace_notify_change_error, | 
 | 	cachefiles_trace_open_error, | 
 | 	cachefiles_trace_read_error, | 
 | 	cachefiles_trace_remxattr_error, | 
 | 	cachefiles_trace_rename_error, | 
 | 	cachefiles_trace_seek_error, | 
 | 	cachefiles_trace_setxattr_error, | 
 | 	cachefiles_trace_statfs_error, | 
 | 	cachefiles_trace_tmpfile_error, | 
 | 	cachefiles_trace_trunc_error, | 
 | 	cachefiles_trace_unlink_error, | 
 | 	cachefiles_trace_write_error, | 
 | }; | 
 |  | 
 | #endif | 
 |  | 
 | /* | 
 |  * Define enum -> string mappings for display. | 
 |  */ | 
 | #define cachefiles_obj_kill_traces				\ | 
 | 	EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\ | 
 | 	EM(FSCACHE_OBJECT_IS_WEIRD,	"weird")		\ | 
 | 	EM(FSCACHE_OBJECT_INVALIDATED,	"inval")		\ | 
 | 	EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\ | 
 | 	EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\ | 
 | 	EM(FSCACHE_OBJECT_WAS_CULLED,	"was_culled")		\ | 
 | 	E_(FSCACHE_VOLUME_IS_WEIRD,	"volume_weird") | 
 |  | 
 | #define cachefiles_obj_ref_traces					\ | 
 | 	EM(cachefiles_obj_get_ioreq,		"GET ioreq")		\ | 
 | 	EM(cachefiles_obj_new,			"NEW obj")		\ | 
 | 	EM(cachefiles_obj_put_alloc_fail,	"PUT alloc_fail")	\ | 
 | 	EM(cachefiles_obj_put_detach,		"PUT detach")		\ | 
 | 	EM(cachefiles_obj_put_ioreq,		"PUT ioreq")		\ | 
 | 	EM(cachefiles_obj_see_clean_commit,	"SEE clean_commit")	\ | 
 | 	EM(cachefiles_obj_see_clean_delete,	"SEE clean_delete")	\ | 
 | 	EM(cachefiles_obj_see_clean_drop_tmp,	"SEE clean_drop_tmp")	\ | 
 | 	EM(cachefiles_obj_see_lookup_cookie,	"SEE lookup_cookie")	\ | 
 | 	EM(cachefiles_obj_see_lookup_failed,	"SEE lookup_failed")	\ | 
 | 	EM(cachefiles_obj_see_withdraw_cookie,	"SEE withdraw_cookie")	\ | 
 | 	EM(cachefiles_obj_see_withdrawal,	"SEE withdrawal")	\ | 
 | 	EM(cachefiles_obj_get_ondemand_fd,      "GET ondemand_fd")	\ | 
 | 	EM(cachefiles_obj_put_ondemand_fd,      "PUT ondemand_fd")	\ | 
 | 	EM(cachefiles_obj_get_read_req,		"GET read_req")		\ | 
 | 	E_(cachefiles_obj_put_read_req,		"PUT read_req") | 
 |  | 
 | #define cachefiles_coherency_traces					\ | 
 | 	EM(cachefiles_coherency_check_aux,	"BAD aux ")		\ | 
 | 	EM(cachefiles_coherency_check_content,	"BAD cont")		\ | 
 | 	EM(cachefiles_coherency_check_dirty,	"BAD dirt")		\ | 
 | 	EM(cachefiles_coherency_check_len,	"BAD len ")		\ | 
 | 	EM(cachefiles_coherency_check_objsize,	"BAD osiz")		\ | 
 | 	EM(cachefiles_coherency_check_ok,	"OK      ")		\ | 
 | 	EM(cachefiles_coherency_check_type,	"BAD type")		\ | 
 | 	EM(cachefiles_coherency_check_xattr,	"BAD xatt")		\ | 
 | 	EM(cachefiles_coherency_set_fail,	"SET fail")		\ | 
 | 	EM(cachefiles_coherency_set_ok,		"SET ok  ")		\ | 
 | 	EM(cachefiles_coherency_vol_check_cmp,	"VOL BAD cmp ")		\ | 
 | 	EM(cachefiles_coherency_vol_check_ok,	"VOL OK      ")		\ | 
 | 	EM(cachefiles_coherency_vol_check_resv,	"VOL BAD resv")	\ | 
 | 	EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt")		\ | 
 | 	EM(cachefiles_coherency_vol_set_fail,	"VOL SET fail")		\ | 
 | 	E_(cachefiles_coherency_vol_set_ok,	"VOL SET ok  ") | 
 |  | 
 | #define cachefiles_trunc_traces						\ | 
 | 	EM(cachefiles_trunc_dio_adjust,		"DIOADJ")		\ | 
 | 	EM(cachefiles_trunc_expand_tmpfile,	"EXPTMP")		\ | 
 | 	E_(cachefiles_trunc_shrink,		"SHRINK") | 
 |  | 
 | #define cachefiles_prepare_read_traces					\ | 
 | 	EM(cachefiles_trace_read_after_eof,	"after-eof ")		\ | 
 | 	EM(cachefiles_trace_read_found_hole,	"found-hole")		\ | 
 | 	EM(cachefiles_trace_read_found_part,	"found-part")		\ | 
 | 	EM(cachefiles_trace_read_have_data,	"have-data ")		\ | 
 | 	EM(cachefiles_trace_read_no_data,	"no-data   ")		\ | 
 | 	EM(cachefiles_trace_read_no_file,	"no-file   ")		\ | 
 | 	EM(cachefiles_trace_read_seek_error,	"seek-error")		\ | 
 | 	E_(cachefiles_trace_read_seek_nxio,	"seek-enxio") | 
 |  | 
 | #define cachefiles_error_traces						\ | 
 | 	EM(cachefiles_trace_fallocate_error,	"fallocate")		\ | 
 | 	EM(cachefiles_trace_getxattr_error,	"getxattr")		\ | 
 | 	EM(cachefiles_trace_link_error,		"link")			\ | 
 | 	EM(cachefiles_trace_lookup_error,	"lookup")		\ | 
 | 	EM(cachefiles_trace_mkdir_error,	"mkdir")		\ | 
 | 	EM(cachefiles_trace_notify_change_error, "notify_change")	\ | 
 | 	EM(cachefiles_trace_open_error,		"open")			\ | 
 | 	EM(cachefiles_trace_read_error,		"read")			\ | 
 | 	EM(cachefiles_trace_remxattr_error,	"remxattr")		\ | 
 | 	EM(cachefiles_trace_rename_error,	"rename")		\ | 
 | 	EM(cachefiles_trace_seek_error,		"seek")			\ | 
 | 	EM(cachefiles_trace_setxattr_error,	"setxattr")		\ | 
 | 	EM(cachefiles_trace_statfs_error,	"statfs")		\ | 
 | 	EM(cachefiles_trace_tmpfile_error,	"tmpfile")		\ | 
 | 	EM(cachefiles_trace_trunc_error,	"trunc")		\ | 
 | 	EM(cachefiles_trace_unlink_error,	"unlink")		\ | 
 | 	E_(cachefiles_trace_write_error,	"write") | 
 |  | 
 |  | 
 | /* | 
 |  * Export enum symbols via userspace. | 
 |  */ | 
 | #undef EM | 
 | #undef E_ | 
 | #define EM(a, b) TRACE_DEFINE_ENUM(a); | 
 | #define E_(a, b) TRACE_DEFINE_ENUM(a); | 
 |  | 
 | cachefiles_obj_kill_traces; | 
 | cachefiles_obj_ref_traces; | 
 | cachefiles_coherency_traces; | 
 | cachefiles_trunc_traces; | 
 | cachefiles_prepare_read_traces; | 
 | cachefiles_error_traces; | 
 |  | 
 | /* | 
 |  * Now redefine the EM() and E_() macros to map the enums to the strings that | 
 |  * will be printed in the output. | 
 |  */ | 
 | #undef EM | 
 | #undef E_ | 
 | #define EM(a, b)	{ a, b }, | 
 | #define E_(a, b)	{ a, b } | 
 |  | 
 |  | 
 | TRACE_EVENT(cachefiles_ref, | 
 | 	    TP_PROTO(unsigned int object_debug_id, | 
 | 		     unsigned int cookie_debug_id, | 
 | 		     int usage, | 
 | 		     enum cachefiles_obj_ref_trace why), | 
 |  | 
 | 	    TP_ARGS(object_debug_id, cookie_debug_id, usage, why), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			cookie) | 
 | 		    __field(enum cachefiles_obj_ref_trace,	why) | 
 | 		    __field(int,				usage) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= object_debug_id; | 
 | 		    __entry->cookie	= cookie_debug_id; | 
 | 		    __entry->usage	= usage; | 
 | 		    __entry->why	= why; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("c=%08x o=%08x u=%d %s", | 
 | 		      __entry->cookie, __entry->obj, __entry->usage, | 
 | 		      __print_symbolic(__entry->why, cachefiles_obj_ref_traces)) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_lookup, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct dentry *dir, | 
 | 		     struct dentry *de), | 
 |  | 
 | 	    TP_ARGS(obj, dir, de), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(short,			error) | 
 | 		    __field(unsigned long,		dino) | 
 | 		    __field(unsigned long,		ino) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->dino	= d_backing_inode(dir)->i_ino; | 
 | 		    __entry->ino	= (!IS_ERR(de) && d_backing_inode(de) ? | 
 | 					   d_backing_inode(de)->i_ino : 0); | 
 | 		    __entry->error	= IS_ERR(de) ? PTR_ERR(de) : 0; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x dB=%lx B=%lx e=%d", | 
 | 		      __entry->obj, __entry->dino, __entry->ino, __entry->error) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_mkdir, | 
 | 	    TP_PROTO(struct dentry *dir, struct dentry *subdir), | 
 |  | 
 | 	    TP_ARGS(dir, subdir), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			dir) | 
 | 		    __field(unsigned int,			subdir) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->dir	= d_backing_inode(dir)->i_ino; | 
 | 		    __entry->subdir	= d_backing_inode(subdir)->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("dB=%x sB=%x", | 
 | 		      __entry->dir, | 
 | 		      __entry->subdir) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_tmpfile, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer), | 
 |  | 
 | 	    TP_ARGS(obj, backer), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_link, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer), | 
 |  | 
 | 	    TP_ARGS(obj, backer), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_unlink, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     ino_t ino, | 
 | 		     enum fscache_why_object_killed why), | 
 |  | 
 | 	    TP_ARGS(obj, ino, why), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(unsigned int,		ino) | 
 | 		    __field(enum fscache_why_object_killed, why) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : UINT_MAX; | 
 | 		    __entry->ino	= ino; | 
 | 		    __entry->why	= why; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x w=%s", | 
 | 		      __entry->obj, __entry->ino, | 
 | 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_rename, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     ino_t ino, | 
 | 		     enum fscache_why_object_killed why), | 
 |  | 
 | 	    TP_ARGS(obj, ino, why), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(unsigned int,		ino) | 
 | 		    __field(enum fscache_why_object_killed, why) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : UINT_MAX; | 
 | 		    __entry->ino	= ino; | 
 | 		    __entry->why	= why; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x w=%s", | 
 | 		      __entry->obj, __entry->ino, | 
 | 		      __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_coherency, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     ino_t ino, | 
 | 		     u64 disk_aux, | 
 | 		     enum cachefiles_content content, | 
 | 		     enum cachefiles_coherency_trace why), | 
 |  | 
 | 	    TP_ARGS(obj, ino, disk_aux, content, why), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(enum cachefiles_coherency_trace,	why) | 
 | 		    __field(enum cachefiles_content,		content) | 
 | 		    __field(u64,				ino) | 
 | 		    __field(u64,				aux) | 
 | 		    __field(u64,				disk_aux) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->why	= why; | 
 | 		    __entry->content	= content; | 
 | 		    __entry->ino	= ino; | 
 | 		    __entry->aux	= be64_to_cpup((__be64 *)obj->cookie->inline_aux); | 
 | 		    __entry->disk_aux	= disk_aux; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x %s B=%llx c=%u aux=%llx dsk=%llx", | 
 | 		      __entry->obj, | 
 | 		      __print_symbolic(__entry->why, cachefiles_coherency_traces), | 
 | 		      __entry->ino, | 
 | 		      __entry->content, | 
 | 		      __entry->aux, | 
 | 		      __entry->disk_aux) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_vol_coherency, | 
 | 	    TP_PROTO(struct cachefiles_volume *volume, | 
 | 		     ino_t ino, | 
 | 		     enum cachefiles_coherency_trace why), | 
 |  | 
 | 	    TP_ARGS(volume, ino, why), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			vol) | 
 | 		    __field(enum cachefiles_coherency_trace,	why) | 
 | 		    __field(u64,				ino) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->vol	= volume->vcookie->debug_id; | 
 | 		    __entry->why	= why; | 
 | 		    __entry->ino	= ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("V=%08x %s B=%llx", | 
 | 		      __entry->vol, | 
 | 		      __print_symbolic(__entry->why, cachefiles_coherency_traces), | 
 | 		      __entry->ino) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_prep_read, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     loff_t start, | 
 | 		     size_t len, | 
 | 		     unsigned short flags, | 
 | 		     enum netfs_io_source source, | 
 | 		     enum cachefiles_prepare_read_trace why, | 
 | 		     ino_t cache_inode, ino_t netfs_inode), | 
 |  | 
 | 	    TP_ARGS(obj, start, len, flags, source, why, cache_inode, netfs_inode), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(unsigned short,		flags) | 
 | 		    __field(enum netfs_io_source,	source) | 
 | 		    __field(enum cachefiles_prepare_read_trace,	why) | 
 | 		    __field(size_t,			len) | 
 | 		    __field(loff_t,			start) | 
 | 		    __field(unsigned int,		netfs_inode) | 
 | 		    __field(unsigned int,		cache_inode) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->flags	= flags; | 
 | 		    __entry->source	= source; | 
 | 		    __entry->why	= why; | 
 | 		    __entry->len	= len; | 
 | 		    __entry->start	= start; | 
 | 		    __entry->netfs_inode = netfs_inode; | 
 | 		    __entry->cache_inode = cache_inode; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x %s %s f=%02x s=%llx %zx ni=%x B=%x", | 
 | 		      __entry->obj, | 
 | 		      __print_symbolic(__entry->source, netfs_sreq_sources), | 
 | 		      __print_symbolic(__entry->why, cachefiles_prepare_read_traces), | 
 | 		      __entry->flags, | 
 | 		      __entry->start, __entry->len, | 
 | 		      __entry->netfs_inode, __entry->cache_inode) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_read, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct inode *backer, | 
 | 		     loff_t start, | 
 | 		     size_t len), | 
 |  | 
 | 	    TP_ARGS(obj, backer, start, len), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 		    __field(size_t,				len) | 
 | 		    __field(loff_t,				start) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->start	= start; | 
 | 		    __entry->len	= len; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x s=%llx l=%zx", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __entry->start, | 
 | 		      __entry->len) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_write, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct inode *backer, | 
 | 		     loff_t start, | 
 | 		     size_t len), | 
 |  | 
 | 	    TP_ARGS(obj, backer, start, len), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 		    __field(size_t,				len) | 
 | 		    __field(loff_t,				start) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->start	= start; | 
 | 		    __entry->len	= len; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x s=%llx l=%zx", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __entry->start, | 
 | 		      __entry->len) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_trunc, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer, | 
 | 		     loff_t from, loff_t to, enum cachefiles_trunc_trace why), | 
 |  | 
 | 	    TP_ARGS(obj, backer, from, to, why), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 		    __field(enum cachefiles_trunc_trace,	why) | 
 | 		    __field(loff_t,				from) | 
 | 		    __field(loff_t,				to) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj->debug_id; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->from	= from; | 
 | 		    __entry->to		= to; | 
 | 		    __entry->why	= why; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x %s l=%llx->%llx", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __print_symbolic(__entry->why, cachefiles_trunc_traces), | 
 | 		      __entry->from, | 
 | 		      __entry->to) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_mark_active, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct inode *inode), | 
 |  | 
 | 	    TP_ARGS(obj, inode), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(ino_t,			inode) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->inode	= inode->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%lx", | 
 | 		      __entry->obj, __entry->inode) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_mark_failed, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct inode *inode), | 
 |  | 
 | 	    TP_ARGS(obj, inode), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(ino_t,			inode) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->inode	= inode->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%lx", | 
 | 		      __entry->obj, __entry->inode) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_mark_inactive, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, | 
 | 		     struct inode *inode), | 
 |  | 
 | 	    TP_ARGS(obj, inode), | 
 |  | 
 | 	    /* Note that obj may be NULL */ | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,		obj) | 
 | 		    __field(ino_t,			inode) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->inode	= inode->i_ino; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%lx", | 
 | 		      __entry->obj, __entry->inode) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_vfs_error, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer, | 
 | 		     int error, enum cachefiles_error_trace where), | 
 |  | 
 | 	    TP_ARGS(obj, backer, error, where), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 		    __field(enum cachefiles_error_trace,	where) | 
 | 		    __field(short,				error) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->error	= error; | 
 | 		    __entry->where	= where; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x %s e=%d", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __print_symbolic(__entry->where, cachefiles_error_traces), | 
 | 		      __entry->error) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_io_error, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer, | 
 | 		     int error, enum cachefiles_error_trace where), | 
 |  | 
 | 	    TP_ARGS(obj, backer, error, where), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,			obj) | 
 | 		    __field(unsigned int,			backer) | 
 | 		    __field(enum cachefiles_error_trace,	where) | 
 | 		    __field(short,				error) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->error	= error; | 
 | 		    __entry->where	= where; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x B=%x %s e=%d", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __print_symbolic(__entry->where, cachefiles_error_traces), | 
 | 		      __entry->error) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_open, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg, | 
 | 		     struct cachefiles_open *load), | 
 |  | 
 | 	    TP_ARGS(obj, msg, load), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	msg_id) | 
 | 		    __field(unsigned int,	object_id) | 
 | 		    __field(unsigned int,	fd) | 
 | 		    __field(unsigned int,	flags) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->msg_id	= msg->msg_id; | 
 | 		    __entry->object_id	= msg->object_id; | 
 | 		    __entry->fd		= load->fd; | 
 | 		    __entry->flags	= load->flags; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->msg_id, | 
 | 		      __entry->object_id, | 
 | 		      __entry->fd, | 
 | 		      __entry->flags) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_copen, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id, | 
 | 		     long len), | 
 |  | 
 | 	    TP_ARGS(obj, msg_id, len), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	msg_id) | 
 | 		    __field(long,		len) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->msg_id	= msg_id; | 
 | 		    __entry->len	= len; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x mid=%x l=%lx", | 
 | 		      __entry->obj, | 
 | 		      __entry->msg_id, | 
 | 		      __entry->len) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_close, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg), | 
 |  | 
 | 	    TP_ARGS(obj, msg), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	msg_id) | 
 | 		    __field(unsigned int,	object_id) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->msg_id	= msg->msg_id; | 
 | 		    __entry->object_id	= msg->object_id; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x mid=%x oid=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->msg_id, | 
 | 		      __entry->object_id) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_read, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg, | 
 | 		     struct cachefiles_read *load), | 
 |  | 
 | 	    TP_ARGS(obj, msg, load), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	msg_id) | 
 | 		    __field(unsigned int,	object_id) | 
 | 		    __field(loff_t,		start) | 
 | 		    __field(size_t,		len) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->msg_id	= msg->msg_id; | 
 | 		    __entry->object_id	= msg->object_id; | 
 | 		    __entry->start	= load->off; | 
 | 		    __entry->len	= load->len; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx", | 
 | 		      __entry->obj, | 
 | 		      __entry->msg_id, | 
 | 		      __entry->object_id, | 
 | 		      __entry->start, | 
 | 		      __entry->len) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_cread, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id), | 
 |  | 
 | 	    TP_ARGS(obj, msg_id), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	msg_id) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->msg_id	= msg_id; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x mid=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->msg_id) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_fd_write, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, struct inode *backer, | 
 | 		     loff_t start, size_t len), | 
 |  | 
 | 	    TP_ARGS(obj, backer, start, len), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	backer) | 
 | 		    __field(loff_t,		start) | 
 | 		    __field(size_t,		len) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->backer	= backer->i_ino; | 
 | 		    __entry->start	= start; | 
 | 		    __entry->len	= len; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x iB=%x s=%llx l=%zx", | 
 | 		      __entry->obj, | 
 | 		      __entry->backer, | 
 | 		      __entry->start, | 
 | 		      __entry->len) | 
 | 	    ); | 
 |  | 
 | TRACE_EVENT(cachefiles_ondemand_fd_release, | 
 | 	    TP_PROTO(struct cachefiles_object *obj, int object_id), | 
 |  | 
 | 	    TP_ARGS(obj, object_id), | 
 |  | 
 | 	    TP_STRUCT__entry( | 
 | 		    __field(unsigned int,	obj) | 
 | 		    __field(unsigned int,	object_id) | 
 | 			     ), | 
 |  | 
 | 	    TP_fast_assign( | 
 | 		    __entry->obj	= obj ? obj->debug_id : 0; | 
 | 		    __entry->object_id	= object_id; | 
 | 			   ), | 
 |  | 
 | 	    TP_printk("o=%08x oid=%x", | 
 | 		      __entry->obj, | 
 | 		      __entry->object_id) | 
 | 	    ); | 
 |  | 
 | #endif /* _TRACE_CACHEFILES_H */ | 
 |  | 
 | /* This part must be outside protection */ | 
 | #include <trace/define_trace.h> |