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