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