1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2017 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <darrick.wong@oracle.com> 5 */ 6 #undef TRACE_SYSTEM 7 #define TRACE_SYSTEM xfs_scrub 8 9 #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 10 #define _TRACE_XFS_SCRUB_TRACE_H 11 12 #include <linux/tracepoint.h> 13 #include "xfs_bit.h" 14 15 /* 16 * ftrace's __print_symbolic requires that all enum values be wrapped in the 17 * TRACE_DEFINE_ENUM macro so that the enum value can be encoded in the ftrace 18 * ring buffer. Somehow this was only worth mentioning in the ftrace sample 19 * code. 20 */ 21 TRACE_DEFINE_ENUM(XFS_BTNUM_BNOi); 22 TRACE_DEFINE_ENUM(XFS_BTNUM_CNTi); 23 TRACE_DEFINE_ENUM(XFS_BTNUM_BMAPi); 24 TRACE_DEFINE_ENUM(XFS_BTNUM_INOi); 25 TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi); 26 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi); 27 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi); 28 29 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE); 30 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB); 31 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF); 32 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGFL); 33 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGI); 34 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BNOBT); 35 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_CNTBT); 36 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INOBT); 37 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FINOBT); 38 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RMAPBT); 39 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_REFCNTBT); 40 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_INODE); 41 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTD); 42 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTA); 43 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_BMBTC); 44 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_DIR); 45 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_XATTR); 46 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SYMLINK); 47 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PARENT); 48 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTBITMAP); 49 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_RTSUM); 50 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_UQUOTA); 51 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_GQUOTA); 52 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PQUOTA); 53 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS); 54 55 #define XFS_SCRUB_TYPE_STRINGS \ 56 { XFS_SCRUB_TYPE_PROBE, "probe" }, \ 57 { XFS_SCRUB_TYPE_SB, "sb" }, \ 58 { XFS_SCRUB_TYPE_AGF, "agf" }, \ 59 { XFS_SCRUB_TYPE_AGFL, "agfl" }, \ 60 { XFS_SCRUB_TYPE_AGI, "agi" }, \ 61 { XFS_SCRUB_TYPE_BNOBT, "bnobt" }, \ 62 { XFS_SCRUB_TYPE_CNTBT, "cntbt" }, \ 63 { XFS_SCRUB_TYPE_INOBT, "inobt" }, \ 64 { XFS_SCRUB_TYPE_FINOBT, "finobt" }, \ 65 { XFS_SCRUB_TYPE_RMAPBT, "rmapbt" }, \ 66 { XFS_SCRUB_TYPE_REFCNTBT, "refcountbt" }, \ 67 { XFS_SCRUB_TYPE_INODE, "inode" }, \ 68 { XFS_SCRUB_TYPE_BMBTD, "bmapbtd" }, \ 69 { XFS_SCRUB_TYPE_BMBTA, "bmapbta" }, \ 70 { XFS_SCRUB_TYPE_BMBTC, "bmapbtc" }, \ 71 { XFS_SCRUB_TYPE_DIR, "directory" }, \ 72 { XFS_SCRUB_TYPE_XATTR, "xattr" }, \ 73 { XFS_SCRUB_TYPE_SYMLINK, "symlink" }, \ 74 { XFS_SCRUB_TYPE_PARENT, "parent" }, \ 75 { XFS_SCRUB_TYPE_RTBITMAP, "rtbitmap" }, \ 76 { XFS_SCRUB_TYPE_RTSUM, "rtsummary" }, \ 77 { XFS_SCRUB_TYPE_UQUOTA, "usrquota" }, \ 78 { XFS_SCRUB_TYPE_GQUOTA, "grpquota" }, \ 79 { XFS_SCRUB_TYPE_PQUOTA, "prjquota" }, \ 80 { XFS_SCRUB_TYPE_FSCOUNTERS, "fscounters" } 81 82 DECLARE_EVENT_CLASS(xchk_class, 83 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, 84 int error), 85 TP_ARGS(ip, sm, error), 86 TP_STRUCT__entry( 87 __field(dev_t, dev) 88 __field(xfs_ino_t, ino) 89 __field(unsigned int, type) 90 __field(xfs_agnumber_t, agno) 91 __field(xfs_ino_t, inum) 92 __field(unsigned int, gen) 93 __field(unsigned int, flags) 94 __field(int, error) 95 ), 96 TP_fast_assign( 97 __entry->dev = ip->i_mount->m_super->s_dev; 98 __entry->ino = ip->i_ino; 99 __entry->type = sm->sm_type; 100 __entry->agno = sm->sm_agno; 101 __entry->inum = sm->sm_ino; 102 __entry->gen = sm->sm_gen; 103 __entry->flags = sm->sm_flags; 104 __entry->error = error; 105 ), 106 TP_printk("dev %d:%d ino 0x%llx type %s agno %u inum %llu gen %u flags 0x%x error %d", 107 MAJOR(__entry->dev), MINOR(__entry->dev), 108 __entry->ino, 109 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 110 __entry->agno, 111 __entry->inum, 112 __entry->gen, 113 __entry->flags, 114 __entry->error) 115 ) 116 #define DEFINE_SCRUB_EVENT(name) \ 117 DEFINE_EVENT(xchk_class, name, \ 118 TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \ 119 int error), \ 120 TP_ARGS(ip, sm, error)) 121 122 DEFINE_SCRUB_EVENT(xchk_start); 123 DEFINE_SCRUB_EVENT(xchk_done); 124 DEFINE_SCRUB_EVENT(xchk_deadlock_retry); 125 DEFINE_SCRUB_EVENT(xrep_attempt); 126 DEFINE_SCRUB_EVENT(xrep_done); 127 128 TRACE_EVENT(xchk_op_error, 129 TP_PROTO(struct xfs_scrub *sc, xfs_agnumber_t agno, 130 xfs_agblock_t bno, int error, void *ret_ip), 131 TP_ARGS(sc, agno, bno, error, ret_ip), 132 TP_STRUCT__entry( 133 __field(dev_t, dev) 134 __field(unsigned int, type) 135 __field(xfs_agnumber_t, agno) 136 __field(xfs_agblock_t, bno) 137 __field(int, error) 138 __field(void *, ret_ip) 139 ), 140 TP_fast_assign( 141 __entry->dev = sc->mp->m_super->s_dev; 142 __entry->type = sc->sm->sm_type; 143 __entry->agno = agno; 144 __entry->bno = bno; 145 __entry->error = error; 146 __entry->ret_ip = ret_ip; 147 ), 148 TP_printk("dev %d:%d type %s agno %u agbno %u error %d ret_ip %pS", 149 MAJOR(__entry->dev), MINOR(__entry->dev), 150 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 151 __entry->agno, 152 __entry->bno, 153 __entry->error, 154 __entry->ret_ip) 155 ); 156 157 TRACE_EVENT(xchk_file_op_error, 158 TP_PROTO(struct xfs_scrub *sc, int whichfork, 159 xfs_fileoff_t offset, int error, void *ret_ip), 160 TP_ARGS(sc, whichfork, offset, error, ret_ip), 161 TP_STRUCT__entry( 162 __field(dev_t, dev) 163 __field(xfs_ino_t, ino) 164 __field(int, whichfork) 165 __field(unsigned int, type) 166 __field(xfs_fileoff_t, offset) 167 __field(int, error) 168 __field(void *, ret_ip) 169 ), 170 TP_fast_assign( 171 __entry->dev = sc->ip->i_mount->m_super->s_dev; 172 __entry->ino = sc->ip->i_ino; 173 __entry->whichfork = whichfork; 174 __entry->type = sc->sm->sm_type; 175 __entry->offset = offset; 176 __entry->error = error; 177 __entry->ret_ip = ret_ip; 178 ), 179 TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu error %d ret_ip %pS", 180 MAJOR(__entry->dev), MINOR(__entry->dev), 181 __entry->ino, 182 __entry->whichfork, 183 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 184 __entry->offset, 185 __entry->error, 186 __entry->ret_ip) 187 ); 188 189 DECLARE_EVENT_CLASS(xchk_block_error_class, 190 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, void *ret_ip), 191 TP_ARGS(sc, daddr, ret_ip), 192 TP_STRUCT__entry( 193 __field(dev_t, dev) 194 __field(unsigned int, type) 195 __field(xfs_agnumber_t, agno) 196 __field(xfs_agblock_t, bno) 197 __field(void *, ret_ip) 198 ), 199 TP_fast_assign( 200 xfs_fsblock_t fsbno; 201 xfs_agnumber_t agno; 202 xfs_agblock_t bno; 203 204 fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr); 205 agno = XFS_FSB_TO_AGNO(sc->mp, fsbno); 206 bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno); 207 208 __entry->dev = sc->mp->m_super->s_dev; 209 __entry->type = sc->sm->sm_type; 210 __entry->agno = agno; 211 __entry->bno = bno; 212 __entry->ret_ip = ret_ip; 213 ), 214 TP_printk("dev %d:%d type %s agno %u agbno %u ret_ip %pS", 215 MAJOR(__entry->dev), MINOR(__entry->dev), 216 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 217 __entry->agno, 218 __entry->bno, 219 __entry->ret_ip) 220 ) 221 222 #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \ 223 DEFINE_EVENT(xchk_block_error_class, name, \ 224 TP_PROTO(struct xfs_scrub *sc, xfs_daddr_t daddr, \ 225 void *ret_ip), \ 226 TP_ARGS(sc, daddr, ret_ip)) 227 228 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_fs_error); 229 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_error); 230 DEFINE_SCRUB_BLOCK_ERROR_EVENT(xchk_block_preen); 231 232 DECLARE_EVENT_CLASS(xchk_ino_error_class, 233 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, void *ret_ip), 234 TP_ARGS(sc, ino, ret_ip), 235 TP_STRUCT__entry( 236 __field(dev_t, dev) 237 __field(xfs_ino_t, ino) 238 __field(unsigned int, type) 239 __field(void *, ret_ip) 240 ), 241 TP_fast_assign( 242 __entry->dev = sc->mp->m_super->s_dev; 243 __entry->ino = ino; 244 __entry->type = sc->sm->sm_type; 245 __entry->ret_ip = ret_ip; 246 ), 247 TP_printk("dev %d:%d ino 0x%llx type %s ret_ip %pS", 248 MAJOR(__entry->dev), MINOR(__entry->dev), 249 __entry->ino, 250 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 251 __entry->ret_ip) 252 ) 253 254 #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \ 255 DEFINE_EVENT(xchk_ino_error_class, name, \ 256 TP_PROTO(struct xfs_scrub *sc, xfs_ino_t ino, \ 257 void *ret_ip), \ 258 TP_ARGS(sc, ino, ret_ip)) 259 260 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_error); 261 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_preen); 262 DEFINE_SCRUB_INO_ERROR_EVENT(xchk_ino_warning); 263 264 DECLARE_EVENT_CLASS(xchk_fblock_error_class, 265 TP_PROTO(struct xfs_scrub *sc, int whichfork, 266 xfs_fileoff_t offset, void *ret_ip), 267 TP_ARGS(sc, whichfork, offset, ret_ip), 268 TP_STRUCT__entry( 269 __field(dev_t, dev) 270 __field(xfs_ino_t, ino) 271 __field(int, whichfork) 272 __field(unsigned int, type) 273 __field(xfs_fileoff_t, offset) 274 __field(void *, ret_ip) 275 ), 276 TP_fast_assign( 277 __entry->dev = sc->ip->i_mount->m_super->s_dev; 278 __entry->ino = sc->ip->i_ino; 279 __entry->whichfork = whichfork; 280 __entry->type = sc->sm->sm_type; 281 __entry->offset = offset; 282 __entry->ret_ip = ret_ip; 283 ), 284 TP_printk("dev %d:%d ino 0x%llx fork %d type %s offset %llu ret_ip %pS", 285 MAJOR(__entry->dev), MINOR(__entry->dev), 286 __entry->ino, 287 __entry->whichfork, 288 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 289 __entry->offset, 290 __entry->ret_ip) 291 ); 292 293 #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \ 294 DEFINE_EVENT(xchk_fblock_error_class, name, \ 295 TP_PROTO(struct xfs_scrub *sc, int whichfork, \ 296 xfs_fileoff_t offset, void *ret_ip), \ 297 TP_ARGS(sc, whichfork, offset, ret_ip)) 298 299 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_error); 300 DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xchk_fblock_warning); 301 302 TRACE_EVENT(xchk_incomplete, 303 TP_PROTO(struct xfs_scrub *sc, void *ret_ip), 304 TP_ARGS(sc, ret_ip), 305 TP_STRUCT__entry( 306 __field(dev_t, dev) 307 __field(unsigned int, type) 308 __field(void *, ret_ip) 309 ), 310 TP_fast_assign( 311 __entry->dev = sc->mp->m_super->s_dev; 312 __entry->type = sc->sm->sm_type; 313 __entry->ret_ip = ret_ip; 314 ), 315 TP_printk("dev %d:%d type %s ret_ip %pS", 316 MAJOR(__entry->dev), MINOR(__entry->dev), 317 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 318 __entry->ret_ip) 319 ); 320 321 TRACE_EVENT(xchk_btree_op_error, 322 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, 323 int level, int error, void *ret_ip), 324 TP_ARGS(sc, cur, level, error, ret_ip), 325 TP_STRUCT__entry( 326 __field(dev_t, dev) 327 __field(unsigned int, type) 328 __field(xfs_btnum_t, btnum) 329 __field(int, level) 330 __field(xfs_agnumber_t, agno) 331 __field(xfs_agblock_t, bno) 332 __field(int, ptr); 333 __field(int, error) 334 __field(void *, ret_ip) 335 ), 336 TP_fast_assign( 337 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); 338 339 __entry->dev = sc->mp->m_super->s_dev; 340 __entry->type = sc->sm->sm_type; 341 __entry->btnum = cur->bc_btnum; 342 __entry->level = level; 343 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno); 344 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); 345 __entry->ptr = cur->bc_ptrs[level]; 346 __entry->error = error; 347 __entry->ret_ip = ret_ip; 348 ), 349 TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS", 350 MAJOR(__entry->dev), MINOR(__entry->dev), 351 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 352 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), 353 __entry->level, 354 __entry->ptr, 355 __entry->agno, 356 __entry->bno, 357 __entry->error, 358 __entry->ret_ip) 359 ); 360 361 TRACE_EVENT(xchk_ifork_btree_op_error, 362 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, 363 int level, int error, void *ret_ip), 364 TP_ARGS(sc, cur, level, error, ret_ip), 365 TP_STRUCT__entry( 366 __field(dev_t, dev) 367 __field(xfs_ino_t, ino) 368 __field(int, whichfork) 369 __field(unsigned int, type) 370 __field(xfs_btnum_t, btnum) 371 __field(int, level) 372 __field(int, ptr) 373 __field(xfs_agnumber_t, agno) 374 __field(xfs_agblock_t, bno) 375 __field(int, error) 376 __field(void *, ret_ip) 377 ), 378 TP_fast_assign( 379 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); 380 __entry->dev = sc->mp->m_super->s_dev; 381 __entry->ino = sc->ip->i_ino; 382 __entry->whichfork = cur->bc_private.b.whichfork; 383 __entry->type = sc->sm->sm_type; 384 __entry->btnum = cur->bc_btnum; 385 __entry->level = level; 386 __entry->ptr = cur->bc_ptrs[level]; 387 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno); 388 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); 389 __entry->error = error; 390 __entry->ret_ip = ret_ip; 391 ), 392 TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u error %d ret_ip %pS", 393 MAJOR(__entry->dev), MINOR(__entry->dev), 394 __entry->ino, 395 __entry->whichfork, 396 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 397 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), 398 __entry->level, 399 __entry->ptr, 400 __entry->agno, 401 __entry->bno, 402 __entry->error, 403 __entry->ret_ip) 404 ); 405 406 TRACE_EVENT(xchk_btree_error, 407 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, 408 int level, void *ret_ip), 409 TP_ARGS(sc, cur, level, ret_ip), 410 TP_STRUCT__entry( 411 __field(dev_t, dev) 412 __field(unsigned int, type) 413 __field(xfs_btnum_t, btnum) 414 __field(int, level) 415 __field(xfs_agnumber_t, agno) 416 __field(xfs_agblock_t, bno) 417 __field(int, ptr); 418 __field(void *, ret_ip) 419 ), 420 TP_fast_assign( 421 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); 422 __entry->dev = sc->mp->m_super->s_dev; 423 __entry->type = sc->sm->sm_type; 424 __entry->btnum = cur->bc_btnum; 425 __entry->level = level; 426 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno); 427 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); 428 __entry->ptr = cur->bc_ptrs[level]; 429 __entry->ret_ip = ret_ip; 430 ), 431 TP_printk("dev %d:%d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS", 432 MAJOR(__entry->dev), MINOR(__entry->dev), 433 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 434 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), 435 __entry->level, 436 __entry->ptr, 437 __entry->agno, 438 __entry->bno, 439 __entry->ret_ip) 440 ); 441 442 TRACE_EVENT(xchk_ifork_btree_error, 443 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, 444 int level, void *ret_ip), 445 TP_ARGS(sc, cur, level, ret_ip), 446 TP_STRUCT__entry( 447 __field(dev_t, dev) 448 __field(xfs_ino_t, ino) 449 __field(int, whichfork) 450 __field(unsigned int, type) 451 __field(xfs_btnum_t, btnum) 452 __field(int, level) 453 __field(xfs_agnumber_t, agno) 454 __field(xfs_agblock_t, bno) 455 __field(int, ptr); 456 __field(void *, ret_ip) 457 ), 458 TP_fast_assign( 459 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); 460 __entry->dev = sc->mp->m_super->s_dev; 461 __entry->ino = sc->ip->i_ino; 462 __entry->whichfork = cur->bc_private.b.whichfork; 463 __entry->type = sc->sm->sm_type; 464 __entry->btnum = cur->bc_btnum; 465 __entry->level = level; 466 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno); 467 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); 468 __entry->ptr = cur->bc_ptrs[level]; 469 __entry->ret_ip = ret_ip; 470 ), 471 TP_printk("dev %d:%d ino 0x%llx fork %d type %s btree %s level %d ptr %d agno %u agbno %u ret_ip %pS", 472 MAJOR(__entry->dev), MINOR(__entry->dev), 473 __entry->ino, 474 __entry->whichfork, 475 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 476 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), 477 __entry->level, 478 __entry->ptr, 479 __entry->agno, 480 __entry->bno, 481 __entry->ret_ip) 482 ); 483 484 DECLARE_EVENT_CLASS(xchk_sbtree_class, 485 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, 486 int level), 487 TP_ARGS(sc, cur, level), 488 TP_STRUCT__entry( 489 __field(dev_t, dev) 490 __field(int, type) 491 __field(xfs_btnum_t, btnum) 492 __field(xfs_agnumber_t, agno) 493 __field(xfs_agblock_t, bno) 494 __field(int, level) 495 __field(int, nlevels) 496 __field(int, ptr) 497 ), 498 TP_fast_assign( 499 xfs_fsblock_t fsbno = xchk_btree_cur_fsbno(cur, level); 500 501 __entry->dev = sc->mp->m_super->s_dev; 502 __entry->type = sc->sm->sm_type; 503 __entry->btnum = cur->bc_btnum; 504 __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno); 505 __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); 506 __entry->level = level; 507 __entry->nlevels = cur->bc_nlevels; 508 __entry->ptr = cur->bc_ptrs[level]; 509 ), 510 TP_printk("dev %d:%d type %s btree %s agno %u agbno %u level %d nlevels %d ptr %d", 511 MAJOR(__entry->dev), MINOR(__entry->dev), 512 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 513 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS), 514 __entry->agno, 515 __entry->bno, 516 __entry->level, 517 __entry->nlevels, 518 __entry->ptr) 519 ) 520 #define DEFINE_SCRUB_SBTREE_EVENT(name) \ 521 DEFINE_EVENT(xchk_sbtree_class, name, \ 522 TP_PROTO(struct xfs_scrub *sc, struct xfs_btree_cur *cur, \ 523 int level), \ 524 TP_ARGS(sc, cur, level)) 525 526 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_rec); 527 DEFINE_SCRUB_SBTREE_EVENT(xchk_btree_key); 528 529 TRACE_EVENT(xchk_xref_error, 530 TP_PROTO(struct xfs_scrub *sc, int error, void *ret_ip), 531 TP_ARGS(sc, error, ret_ip), 532 TP_STRUCT__entry( 533 __field(dev_t, dev) 534 __field(int, type) 535 __field(int, error) 536 __field(void *, ret_ip) 537 ), 538 TP_fast_assign( 539 __entry->dev = sc->mp->m_super->s_dev; 540 __entry->type = sc->sm->sm_type; 541 __entry->error = error; 542 __entry->ret_ip = ret_ip; 543 ), 544 TP_printk("dev %d:%d type %s xref error %d ret_ip %pS", 545 MAJOR(__entry->dev), MINOR(__entry->dev), 546 __print_symbolic(__entry->type, XFS_SCRUB_TYPE_STRINGS), 547 __entry->error, 548 __entry->ret_ip) 549 ); 550 551 TRACE_EVENT(xchk_iallocbt_check_cluster, 552 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 553 xfs_agino_t startino, xfs_daddr_t map_daddr, 554 unsigned short map_len, unsigned int chunk_ino, 555 unsigned int nr_inodes, uint16_t cluster_mask, 556 uint16_t holemask, unsigned int cluster_ino), 557 TP_ARGS(mp, agno, startino, map_daddr, map_len, chunk_ino, nr_inodes, 558 cluster_mask, holemask, cluster_ino), 559 TP_STRUCT__entry( 560 __field(dev_t, dev) 561 __field(xfs_agnumber_t, agno) 562 __field(xfs_agino_t, startino) 563 __field(xfs_daddr_t, map_daddr) 564 __field(unsigned short, map_len) 565 __field(unsigned int, chunk_ino) 566 __field(unsigned int, nr_inodes) 567 __field(unsigned int, cluster_ino) 568 __field(uint16_t, cluster_mask) 569 __field(uint16_t, holemask) 570 ), 571 TP_fast_assign( 572 __entry->dev = mp->m_super->s_dev; 573 __entry->agno = agno; 574 __entry->startino = startino; 575 __entry->map_daddr = map_daddr; 576 __entry->map_len = map_len; 577 __entry->chunk_ino = chunk_ino; 578 __entry->nr_inodes = nr_inodes; 579 __entry->cluster_mask = cluster_mask; 580 __entry->holemask = holemask; 581 __entry->cluster_ino = cluster_ino; 582 ), 583 TP_printk("dev %d:%d agno %d startino %u daddr 0x%llx len %d chunkino %u nr_inodes %u cluster_mask 0x%x holemask 0x%x cluster_ino %u", 584 MAJOR(__entry->dev), MINOR(__entry->dev), 585 __entry->agno, 586 __entry->startino, 587 __entry->map_daddr, 588 __entry->map_len, 589 __entry->chunk_ino, 590 __entry->nr_inodes, 591 __entry->cluster_mask, 592 __entry->holemask, 593 __entry->cluster_ino) 594 ) 595 596 TRACE_EVENT(xchk_fscounters_calc, 597 TP_PROTO(struct xfs_mount *mp, uint64_t icount, uint64_t ifree, 598 uint64_t fdblocks, uint64_t delalloc), 599 TP_ARGS(mp, icount, ifree, fdblocks, delalloc), 600 TP_STRUCT__entry( 601 __field(dev_t, dev) 602 __field(int64_t, icount_sb) 603 __field(uint64_t, icount_calculated) 604 __field(int64_t, ifree_sb) 605 __field(uint64_t, ifree_calculated) 606 __field(int64_t, fdblocks_sb) 607 __field(uint64_t, fdblocks_calculated) 608 __field(uint64_t, delalloc) 609 ), 610 TP_fast_assign( 611 __entry->dev = mp->m_super->s_dev; 612 __entry->icount_sb = mp->m_sb.sb_icount; 613 __entry->icount_calculated = icount; 614 __entry->ifree_sb = mp->m_sb.sb_ifree; 615 __entry->ifree_calculated = ifree; 616 __entry->fdblocks_sb = mp->m_sb.sb_fdblocks; 617 __entry->fdblocks_calculated = fdblocks; 618 __entry->delalloc = delalloc; 619 ), 620 TP_printk("dev %d:%d icount %lld:%llu ifree %lld::%llu fdblocks %lld::%llu delalloc %llu", 621 MAJOR(__entry->dev), MINOR(__entry->dev), 622 __entry->icount_sb, 623 __entry->icount_calculated, 624 __entry->ifree_sb, 625 __entry->ifree_calculated, 626 __entry->fdblocks_sb, 627 __entry->fdblocks_calculated, 628 __entry->delalloc) 629 ) 630 631 TRACE_EVENT(xchk_fscounters_within_range, 632 TP_PROTO(struct xfs_mount *mp, uint64_t expected, int64_t curr_value, 633 int64_t old_value), 634 TP_ARGS(mp, expected, curr_value, old_value), 635 TP_STRUCT__entry( 636 __field(dev_t, dev) 637 __field(uint64_t, expected) 638 __field(int64_t, curr_value) 639 __field(int64_t, old_value) 640 ), 641 TP_fast_assign( 642 __entry->dev = mp->m_super->s_dev; 643 __entry->expected = expected; 644 __entry->curr_value = curr_value; 645 __entry->old_value = old_value; 646 ), 647 TP_printk("dev %d:%d expected %llu curr_value %lld old_value %lld", 648 MAJOR(__entry->dev), MINOR(__entry->dev), 649 __entry->expected, 650 __entry->curr_value, 651 __entry->old_value) 652 ) 653 654 /* repair tracepoints */ 655 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) 656 657 DECLARE_EVENT_CLASS(xrep_extent_class, 658 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 659 xfs_agblock_t agbno, xfs_extlen_t len), 660 TP_ARGS(mp, agno, agbno, len), 661 TP_STRUCT__entry( 662 __field(dev_t, dev) 663 __field(xfs_agnumber_t, agno) 664 __field(xfs_agblock_t, agbno) 665 __field(xfs_extlen_t, len) 666 ), 667 TP_fast_assign( 668 __entry->dev = mp->m_super->s_dev; 669 __entry->agno = agno; 670 __entry->agbno = agbno; 671 __entry->len = len; 672 ), 673 TP_printk("dev %d:%d agno %u agbno %u len %u", 674 MAJOR(__entry->dev), MINOR(__entry->dev), 675 __entry->agno, 676 __entry->agbno, 677 __entry->len) 678 ); 679 #define DEFINE_REPAIR_EXTENT_EVENT(name) \ 680 DEFINE_EVENT(xrep_extent_class, name, \ 681 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ 682 xfs_agblock_t agbno, xfs_extlen_t len), \ 683 TP_ARGS(mp, agno, agbno, len)) 684 DEFINE_REPAIR_EXTENT_EVENT(xrep_dispose_btree_extent); 685 DEFINE_REPAIR_EXTENT_EVENT(xrep_agfl_insert); 686 687 DECLARE_EVENT_CLASS(xrep_rmap_class, 688 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 689 xfs_agblock_t agbno, xfs_extlen_t len, 690 uint64_t owner, uint64_t offset, unsigned int flags), 691 TP_ARGS(mp, agno, agbno, len, owner, offset, flags), 692 TP_STRUCT__entry( 693 __field(dev_t, dev) 694 __field(xfs_agnumber_t, agno) 695 __field(xfs_agblock_t, agbno) 696 __field(xfs_extlen_t, len) 697 __field(uint64_t, owner) 698 __field(uint64_t, offset) 699 __field(unsigned int, flags) 700 ), 701 TP_fast_assign( 702 __entry->dev = mp->m_super->s_dev; 703 __entry->agno = agno; 704 __entry->agbno = agbno; 705 __entry->len = len; 706 __entry->owner = owner; 707 __entry->offset = offset; 708 __entry->flags = flags; 709 ), 710 TP_printk("dev %d:%d agno %u agbno %u len %u owner %lld offset %llu flags 0x%x", 711 MAJOR(__entry->dev), MINOR(__entry->dev), 712 __entry->agno, 713 __entry->agbno, 714 __entry->len, 715 __entry->owner, 716 __entry->offset, 717 __entry->flags) 718 ); 719 #define DEFINE_REPAIR_RMAP_EVENT(name) \ 720 DEFINE_EVENT(xrep_rmap_class, name, \ 721 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ 722 xfs_agblock_t agbno, xfs_extlen_t len, \ 723 uint64_t owner, uint64_t offset, unsigned int flags), \ 724 TP_ARGS(mp, agno, agbno, len, owner, offset, flags)) 725 DEFINE_REPAIR_RMAP_EVENT(xrep_alloc_extent_fn); 726 DEFINE_REPAIR_RMAP_EVENT(xrep_ialloc_extent_fn); 727 DEFINE_REPAIR_RMAP_EVENT(xrep_rmap_extent_fn); 728 DEFINE_REPAIR_RMAP_EVENT(xrep_bmap_extent_fn); 729 730 TRACE_EVENT(xrep_refcount_extent_fn, 731 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 732 struct xfs_refcount_irec *irec), 733 TP_ARGS(mp, agno, irec), 734 TP_STRUCT__entry( 735 __field(dev_t, dev) 736 __field(xfs_agnumber_t, agno) 737 __field(xfs_agblock_t, startblock) 738 __field(xfs_extlen_t, blockcount) 739 __field(xfs_nlink_t, refcount) 740 ), 741 TP_fast_assign( 742 __entry->dev = mp->m_super->s_dev; 743 __entry->agno = agno; 744 __entry->startblock = irec->rc_startblock; 745 __entry->blockcount = irec->rc_blockcount; 746 __entry->refcount = irec->rc_refcount; 747 ), 748 TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u", 749 MAJOR(__entry->dev), MINOR(__entry->dev), 750 __entry->agno, 751 __entry->startblock, 752 __entry->blockcount, 753 __entry->refcount) 754 ) 755 756 TRACE_EVENT(xrep_init_btblock, 757 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, 758 xfs_btnum_t btnum), 759 TP_ARGS(mp, agno, agbno, btnum), 760 TP_STRUCT__entry( 761 __field(dev_t, dev) 762 __field(xfs_agnumber_t, agno) 763 __field(xfs_agblock_t, agbno) 764 __field(uint32_t, btnum) 765 ), 766 TP_fast_assign( 767 __entry->dev = mp->m_super->s_dev; 768 __entry->agno = agno; 769 __entry->agbno = agbno; 770 __entry->btnum = btnum; 771 ), 772 TP_printk("dev %d:%d agno %u agbno %u btree %s", 773 MAJOR(__entry->dev), MINOR(__entry->dev), 774 __entry->agno, 775 __entry->agbno, 776 __print_symbolic(__entry->btnum, XFS_BTNUM_STRINGS)) 777 ) 778 TRACE_EVENT(xrep_findroot_block, 779 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, 780 uint32_t magic, uint16_t level), 781 TP_ARGS(mp, agno, agbno, magic, level), 782 TP_STRUCT__entry( 783 __field(dev_t, dev) 784 __field(xfs_agnumber_t, agno) 785 __field(xfs_agblock_t, agbno) 786 __field(uint32_t, magic) 787 __field(uint16_t, level) 788 ), 789 TP_fast_assign( 790 __entry->dev = mp->m_super->s_dev; 791 __entry->agno = agno; 792 __entry->agbno = agbno; 793 __entry->magic = magic; 794 __entry->level = level; 795 ), 796 TP_printk("dev %d:%d agno %u agbno %u magic 0x%x level %u", 797 MAJOR(__entry->dev), MINOR(__entry->dev), 798 __entry->agno, 799 __entry->agbno, 800 __entry->magic, 801 __entry->level) 802 ) 803 TRACE_EVENT(xrep_calc_ag_resblks, 804 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 805 xfs_agino_t icount, xfs_agblock_t aglen, xfs_agblock_t freelen, 806 xfs_agblock_t usedlen), 807 TP_ARGS(mp, agno, icount, aglen, freelen, usedlen), 808 TP_STRUCT__entry( 809 __field(dev_t, dev) 810 __field(xfs_agnumber_t, agno) 811 __field(xfs_agino_t, icount) 812 __field(xfs_agblock_t, aglen) 813 __field(xfs_agblock_t, freelen) 814 __field(xfs_agblock_t, usedlen) 815 ), 816 TP_fast_assign( 817 __entry->dev = mp->m_super->s_dev; 818 __entry->agno = agno; 819 __entry->icount = icount; 820 __entry->aglen = aglen; 821 __entry->freelen = freelen; 822 __entry->usedlen = usedlen; 823 ), 824 TP_printk("dev %d:%d agno %d icount %u aglen %u freelen %u usedlen %u", 825 MAJOR(__entry->dev), MINOR(__entry->dev), 826 __entry->agno, 827 __entry->icount, 828 __entry->aglen, 829 __entry->freelen, 830 __entry->usedlen) 831 ) 832 TRACE_EVENT(xrep_calc_ag_resblks_btsize, 833 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 834 xfs_agblock_t bnobt_sz, xfs_agblock_t inobt_sz, 835 xfs_agblock_t rmapbt_sz, xfs_agblock_t refcbt_sz), 836 TP_ARGS(mp, agno, bnobt_sz, inobt_sz, rmapbt_sz, refcbt_sz), 837 TP_STRUCT__entry( 838 __field(dev_t, dev) 839 __field(xfs_agnumber_t, agno) 840 __field(xfs_agblock_t, bnobt_sz) 841 __field(xfs_agblock_t, inobt_sz) 842 __field(xfs_agblock_t, rmapbt_sz) 843 __field(xfs_agblock_t, refcbt_sz) 844 ), 845 TP_fast_assign( 846 __entry->dev = mp->m_super->s_dev; 847 __entry->agno = agno; 848 __entry->bnobt_sz = bnobt_sz; 849 __entry->inobt_sz = inobt_sz; 850 __entry->rmapbt_sz = rmapbt_sz; 851 __entry->refcbt_sz = refcbt_sz; 852 ), 853 TP_printk("dev %d:%d agno %d bno %u ino %u rmap %u refcount %u", 854 MAJOR(__entry->dev), MINOR(__entry->dev), 855 __entry->agno, 856 __entry->bnobt_sz, 857 __entry->inobt_sz, 858 __entry->rmapbt_sz, 859 __entry->refcbt_sz) 860 ) 861 TRACE_EVENT(xrep_reset_counters, 862 TP_PROTO(struct xfs_mount *mp), 863 TP_ARGS(mp), 864 TP_STRUCT__entry( 865 __field(dev_t, dev) 866 ), 867 TP_fast_assign( 868 __entry->dev = mp->m_super->s_dev; 869 ), 870 TP_printk("dev %d:%d", 871 MAJOR(__entry->dev), MINOR(__entry->dev)) 872 ) 873 874 TRACE_EVENT(xrep_ialloc_insert, 875 TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, 876 xfs_agino_t startino, uint16_t holemask, uint8_t count, 877 uint8_t freecount, uint64_t freemask), 878 TP_ARGS(mp, agno, startino, holemask, count, freecount, freemask), 879 TP_STRUCT__entry( 880 __field(dev_t, dev) 881 __field(xfs_agnumber_t, agno) 882 __field(xfs_agino_t, startino) 883 __field(uint16_t, holemask) 884 __field(uint8_t, count) 885 __field(uint8_t, freecount) 886 __field(uint64_t, freemask) 887 ), 888 TP_fast_assign( 889 __entry->dev = mp->m_super->s_dev; 890 __entry->agno = agno; 891 __entry->startino = startino; 892 __entry->holemask = holemask; 893 __entry->count = count; 894 __entry->freecount = freecount; 895 __entry->freemask = freemask; 896 ), 897 TP_printk("dev %d:%d agno %d startino %u holemask 0x%x count %u freecount %u freemask 0x%llx", 898 MAJOR(__entry->dev), MINOR(__entry->dev), 899 __entry->agno, 900 __entry->startino, 901 __entry->holemask, 902 __entry->count, 903 __entry->freecount, 904 __entry->freemask) 905 ) 906 907 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */ 908 909 #endif /* _TRACE_XFS_SCRUB_TRACE_H */ 910 911 #undef TRACE_INCLUDE_PATH 912 #define TRACE_INCLUDE_PATH . 913 #define TRACE_INCLUDE_FILE scrub/trace 914 #include <trace/define_trace.h> 915