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