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