linux/fs/nfs/nfstrace.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com>
   4 */
   5#undef TRACE_SYSTEM
   6#define TRACE_SYSTEM nfs
   7
   8#if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ)
   9#define _TRACE_NFS_H
  10
  11#include <linux/tracepoint.h>
  12#include <linux/iversion.h>
  13
  14TRACE_DEFINE_ENUM(DT_UNKNOWN);
  15TRACE_DEFINE_ENUM(DT_FIFO);
  16TRACE_DEFINE_ENUM(DT_CHR);
  17TRACE_DEFINE_ENUM(DT_DIR);
  18TRACE_DEFINE_ENUM(DT_BLK);
  19TRACE_DEFINE_ENUM(DT_REG);
  20TRACE_DEFINE_ENUM(DT_LNK);
  21TRACE_DEFINE_ENUM(DT_SOCK);
  22TRACE_DEFINE_ENUM(DT_WHT);
  23
  24#define nfs_show_file_type(ftype) \
  25        __print_symbolic(ftype, \
  26                        { DT_UNKNOWN, "UNKNOWN" }, \
  27                        { DT_FIFO, "FIFO" }, \
  28                        { DT_CHR, "CHR" }, \
  29                        { DT_DIR, "DIR" }, \
  30                        { DT_BLK, "BLK" }, \
  31                        { DT_REG, "REG" }, \
  32                        { DT_LNK, "LNK" }, \
  33                        { DT_SOCK, "SOCK" }, \
  34                        { DT_WHT, "WHT" })
  35
  36TRACE_DEFINE_ENUM(NFS_INO_INVALID_DATA);
  37TRACE_DEFINE_ENUM(NFS_INO_INVALID_ATIME);
  38TRACE_DEFINE_ENUM(NFS_INO_INVALID_ACCESS);
  39TRACE_DEFINE_ENUM(NFS_INO_INVALID_ACL);
  40TRACE_DEFINE_ENUM(NFS_INO_REVAL_PAGECACHE);
  41TRACE_DEFINE_ENUM(NFS_INO_REVAL_FORCED);
  42TRACE_DEFINE_ENUM(NFS_INO_INVALID_LABEL);
  43TRACE_DEFINE_ENUM(NFS_INO_INVALID_CHANGE);
  44TRACE_DEFINE_ENUM(NFS_INO_INVALID_CTIME);
  45TRACE_DEFINE_ENUM(NFS_INO_INVALID_MTIME);
  46TRACE_DEFINE_ENUM(NFS_INO_INVALID_SIZE);
  47TRACE_DEFINE_ENUM(NFS_INO_INVALID_OTHER);
  48TRACE_DEFINE_ENUM(NFS_INO_DATA_INVAL_DEFER);
  49TRACE_DEFINE_ENUM(NFS_INO_INVALID_BLOCKS);
  50TRACE_DEFINE_ENUM(NFS_INO_INVALID_XATTR);
  51TRACE_DEFINE_ENUM(NFS_INO_INVALID_NLINK);
  52TRACE_DEFINE_ENUM(NFS_INO_INVALID_MODE);
  53
  54#define nfs_show_cache_validity(v) \
  55        __print_flags(v, "|", \
  56                        { NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
  57                        { NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
  58                        { NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
  59                        { NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
  60                        { NFS_INO_REVAL_PAGECACHE, "REVAL_PAGECACHE" }, \
  61                        { NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
  62                        { NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
  63                        { NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
  64                        { NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
  65                        { NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
  66                        { NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
  67                        { NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
  68                        { NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
  69                        { NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
  70                        { NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
  71                        { NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
  72                        { NFS_INO_INVALID_MODE, "INVALID_MODE" })
  73
  74TRACE_DEFINE_ENUM(NFS_INO_ADVISE_RDPLUS);
  75TRACE_DEFINE_ENUM(NFS_INO_STALE);
  76TRACE_DEFINE_ENUM(NFS_INO_ACL_LRU_SET);
  77TRACE_DEFINE_ENUM(NFS_INO_INVALIDATING);
  78TRACE_DEFINE_ENUM(NFS_INO_FSCACHE);
  79TRACE_DEFINE_ENUM(NFS_INO_FSCACHE_LOCK);
  80TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMIT);
  81TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMITTING);
  82TRACE_DEFINE_ENUM(NFS_INO_LAYOUTSTATS);
  83TRACE_DEFINE_ENUM(NFS_INO_ODIRECT);
  84
  85#define nfs_show_nfsi_flags(v) \
  86        __print_flags(v, "|", \
  87                        { BIT(NFS_INO_ADVISE_RDPLUS), "ADVISE_RDPLUS" }, \
  88                        { BIT(NFS_INO_STALE), "STALE" }, \
  89                        { BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
  90                        { BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
  91                        { BIT(NFS_INO_FSCACHE), "FSCACHE" }, \
  92                        { BIT(NFS_INO_FSCACHE_LOCK), "FSCACHE_LOCK" }, \
  93                        { BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
  94                        { BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
  95                        { BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
  96                        { BIT(NFS_INO_ODIRECT), "ODIRECT" })
  97
  98DECLARE_EVENT_CLASS(nfs_inode_event,
  99                TP_PROTO(
 100                        const struct inode *inode
 101                ),
 102
 103                TP_ARGS(inode),
 104
 105                TP_STRUCT__entry(
 106                        __field(dev_t, dev)
 107                        __field(u32, fhandle)
 108                        __field(u64, fileid)
 109                        __field(u64, version)
 110                ),
 111
 112                TP_fast_assign(
 113                        const struct nfs_inode *nfsi = NFS_I(inode);
 114                        __entry->dev = inode->i_sb->s_dev;
 115                        __entry->fileid = nfsi->fileid;
 116                        __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
 117                        __entry->version = inode_peek_iversion_raw(inode);
 118                ),
 119
 120                TP_printk(
 121                        "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
 122                        MAJOR(__entry->dev), MINOR(__entry->dev),
 123                        (unsigned long long)__entry->fileid,
 124                        __entry->fhandle,
 125                        (unsigned long long)__entry->version
 126                )
 127);
 128
 129DECLARE_EVENT_CLASS(nfs_inode_event_done,
 130                TP_PROTO(
 131                        const struct inode *inode,
 132                        int error
 133                ),
 134
 135                TP_ARGS(inode, error),
 136
 137                TP_STRUCT__entry(
 138                        __field(unsigned long, error)
 139                        __field(dev_t, dev)
 140                        __field(u32, fhandle)
 141                        __field(unsigned char, type)
 142                        __field(u64, fileid)
 143                        __field(u64, version)
 144                        __field(loff_t, size)
 145                        __field(unsigned long, nfsi_flags)
 146                        __field(unsigned long, cache_validity)
 147                ),
 148
 149                TP_fast_assign(
 150                        const struct nfs_inode *nfsi = NFS_I(inode);
 151                        __entry->error = error < 0 ? -error : 0;
 152                        __entry->dev = inode->i_sb->s_dev;
 153                        __entry->fileid = nfsi->fileid;
 154                        __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
 155                        __entry->type = nfs_umode_to_dtype(inode->i_mode);
 156                        __entry->version = inode_peek_iversion_raw(inode);
 157                        __entry->size = i_size_read(inode);
 158                        __entry->nfsi_flags = nfsi->flags;
 159                        __entry->cache_validity = nfsi->cache_validity;
 160                ),
 161
 162                TP_printk(
 163                        "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
 164                        "type=%u (%s) version=%llu size=%lld "
 165                        "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
 166                        -__entry->error, nfs_show_status(__entry->error),
 167                        MAJOR(__entry->dev), MINOR(__entry->dev),
 168                        (unsigned long long)__entry->fileid,
 169                        __entry->fhandle,
 170                        __entry->type,
 171                        nfs_show_file_type(__entry->type),
 172                        (unsigned long long)__entry->version,
 173                        (long long)__entry->size,
 174                        __entry->cache_validity,
 175                        nfs_show_cache_validity(__entry->cache_validity),
 176                        __entry->nfsi_flags,
 177                        nfs_show_nfsi_flags(__entry->nfsi_flags)
 178                )
 179);
 180
 181#define DEFINE_NFS_INODE_EVENT(name) \
 182        DEFINE_EVENT(nfs_inode_event, name, \
 183                        TP_PROTO( \
 184                                const struct inode *inode \
 185                        ), \
 186                        TP_ARGS(inode))
 187#define DEFINE_NFS_INODE_EVENT_DONE(name) \
 188        DEFINE_EVENT(nfs_inode_event_done, name, \
 189                        TP_PROTO( \
 190                                const struct inode *inode, \
 191                                int error \
 192                        ), \
 193                        TP_ARGS(inode, error))
 194DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
 195DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
 196DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
 197DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
 198DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
 199DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
 200DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
 201DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
 202DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
 203DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
 204DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
 205DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
 206DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
 207DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
 208DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
 209DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
 210DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
 211DEFINE_NFS_INODE_EVENT(nfs_access_enter);
 212
 213TRACE_EVENT(nfs_access_exit,
 214                TP_PROTO(
 215                        const struct inode *inode,
 216                        unsigned int mask,
 217                        unsigned int permitted,
 218                        int error
 219                ),
 220
 221                TP_ARGS(inode, mask, permitted, error),
 222
 223                TP_STRUCT__entry(
 224                        __field(unsigned long, error)
 225                        __field(dev_t, dev)
 226                        __field(u32, fhandle)
 227                        __field(unsigned char, type)
 228                        __field(u64, fileid)
 229                        __field(u64, version)
 230                        __field(loff_t, size)
 231                        __field(unsigned long, nfsi_flags)
 232                        __field(unsigned long, cache_validity)
 233                        __field(unsigned int, mask)
 234                        __field(unsigned int, permitted)
 235                ),
 236
 237                TP_fast_assign(
 238                        const struct nfs_inode *nfsi = NFS_I(inode);
 239                        __entry->error = error < 0 ? -error : 0;
 240                        __entry->dev = inode->i_sb->s_dev;
 241                        __entry->fileid = nfsi->fileid;
 242                        __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
 243                        __entry->type = nfs_umode_to_dtype(inode->i_mode);
 244                        __entry->version = inode_peek_iversion_raw(inode);
 245                        __entry->size = i_size_read(inode);
 246                        __entry->nfsi_flags = nfsi->flags;
 247                        __entry->cache_validity = nfsi->cache_validity;
 248                        __entry->mask = mask;
 249                        __entry->permitted = permitted;
 250                ),
 251
 252                TP_printk(
 253                        "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
 254                        "type=%u (%s) version=%llu size=%lld "
 255                        "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
 256                        "mask=0x%x permitted=0x%x",
 257                        -__entry->error, nfs_show_status(__entry->error),
 258                        MAJOR(__entry->dev), MINOR(__entry->dev),
 259                        (unsigned long long)__entry->fileid,
 260                        __entry->fhandle,
 261                        __entry->type,
 262                        nfs_show_file_type(__entry->type),
 263                        (unsigned long long)__entry->version,
 264                        (long long)__entry->size,
 265                        __entry->cache_validity,
 266                        nfs_show_cache_validity(__entry->cache_validity),
 267                        __entry->nfsi_flags,
 268                        nfs_show_nfsi_flags(__entry->nfsi_flags),
 269                        __entry->mask, __entry->permitted
 270                )
 271);
 272
 273TRACE_DEFINE_ENUM(LOOKUP_FOLLOW);
 274TRACE_DEFINE_ENUM(LOOKUP_DIRECTORY);
 275TRACE_DEFINE_ENUM(LOOKUP_AUTOMOUNT);
 276TRACE_DEFINE_ENUM(LOOKUP_PARENT);
 277TRACE_DEFINE_ENUM(LOOKUP_REVAL);
 278TRACE_DEFINE_ENUM(LOOKUP_RCU);
 279TRACE_DEFINE_ENUM(LOOKUP_OPEN);
 280TRACE_DEFINE_ENUM(LOOKUP_CREATE);
 281TRACE_DEFINE_ENUM(LOOKUP_EXCL);
 282TRACE_DEFINE_ENUM(LOOKUP_RENAME_TARGET);
 283TRACE_DEFINE_ENUM(LOOKUP_EMPTY);
 284TRACE_DEFINE_ENUM(LOOKUP_DOWN);
 285
 286#define show_lookup_flags(flags) \
 287        __print_flags(flags, "|", \
 288                        { LOOKUP_FOLLOW, "FOLLOW" }, \
 289                        { LOOKUP_DIRECTORY, "DIRECTORY" }, \
 290                        { LOOKUP_AUTOMOUNT, "AUTOMOUNT" }, \
 291                        { LOOKUP_PARENT, "PARENT" }, \
 292                        { LOOKUP_REVAL, "REVAL" }, \
 293                        { LOOKUP_RCU, "RCU" }, \
 294                        { LOOKUP_OPEN, "OPEN" }, \
 295                        { LOOKUP_CREATE, "CREATE" }, \
 296                        { LOOKUP_EXCL, "EXCL" }, \
 297                        { LOOKUP_RENAME_TARGET, "RENAME_TARGET" }, \
 298                        { LOOKUP_EMPTY, "EMPTY" }, \
 299                        { LOOKUP_DOWN, "DOWN" })
 300
 301DECLARE_EVENT_CLASS(nfs_lookup_event,
 302                TP_PROTO(
 303                        const struct inode *dir,
 304                        const struct dentry *dentry,
 305                        unsigned int flags
 306                ),
 307
 308                TP_ARGS(dir, dentry, flags),
 309
 310                TP_STRUCT__entry(
 311                        __field(unsigned long, flags)
 312                        __field(dev_t, dev)
 313                        __field(u64, dir)
 314                        __string(name, dentry->d_name.name)
 315                ),
 316
 317                TP_fast_assign(
 318                        __entry->dev = dir->i_sb->s_dev;
 319                        __entry->dir = NFS_FILEID(dir);
 320                        __entry->flags = flags;
 321                        __assign_str(name, dentry->d_name.name);
 322                ),
 323
 324                TP_printk(
 325                        "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
 326                        __entry->flags,
 327                        show_lookup_flags(__entry->flags),
 328                        MAJOR(__entry->dev), MINOR(__entry->dev),
 329                        (unsigned long long)__entry->dir,
 330                        __get_str(name)
 331                )
 332);
 333
 334#define DEFINE_NFS_LOOKUP_EVENT(name) \
 335        DEFINE_EVENT(nfs_lookup_event, name, \
 336                        TP_PROTO( \
 337                                const struct inode *dir, \
 338                                const struct dentry *dentry, \
 339                                unsigned int flags \
 340                        ), \
 341                        TP_ARGS(dir, dentry, flags))
 342
 343DECLARE_EVENT_CLASS(nfs_lookup_event_done,
 344                TP_PROTO(
 345                        const struct inode *dir,
 346                        const struct dentry *dentry,
 347                        unsigned int flags,
 348                        int error
 349                ),
 350
 351                TP_ARGS(dir, dentry, flags, error),
 352
 353                TP_STRUCT__entry(
 354                        __field(unsigned long, error)
 355                        __field(unsigned long, flags)
 356                        __field(dev_t, dev)
 357                        __field(u64, dir)
 358                        __string(name, dentry->d_name.name)
 359                ),
 360
 361                TP_fast_assign(
 362                        __entry->dev = dir->i_sb->s_dev;
 363                        __entry->dir = NFS_FILEID(dir);
 364                        __entry->error = error < 0 ? -error : 0;
 365                        __entry->flags = flags;
 366                        __assign_str(name, dentry->d_name.name);
 367                ),
 368
 369                TP_printk(
 370                        "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
 371                        -__entry->error, nfs_show_status(__entry->error),
 372                        __entry->flags,
 373                        show_lookup_flags(__entry->flags),
 374                        MAJOR(__entry->dev), MINOR(__entry->dev),
 375                        (unsigned long long)__entry->dir,
 376                        __get_str(name)
 377                )
 378);
 379
 380#define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
 381        DEFINE_EVENT(nfs_lookup_event_done, name, \
 382                        TP_PROTO( \
 383                                const struct inode *dir, \
 384                                const struct dentry *dentry, \
 385                                unsigned int flags, \
 386                                int error \
 387                        ), \
 388                        TP_ARGS(dir, dentry, flags, error))
 389
 390DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
 391DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
 392DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
 393DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
 394
 395TRACE_DEFINE_ENUM(O_WRONLY);
 396TRACE_DEFINE_ENUM(O_RDWR);
 397TRACE_DEFINE_ENUM(O_CREAT);
 398TRACE_DEFINE_ENUM(O_EXCL);
 399TRACE_DEFINE_ENUM(O_NOCTTY);
 400TRACE_DEFINE_ENUM(O_TRUNC);
 401TRACE_DEFINE_ENUM(O_APPEND);
 402TRACE_DEFINE_ENUM(O_NONBLOCK);
 403TRACE_DEFINE_ENUM(O_DSYNC);
 404TRACE_DEFINE_ENUM(O_DIRECT);
 405TRACE_DEFINE_ENUM(O_LARGEFILE);
 406TRACE_DEFINE_ENUM(O_DIRECTORY);
 407TRACE_DEFINE_ENUM(O_NOFOLLOW);
 408TRACE_DEFINE_ENUM(O_NOATIME);
 409TRACE_DEFINE_ENUM(O_CLOEXEC);
 410
 411#define show_open_flags(flags) \
 412        __print_flags(flags, "|", \
 413                { O_WRONLY, "O_WRONLY" }, \
 414                { O_RDWR, "O_RDWR" }, \
 415                { O_CREAT, "O_CREAT" }, \
 416                { O_EXCL, "O_EXCL" }, \
 417                { O_NOCTTY, "O_NOCTTY" }, \
 418                { O_TRUNC, "O_TRUNC" }, \
 419                { O_APPEND, "O_APPEND" }, \
 420                { O_NONBLOCK, "O_NONBLOCK" }, \
 421                { O_DSYNC, "O_DSYNC" }, \
 422                { O_DIRECT, "O_DIRECT" }, \
 423                { O_LARGEFILE, "O_LARGEFILE" }, \
 424                { O_DIRECTORY, "O_DIRECTORY" }, \
 425                { O_NOFOLLOW, "O_NOFOLLOW" }, \
 426                { O_NOATIME, "O_NOATIME" }, \
 427                { O_CLOEXEC, "O_CLOEXEC" })
 428
 429#define show_fmode_flags(mode) \
 430        __print_flags(mode, "|", \
 431                { ((__force unsigned long)FMODE_READ), "READ" }, \
 432                { ((__force unsigned long)FMODE_WRITE), "WRITE" }, \
 433                { ((__force unsigned long)FMODE_EXEC), "EXEC" })
 434
 435TRACE_EVENT(nfs_atomic_open_enter,
 436                TP_PROTO(
 437                        const struct inode *dir,
 438                        const struct nfs_open_context *ctx,
 439                        unsigned int flags
 440                ),
 441
 442                TP_ARGS(dir, ctx, flags),
 443
 444                TP_STRUCT__entry(
 445                        __field(unsigned long, flags)
 446                        __field(unsigned int, fmode)
 447                        __field(dev_t, dev)
 448                        __field(u64, dir)
 449                        __string(name, ctx->dentry->d_name.name)
 450                ),
 451
 452                TP_fast_assign(
 453                        __entry->dev = dir->i_sb->s_dev;
 454                        __entry->dir = NFS_FILEID(dir);
 455                        __entry->flags = flags;
 456                        __entry->fmode = (__force unsigned int)ctx->mode;
 457                        __assign_str(name, ctx->dentry->d_name.name);
 458                ),
 459
 460                TP_printk(
 461                        "flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
 462                        __entry->flags,
 463                        show_open_flags(__entry->flags),
 464                        show_fmode_flags(__entry->fmode),
 465                        MAJOR(__entry->dev), MINOR(__entry->dev),
 466                        (unsigned long long)__entry->dir,
 467                        __get_str(name)
 468                )
 469);
 470
 471TRACE_EVENT(nfs_atomic_open_exit,
 472                TP_PROTO(
 473                        const struct inode *dir,
 474                        const struct nfs_open_context *ctx,
 475                        unsigned int flags,
 476                        int error
 477                ),
 478
 479                TP_ARGS(dir, ctx, flags, error),
 480
 481                TP_STRUCT__entry(
 482                        __field(unsigned long, error)
 483                        __field(unsigned long, flags)
 484                        __field(unsigned int, fmode)
 485                        __field(dev_t, dev)
 486                        __field(u64, dir)
 487                        __string(name, ctx->dentry->d_name.name)
 488                ),
 489
 490                TP_fast_assign(
 491                        __entry->error = -error;
 492                        __entry->dev = dir->i_sb->s_dev;
 493                        __entry->dir = NFS_FILEID(dir);
 494                        __entry->flags = flags;
 495                        __entry->fmode = (__force unsigned int)ctx->mode;
 496                        __assign_str(name, ctx->dentry->d_name.name);
 497                ),
 498
 499                TP_printk(
 500                        "error=%ld (%s) flags=0x%lx (%s) fmode=%s "
 501                        "name=%02x:%02x:%llu/%s",
 502                        -__entry->error, nfs_show_status(__entry->error),
 503                        __entry->flags,
 504                        show_open_flags(__entry->flags),
 505                        show_fmode_flags(__entry->fmode),
 506                        MAJOR(__entry->dev), MINOR(__entry->dev),
 507                        (unsigned long long)__entry->dir,
 508                        __get_str(name)
 509                )
 510);
 511
 512TRACE_EVENT(nfs_create_enter,
 513                TP_PROTO(
 514                        const struct inode *dir,
 515                        const struct dentry *dentry,
 516                        unsigned int flags
 517                ),
 518
 519                TP_ARGS(dir, dentry, flags),
 520
 521                TP_STRUCT__entry(
 522                        __field(unsigned long, flags)
 523                        __field(dev_t, dev)
 524                        __field(u64, dir)
 525                        __string(name, dentry->d_name.name)
 526                ),
 527
 528                TP_fast_assign(
 529                        __entry->dev = dir->i_sb->s_dev;
 530                        __entry->dir = NFS_FILEID(dir);
 531                        __entry->flags = flags;
 532                        __assign_str(name, dentry->d_name.name);
 533                ),
 534
 535                TP_printk(
 536                        "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
 537                        __entry->flags,
 538                        show_open_flags(__entry->flags),
 539                        MAJOR(__entry->dev), MINOR(__entry->dev),
 540                        (unsigned long long)__entry->dir,
 541                        __get_str(name)
 542                )
 543);
 544
 545TRACE_EVENT(nfs_create_exit,
 546                TP_PROTO(
 547                        const struct inode *dir,
 548                        const struct dentry *dentry,
 549                        unsigned int flags,
 550                        int error
 551                ),
 552
 553                TP_ARGS(dir, dentry, flags, error),
 554
 555                TP_STRUCT__entry(
 556                        __field(unsigned long, error)
 557                        __field(unsigned long, flags)
 558                        __field(dev_t, dev)
 559                        __field(u64, dir)
 560                        __string(name, dentry->d_name.name)
 561                ),
 562
 563                TP_fast_assign(
 564                        __entry->error = -error;
 565                        __entry->dev = dir->i_sb->s_dev;
 566                        __entry->dir = NFS_FILEID(dir);
 567                        __entry->flags = flags;
 568                        __assign_str(name, dentry->d_name.name);
 569                ),
 570
 571                TP_printk(
 572                        "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
 573                        -__entry->error, nfs_show_status(__entry->error),
 574                        __entry->flags,
 575                        show_open_flags(__entry->flags),
 576                        MAJOR(__entry->dev), MINOR(__entry->dev),
 577                        (unsigned long long)__entry->dir,
 578                        __get_str(name)
 579                )
 580);
 581
 582DECLARE_EVENT_CLASS(nfs_directory_event,
 583                TP_PROTO(
 584                        const struct inode *dir,
 585                        const struct dentry *dentry
 586                ),
 587
 588                TP_ARGS(dir, dentry),
 589
 590                TP_STRUCT__entry(
 591                        __field(dev_t, dev)
 592                        __field(u64, dir)
 593                        __string(name, dentry->d_name.name)
 594                ),
 595
 596                TP_fast_assign(
 597                        __entry->dev = dir->i_sb->s_dev;
 598                        __entry->dir = NFS_FILEID(dir);
 599                        __assign_str(name, dentry->d_name.name);
 600                ),
 601
 602                TP_printk(
 603                        "name=%02x:%02x:%llu/%s",
 604                        MAJOR(__entry->dev), MINOR(__entry->dev),
 605                        (unsigned long long)__entry->dir,
 606                        __get_str(name)
 607                )
 608);
 609
 610#define DEFINE_NFS_DIRECTORY_EVENT(name) \
 611        DEFINE_EVENT(nfs_directory_event, name, \
 612                        TP_PROTO( \
 613                                const struct inode *dir, \
 614                                const struct dentry *dentry \
 615                        ), \
 616                        TP_ARGS(dir, dentry))
 617
 618DECLARE_EVENT_CLASS(nfs_directory_event_done,
 619                TP_PROTO(
 620                        const struct inode *dir,
 621                        const struct dentry *dentry,
 622                        int error
 623                ),
 624
 625                TP_ARGS(dir, dentry, error),
 626
 627                TP_STRUCT__entry(
 628                        __field(unsigned long, error)
 629                        __field(dev_t, dev)
 630                        __field(u64, dir)
 631                        __string(name, dentry->d_name.name)
 632                ),
 633
 634                TP_fast_assign(
 635                        __entry->dev = dir->i_sb->s_dev;
 636                        __entry->dir = NFS_FILEID(dir);
 637                        __entry->error = error < 0 ? -error : 0;
 638                        __assign_str(name, dentry->d_name.name);
 639                ),
 640
 641                TP_printk(
 642                        "error=%ld (%s) name=%02x:%02x:%llu/%s",
 643                        -__entry->error, nfs_show_status(__entry->error),
 644                        MAJOR(__entry->dev), MINOR(__entry->dev),
 645                        (unsigned long long)__entry->dir,
 646                        __get_str(name)
 647                )
 648);
 649
 650#define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
 651        DEFINE_EVENT(nfs_directory_event_done, name, \
 652                        TP_PROTO( \
 653                                const struct inode *dir, \
 654                                const struct dentry *dentry, \
 655                                int error \
 656                        ), \
 657                        TP_ARGS(dir, dentry, error))
 658
 659DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
 660DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
 661DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
 662DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
 663DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
 664DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
 665DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
 666DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
 667DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
 668DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
 669DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
 670DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
 671
 672TRACE_EVENT(nfs_link_enter,
 673                TP_PROTO(
 674                        const struct inode *inode,
 675                        const struct inode *dir,
 676                        const struct dentry *dentry
 677                ),
 678
 679                TP_ARGS(inode, dir, dentry),
 680
 681                TP_STRUCT__entry(
 682                        __field(dev_t, dev)
 683                        __field(u64, fileid)
 684                        __field(u64, dir)
 685                        __string(name, dentry->d_name.name)
 686                ),
 687
 688                TP_fast_assign(
 689                        __entry->dev = inode->i_sb->s_dev;
 690                        __entry->fileid = NFS_FILEID(inode);
 691                        __entry->dir = NFS_FILEID(dir);
 692                        __assign_str(name, dentry->d_name.name);
 693                ),
 694
 695                TP_printk(
 696                        "fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
 697                        MAJOR(__entry->dev), MINOR(__entry->dev),
 698                        __entry->fileid,
 699                        MAJOR(__entry->dev), MINOR(__entry->dev),
 700                        (unsigned long long)__entry->dir,
 701                        __get_str(name)
 702                )
 703);
 704
 705TRACE_EVENT(nfs_link_exit,
 706                TP_PROTO(
 707                        const struct inode *inode,
 708                        const struct inode *dir,
 709                        const struct dentry *dentry,
 710                        int error
 711                ),
 712
 713                TP_ARGS(inode, dir, dentry, error),
 714
 715                TP_STRUCT__entry(
 716                        __field(unsigned long, error)
 717                        __field(dev_t, dev)
 718                        __field(u64, fileid)
 719                        __field(u64, dir)
 720                        __string(name, dentry->d_name.name)
 721                ),
 722
 723                TP_fast_assign(
 724                        __entry->dev = inode->i_sb->s_dev;
 725                        __entry->fileid = NFS_FILEID(inode);
 726                        __entry->dir = NFS_FILEID(dir);
 727                        __entry->error = error < 0 ? -error : 0;
 728                        __assign_str(name, dentry->d_name.name);
 729                ),
 730
 731                TP_printk(
 732                        "error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
 733                        -__entry->error, nfs_show_status(__entry->error),
 734                        MAJOR(__entry->dev), MINOR(__entry->dev),
 735                        __entry->fileid,
 736                        MAJOR(__entry->dev), MINOR(__entry->dev),
 737                        (unsigned long long)__entry->dir,
 738                        __get_str(name)
 739                )
 740);
 741
 742DECLARE_EVENT_CLASS(nfs_rename_event,
 743                TP_PROTO(
 744                        const struct inode *old_dir,
 745                        const struct dentry *old_dentry,
 746                        const struct inode *new_dir,
 747                        const struct dentry *new_dentry
 748                ),
 749
 750                TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
 751
 752                TP_STRUCT__entry(
 753                        __field(dev_t, dev)
 754                        __field(u64, old_dir)
 755                        __field(u64, new_dir)
 756                        __string(old_name, old_dentry->d_name.name)
 757                        __string(new_name, new_dentry->d_name.name)
 758                ),
 759
 760                TP_fast_assign(
 761                        __entry->dev = old_dir->i_sb->s_dev;
 762                        __entry->old_dir = NFS_FILEID(old_dir);
 763                        __entry->new_dir = NFS_FILEID(new_dir);
 764                        __assign_str(old_name, old_dentry->d_name.name);
 765                        __assign_str(new_name, new_dentry->d_name.name);
 766                ),
 767
 768                TP_printk(
 769                        "old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
 770                        MAJOR(__entry->dev), MINOR(__entry->dev),
 771                        (unsigned long long)__entry->old_dir,
 772                        __get_str(old_name),
 773                        MAJOR(__entry->dev), MINOR(__entry->dev),
 774                        (unsigned long long)__entry->new_dir,
 775                        __get_str(new_name)
 776                )
 777);
 778#define DEFINE_NFS_RENAME_EVENT(name) \
 779        DEFINE_EVENT(nfs_rename_event, name, \
 780                        TP_PROTO( \
 781                                const struct inode *old_dir, \
 782                                const struct dentry *old_dentry, \
 783                                const struct inode *new_dir, \
 784                                const struct dentry *new_dentry \
 785                        ), \
 786                        TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
 787
 788DECLARE_EVENT_CLASS(nfs_rename_event_done,
 789                TP_PROTO(
 790                        const struct inode *old_dir,
 791                        const struct dentry *old_dentry,
 792                        const struct inode *new_dir,
 793                        const struct dentry *new_dentry,
 794                        int error
 795                ),
 796
 797                TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
 798
 799                TP_STRUCT__entry(
 800                        __field(dev_t, dev)
 801                        __field(unsigned long, error)
 802                        __field(u64, old_dir)
 803                        __string(old_name, old_dentry->d_name.name)
 804                        __field(u64, new_dir)
 805                        __string(new_name, new_dentry->d_name.name)
 806                ),
 807
 808                TP_fast_assign(
 809                        __entry->dev = old_dir->i_sb->s_dev;
 810                        __entry->error = -error;
 811                        __entry->old_dir = NFS_FILEID(old_dir);
 812                        __entry->new_dir = NFS_FILEID(new_dir);
 813                        __assign_str(old_name, old_dentry->d_name.name);
 814                        __assign_str(new_name, new_dentry->d_name.name);
 815                ),
 816
 817                TP_printk(
 818                        "error=%ld (%s) old_name=%02x:%02x:%llu/%s "
 819                        "new_name=%02x:%02x:%llu/%s",
 820                        -__entry->error, nfs_show_status(__entry->error),
 821                        MAJOR(__entry->dev), MINOR(__entry->dev),
 822                        (unsigned long long)__entry->old_dir,
 823                        __get_str(old_name),
 824                        MAJOR(__entry->dev), MINOR(__entry->dev),
 825                        (unsigned long long)__entry->new_dir,
 826                        __get_str(new_name)
 827                )
 828);
 829#define DEFINE_NFS_RENAME_EVENT_DONE(name) \
 830        DEFINE_EVENT(nfs_rename_event_done, name, \
 831                        TP_PROTO( \
 832                                const struct inode *old_dir, \
 833                                const struct dentry *old_dentry, \
 834                                const struct inode *new_dir, \
 835                                const struct dentry *new_dentry, \
 836                                int error \
 837                        ), \
 838                        TP_ARGS(old_dir, old_dentry, new_dir, \
 839                                new_dentry, error))
 840
 841DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
 842DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
 843
 844DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
 845
 846TRACE_EVENT(nfs_sillyrename_unlink,
 847                TP_PROTO(
 848                        const struct nfs_unlinkdata *data,
 849                        int error
 850                ),
 851
 852                TP_ARGS(data, error),
 853
 854                TP_STRUCT__entry(
 855                        __field(dev_t, dev)
 856                        __field(unsigned long, error)
 857                        __field(u64, dir)
 858                        __dynamic_array(char, name, data->args.name.len + 1)
 859                ),
 860
 861                TP_fast_assign(
 862                        struct inode *dir = d_inode(data->dentry->d_parent);
 863                        size_t len = data->args.name.len;
 864                        __entry->dev = dir->i_sb->s_dev;
 865                        __entry->dir = NFS_FILEID(dir);
 866                        __entry->error = -error;
 867                        memcpy(__get_str(name),
 868                                data->args.name.name, len);
 869                        __get_str(name)[len] = 0;
 870                ),
 871
 872                TP_printk(
 873                        "error=%ld (%s) name=%02x:%02x:%llu/%s",
 874                        -__entry->error, nfs_show_status(__entry->error),
 875                        MAJOR(__entry->dev), MINOR(__entry->dev),
 876                        (unsigned long long)__entry->dir,
 877                        __get_str(name)
 878                )
 879);
 880
 881TRACE_EVENT(nfs_initiate_read,
 882                TP_PROTO(
 883                        const struct nfs_pgio_header *hdr
 884                ),
 885
 886                TP_ARGS(hdr),
 887
 888                TP_STRUCT__entry(
 889                        __field(dev_t, dev)
 890                        __field(u32, fhandle)
 891                        __field(u64, fileid)
 892                        __field(loff_t, offset)
 893                        __field(u32, count)
 894                ),
 895
 896                TP_fast_assign(
 897                        const struct inode *inode = hdr->inode;
 898                        const struct nfs_inode *nfsi = NFS_I(inode);
 899                        const struct nfs_fh *fh = hdr->args.fh ?
 900                                                  hdr->args.fh : &nfsi->fh;
 901
 902                        __entry->offset = hdr->args.offset;
 903                        __entry->count = hdr->args.count;
 904                        __entry->dev = inode->i_sb->s_dev;
 905                        __entry->fileid = nfsi->fileid;
 906                        __entry->fhandle = nfs_fhandle_hash(fh);
 907                ),
 908
 909                TP_printk(
 910                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
 911                        "offset=%lld count=%u",
 912                        MAJOR(__entry->dev), MINOR(__entry->dev),
 913                        (unsigned long long)__entry->fileid,
 914                        __entry->fhandle,
 915                        (long long)__entry->offset, __entry->count
 916                )
 917);
 918
 919TRACE_EVENT(nfs_readpage_done,
 920                TP_PROTO(
 921                        const struct rpc_task *task,
 922                        const struct nfs_pgio_header *hdr
 923                ),
 924
 925                TP_ARGS(task, hdr),
 926
 927                TP_STRUCT__entry(
 928                        __field(dev_t, dev)
 929                        __field(u32, fhandle)
 930                        __field(u64, fileid)
 931                        __field(loff_t, offset)
 932                        __field(u32, arg_count)
 933                        __field(u32, res_count)
 934                        __field(bool, eof)
 935                        __field(int, status)
 936                ),
 937
 938                TP_fast_assign(
 939                        const struct inode *inode = hdr->inode;
 940                        const struct nfs_inode *nfsi = NFS_I(inode);
 941                        const struct nfs_fh *fh = hdr->args.fh ?
 942                                                  hdr->args.fh : &nfsi->fh;
 943
 944                        __entry->status = task->tk_status;
 945                        __entry->offset = hdr->args.offset;
 946                        __entry->arg_count = hdr->args.count;
 947                        __entry->res_count = hdr->res.count;
 948                        __entry->eof = hdr->res.eof;
 949                        __entry->dev = inode->i_sb->s_dev;
 950                        __entry->fileid = nfsi->fileid;
 951                        __entry->fhandle = nfs_fhandle_hash(fh);
 952                ),
 953
 954                TP_printk(
 955                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
 956                        "offset=%lld count=%u res=%u status=%d%s",
 957                        MAJOR(__entry->dev), MINOR(__entry->dev),
 958                        (unsigned long long)__entry->fileid,
 959                        __entry->fhandle,
 960                        (long long)__entry->offset, __entry->arg_count,
 961                        __entry->res_count, __entry->status,
 962                        __entry->eof ? " eof" : ""
 963                )
 964);
 965
 966TRACE_EVENT(nfs_readpage_short,
 967                TP_PROTO(
 968                        const struct rpc_task *task,
 969                        const struct nfs_pgio_header *hdr
 970                ),
 971
 972                TP_ARGS(task, hdr),
 973
 974                TP_STRUCT__entry(
 975                        __field(dev_t, dev)
 976                        __field(u32, fhandle)
 977                        __field(u64, fileid)
 978                        __field(loff_t, offset)
 979                        __field(u32, arg_count)
 980                        __field(u32, res_count)
 981                        __field(bool, eof)
 982                        __field(int, status)
 983                ),
 984
 985                TP_fast_assign(
 986                        const struct inode *inode = hdr->inode;
 987                        const struct nfs_inode *nfsi = NFS_I(inode);
 988                        const struct nfs_fh *fh = hdr->args.fh ?
 989                                                  hdr->args.fh : &nfsi->fh;
 990
 991                        __entry->status = task->tk_status;
 992                        __entry->offset = hdr->args.offset;
 993                        __entry->arg_count = hdr->args.count;
 994                        __entry->res_count = hdr->res.count;
 995                        __entry->eof = hdr->res.eof;
 996                        __entry->dev = inode->i_sb->s_dev;
 997                        __entry->fileid = nfsi->fileid;
 998                        __entry->fhandle = nfs_fhandle_hash(fh);
 999                ),
1000
1001                TP_printk(
1002                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
1003                        "offset=%lld count=%u res=%u status=%d%s",
1004                        MAJOR(__entry->dev), MINOR(__entry->dev),
1005                        (unsigned long long)__entry->fileid,
1006                        __entry->fhandle,
1007                        (long long)__entry->offset, __entry->arg_count,
1008                        __entry->res_count, __entry->status,
1009                        __entry->eof ? " eof" : ""
1010                )
1011);
1012
1013TRACE_EVENT(nfs_pgio_error,
1014        TP_PROTO(
1015                const struct nfs_pgio_header *hdr,
1016                int error,
1017                loff_t pos
1018        ),
1019
1020        TP_ARGS(hdr, error, pos),
1021
1022        TP_STRUCT__entry(
1023                __field(dev_t, dev)
1024                __field(u32, fhandle)
1025                __field(u64, fileid)
1026                __field(loff_t, offset)
1027                __field(u32, arg_count)
1028                __field(u32, res_count)
1029                __field(loff_t, pos)
1030                __field(int, status)
1031        ),
1032
1033        TP_fast_assign(
1034                const struct inode *inode = hdr->inode;
1035                const struct nfs_inode *nfsi = NFS_I(inode);
1036                const struct nfs_fh *fh = hdr->args.fh ?
1037                                          hdr->args.fh : &nfsi->fh;
1038
1039                __entry->status = error;
1040                __entry->offset = hdr->args.offset;
1041                __entry->arg_count = hdr->args.count;
1042                __entry->res_count = hdr->res.count;
1043                __entry->dev = inode->i_sb->s_dev;
1044                __entry->fileid = nfsi->fileid;
1045                __entry->fhandle = nfs_fhandle_hash(fh);
1046        ),
1047
1048        TP_printk("fileid=%02x:%02x:%llu fhandle=0x%08x "
1049                  "offset=%lld count=%u res=%u pos=%llu status=%d",
1050                MAJOR(__entry->dev), MINOR(__entry->dev),
1051                (unsigned long long)__entry->fileid, __entry->fhandle,
1052                (long long)__entry->offset, __entry->arg_count, __entry->res_count,
1053                __entry->pos, __entry->status
1054        )
1055);
1056
1057TRACE_DEFINE_ENUM(NFS_UNSTABLE);
1058TRACE_DEFINE_ENUM(NFS_DATA_SYNC);
1059TRACE_DEFINE_ENUM(NFS_FILE_SYNC);
1060
1061#define nfs_show_stable(stable) \
1062        __print_symbolic(stable, \
1063                        { NFS_UNSTABLE, "UNSTABLE" }, \
1064                        { NFS_DATA_SYNC, "DATA_SYNC" }, \
1065                        { NFS_FILE_SYNC, "FILE_SYNC" })
1066
1067TRACE_EVENT(nfs_initiate_write,
1068                TP_PROTO(
1069                        const struct nfs_pgio_header *hdr
1070                ),
1071
1072                TP_ARGS(hdr),
1073
1074                TP_STRUCT__entry(
1075                        __field(dev_t, dev)
1076                        __field(u32, fhandle)
1077                        __field(u64, fileid)
1078                        __field(loff_t, offset)
1079                        __field(u32, count)
1080                        __field(enum nfs3_stable_how, stable)
1081                ),
1082
1083                TP_fast_assign(
1084                        const struct inode *inode = hdr->inode;
1085                        const struct nfs_inode *nfsi = NFS_I(inode);
1086                        const struct nfs_fh *fh = hdr->args.fh ?
1087                                                  hdr->args.fh : &nfsi->fh;
1088
1089                        __entry->offset = hdr->args.offset;
1090                        __entry->count = hdr->args.count;
1091                        __entry->stable = hdr->args.stable;
1092                        __entry->dev = inode->i_sb->s_dev;
1093                        __entry->fileid = nfsi->fileid;
1094                        __entry->fhandle = nfs_fhandle_hash(fh);
1095                ),
1096
1097                TP_printk(
1098                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
1099                        "offset=%lld count=%u stable=%s",
1100                        MAJOR(__entry->dev), MINOR(__entry->dev),
1101                        (unsigned long long)__entry->fileid,
1102                        __entry->fhandle,
1103                        (long long)__entry->offset, __entry->count,
1104                        nfs_show_stable(__entry->stable)
1105                )
1106);
1107
1108TRACE_EVENT(nfs_writeback_done,
1109                TP_PROTO(
1110                        const struct rpc_task *task,
1111                        const struct nfs_pgio_header *hdr
1112                ),
1113
1114                TP_ARGS(task, hdr),
1115
1116                TP_STRUCT__entry(
1117                        __field(dev_t, dev)
1118                        __field(u32, fhandle)
1119                        __field(u64, fileid)
1120                        __field(loff_t, offset)
1121                        __field(u32, arg_count)
1122                        __field(u32, res_count)
1123                        __field(int, status)
1124                        __field(enum nfs3_stable_how, stable)
1125                        __array(char, verifier, NFS4_VERIFIER_SIZE)
1126                ),
1127
1128                TP_fast_assign(
1129                        const struct inode *inode = hdr->inode;
1130                        const struct nfs_inode *nfsi = NFS_I(inode);
1131                        const struct nfs_fh *fh = hdr->args.fh ?
1132                                                  hdr->args.fh : &nfsi->fh;
1133                        const struct nfs_writeverf *verf = hdr->res.verf;
1134
1135                        __entry->status = task->tk_status;
1136                        __entry->offset = hdr->args.offset;
1137                        __entry->arg_count = hdr->args.count;
1138                        __entry->res_count = hdr->res.count;
1139                        __entry->stable = verf->committed;
1140                        memcpy(__entry->verifier,
1141                                &verf->verifier,
1142                                NFS4_VERIFIER_SIZE);
1143                        __entry->dev = inode->i_sb->s_dev;
1144                        __entry->fileid = nfsi->fileid;
1145                        __entry->fhandle = nfs_fhandle_hash(fh);
1146                ),
1147
1148                TP_printk(
1149                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
1150                        "offset=%lld count=%u res=%u status=%d stable=%s "
1151                        "verifier=%s",
1152                        MAJOR(__entry->dev), MINOR(__entry->dev),
1153                        (unsigned long long)__entry->fileid,
1154                        __entry->fhandle,
1155                        (long long)__entry->offset, __entry->arg_count,
1156                        __entry->res_count, __entry->status,
1157                        nfs_show_stable(__entry->stable),
1158                        __print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
1159                )
1160);
1161
1162DECLARE_EVENT_CLASS(nfs_page_error_class,
1163                TP_PROTO(
1164                        const struct nfs_page *req,
1165                        int error
1166                ),
1167
1168                TP_ARGS(req, error),
1169
1170                TP_STRUCT__entry(
1171                        __field(const void *, req)
1172                        __field(pgoff_t, index)
1173                        __field(unsigned int, offset)
1174                        __field(unsigned int, pgbase)
1175                        __field(unsigned int, bytes)
1176                        __field(int, error)
1177                ),
1178
1179                TP_fast_assign(
1180                        __entry->req = req;
1181                        __entry->index = req->wb_index;
1182                        __entry->offset = req->wb_offset;
1183                        __entry->pgbase = req->wb_pgbase;
1184                        __entry->bytes = req->wb_bytes;
1185                        __entry->error = error;
1186                ),
1187
1188                TP_printk(
1189                        "req=%p index=%lu offset=%u pgbase=%u bytes=%u error=%d",
1190                        __entry->req, __entry->index, __entry->offset,
1191                        __entry->pgbase, __entry->bytes, __entry->error
1192                )
1193);
1194
1195#define DEFINE_NFS_PAGEERR_EVENT(name) \
1196        DEFINE_EVENT(nfs_page_error_class, name, \
1197                        TP_PROTO( \
1198                                const struct nfs_page *req, \
1199                                int error \
1200                        ), \
1201                        TP_ARGS(req, error))
1202
1203DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
1204DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
1205DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
1206
1207TRACE_EVENT(nfs_initiate_commit,
1208                TP_PROTO(
1209                        const struct nfs_commit_data *data
1210                ),
1211
1212                TP_ARGS(data),
1213
1214                TP_STRUCT__entry(
1215                        __field(dev_t, dev)
1216                        __field(u32, fhandle)
1217                        __field(u64, fileid)
1218                        __field(loff_t, offset)
1219                        __field(u32, count)
1220                ),
1221
1222                TP_fast_assign(
1223                        const struct inode *inode = data->inode;
1224                        const struct nfs_inode *nfsi = NFS_I(inode);
1225                        const struct nfs_fh *fh = data->args.fh ?
1226                                                  data->args.fh : &nfsi->fh;
1227
1228                        __entry->offset = data->args.offset;
1229                        __entry->count = data->args.count;
1230                        __entry->dev = inode->i_sb->s_dev;
1231                        __entry->fileid = nfsi->fileid;
1232                        __entry->fhandle = nfs_fhandle_hash(fh);
1233                ),
1234
1235                TP_printk(
1236                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
1237                        "offset=%lld count=%u",
1238                        MAJOR(__entry->dev), MINOR(__entry->dev),
1239                        (unsigned long long)__entry->fileid,
1240                        __entry->fhandle,
1241                        (long long)__entry->offset, __entry->count
1242                )
1243);
1244
1245TRACE_EVENT(nfs_commit_done,
1246                TP_PROTO(
1247                        const struct rpc_task *task,
1248                        const struct nfs_commit_data *data
1249                ),
1250
1251                TP_ARGS(task, data),
1252
1253                TP_STRUCT__entry(
1254                        __field(dev_t, dev)
1255                        __field(u32, fhandle)
1256                        __field(u64, fileid)
1257                        __field(loff_t, offset)
1258                        __field(int, status)
1259                        __field(enum nfs3_stable_how, stable)
1260                        __array(char, verifier, NFS4_VERIFIER_SIZE)
1261                ),
1262
1263                TP_fast_assign(
1264                        const struct inode *inode = data->inode;
1265                        const struct nfs_inode *nfsi = NFS_I(inode);
1266                        const struct nfs_fh *fh = data->args.fh ?
1267                                                  data->args.fh : &nfsi->fh;
1268                        const struct nfs_writeverf *verf = data->res.verf;
1269
1270                        __entry->status = task->tk_status;
1271                        __entry->offset = data->args.offset;
1272                        __entry->stable = verf->committed;
1273                        memcpy(__entry->verifier,
1274                                &verf->verifier,
1275                                NFS4_VERIFIER_SIZE);
1276                        __entry->dev = inode->i_sb->s_dev;
1277                        __entry->fileid = nfsi->fileid;
1278                        __entry->fhandle = nfs_fhandle_hash(fh);
1279                ),
1280
1281                TP_printk(
1282                        "fileid=%02x:%02x:%llu fhandle=0x%08x "
1283                        "offset=%lld status=%d stable=%s verifier=%s",
1284                        MAJOR(__entry->dev), MINOR(__entry->dev),
1285                        (unsigned long long)__entry->fileid,
1286                        __entry->fhandle,
1287                        (long long)__entry->offset, __entry->status,
1288                        nfs_show_stable(__entry->stable),
1289                        __print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
1290                )
1291);
1292
1293TRACE_EVENT(nfs_fh_to_dentry,
1294                TP_PROTO(
1295                        const struct super_block *sb,
1296                        const struct nfs_fh *fh,
1297                        u64 fileid,
1298                        int error
1299                ),
1300
1301                TP_ARGS(sb, fh, fileid, error),
1302
1303                TP_STRUCT__entry(
1304                        __field(int, error)
1305                        __field(dev_t, dev)
1306                        __field(u32, fhandle)
1307                        __field(u64, fileid)
1308                ),
1309
1310                TP_fast_assign(
1311                        __entry->error = error;
1312                        __entry->dev = sb->s_dev;
1313                        __entry->fileid = fileid;
1314                        __entry->fhandle = nfs_fhandle_hash(fh);
1315                ),
1316
1317                TP_printk(
1318                        "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
1319                        __entry->error,
1320                        MAJOR(__entry->dev), MINOR(__entry->dev),
1321                        (unsigned long long)__entry->fileid,
1322                        __entry->fhandle
1323                )
1324);
1325
1326TRACE_DEFINE_ENUM(NFS_OK);
1327TRACE_DEFINE_ENUM(NFSERR_PERM);
1328TRACE_DEFINE_ENUM(NFSERR_NOENT);
1329TRACE_DEFINE_ENUM(NFSERR_IO);
1330TRACE_DEFINE_ENUM(NFSERR_NXIO);
1331TRACE_DEFINE_ENUM(ECHILD);
1332TRACE_DEFINE_ENUM(NFSERR_EAGAIN);
1333TRACE_DEFINE_ENUM(NFSERR_ACCES);
1334TRACE_DEFINE_ENUM(NFSERR_EXIST);
1335TRACE_DEFINE_ENUM(NFSERR_XDEV);
1336TRACE_DEFINE_ENUM(NFSERR_NODEV);
1337TRACE_DEFINE_ENUM(NFSERR_NOTDIR);
1338TRACE_DEFINE_ENUM(NFSERR_ISDIR);
1339TRACE_DEFINE_ENUM(NFSERR_INVAL);
1340TRACE_DEFINE_ENUM(NFSERR_FBIG);
1341TRACE_DEFINE_ENUM(NFSERR_NOSPC);
1342TRACE_DEFINE_ENUM(NFSERR_ROFS);
1343TRACE_DEFINE_ENUM(NFSERR_MLINK);
1344TRACE_DEFINE_ENUM(NFSERR_OPNOTSUPP);
1345TRACE_DEFINE_ENUM(NFSERR_NAMETOOLONG);
1346TRACE_DEFINE_ENUM(NFSERR_NOTEMPTY);
1347TRACE_DEFINE_ENUM(NFSERR_DQUOT);
1348TRACE_DEFINE_ENUM(NFSERR_STALE);
1349TRACE_DEFINE_ENUM(NFSERR_REMOTE);
1350TRACE_DEFINE_ENUM(NFSERR_WFLUSH);
1351TRACE_DEFINE_ENUM(NFSERR_BADHANDLE);
1352TRACE_DEFINE_ENUM(NFSERR_NOT_SYNC);
1353TRACE_DEFINE_ENUM(NFSERR_BAD_COOKIE);
1354TRACE_DEFINE_ENUM(NFSERR_NOTSUPP);
1355TRACE_DEFINE_ENUM(NFSERR_TOOSMALL);
1356TRACE_DEFINE_ENUM(NFSERR_SERVERFAULT);
1357TRACE_DEFINE_ENUM(NFSERR_BADTYPE);
1358TRACE_DEFINE_ENUM(NFSERR_JUKEBOX);
1359
1360#define nfs_show_status(x) \
1361        __print_symbolic(x, \
1362                        { NFS_OK, "OK" }, \
1363                        { NFSERR_PERM, "PERM" }, \
1364                        { NFSERR_NOENT, "NOENT" }, \
1365                        { NFSERR_IO, "IO" }, \
1366                        { NFSERR_NXIO, "NXIO" }, \
1367                        { ECHILD, "CHILD" }, \
1368                        { NFSERR_EAGAIN, "AGAIN" }, \
1369                        { NFSERR_ACCES, "ACCES" }, \
1370                        { NFSERR_EXIST, "EXIST" }, \
1371                        { NFSERR_XDEV, "XDEV" }, \
1372                        { NFSERR_NODEV, "NODEV" }, \
1373                        { NFSERR_NOTDIR, "NOTDIR" }, \
1374                        { NFSERR_ISDIR, "ISDIR" }, \
1375                        { NFSERR_INVAL, "INVAL" }, \
1376                        { NFSERR_FBIG, "FBIG" }, \
1377                        { NFSERR_NOSPC, "NOSPC" }, \
1378                        { NFSERR_ROFS, "ROFS" }, \
1379                        { NFSERR_MLINK, "MLINK" }, \
1380                        { NFSERR_OPNOTSUPP, "OPNOTSUPP" }, \
1381                        { NFSERR_NAMETOOLONG, "NAMETOOLONG" }, \
1382                        { NFSERR_NOTEMPTY, "NOTEMPTY" }, \
1383                        { NFSERR_DQUOT, "DQUOT" }, \
1384                        { NFSERR_STALE, "STALE" }, \
1385                        { NFSERR_REMOTE, "REMOTE" }, \
1386                        { NFSERR_WFLUSH, "WFLUSH" }, \
1387                        { NFSERR_BADHANDLE, "BADHANDLE" }, \
1388                        { NFSERR_NOT_SYNC, "NOTSYNC" }, \
1389                        { NFSERR_BAD_COOKIE, "BADCOOKIE" }, \
1390                        { NFSERR_NOTSUPP, "NOTSUPP" }, \
1391                        { NFSERR_TOOSMALL, "TOOSMALL" }, \
1392                        { NFSERR_SERVERFAULT, "REMOTEIO" }, \
1393                        { NFSERR_BADTYPE, "BADTYPE" }, \
1394                        { NFSERR_JUKEBOX, "JUKEBOX" })
1395
1396DECLARE_EVENT_CLASS(nfs_xdr_event,
1397                TP_PROTO(
1398                        const struct xdr_stream *xdr,
1399                        int error
1400                ),
1401
1402                TP_ARGS(xdr, error),
1403
1404                TP_STRUCT__entry(
1405                        __field(unsigned int, task_id)
1406                        __field(unsigned int, client_id)
1407                        __field(u32, xid)
1408                        __field(int, version)
1409                        __field(unsigned long, error)
1410                        __string(program,
1411                                 xdr->rqst->rq_task->tk_client->cl_program->name)
1412                        __string(procedure,
1413                                 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
1414                ),
1415
1416                TP_fast_assign(
1417                        const struct rpc_rqst *rqstp = xdr->rqst;
1418                        const struct rpc_task *task = rqstp->rq_task;
1419
1420                        __entry->task_id = task->tk_pid;
1421                        __entry->client_id = task->tk_client->cl_clid;
1422                        __entry->xid = be32_to_cpu(rqstp->rq_xid);
1423                        __entry->version = task->tk_client->cl_vers;
1424                        __entry->error = error;
1425                        __assign_str(program,
1426                                     task->tk_client->cl_program->name);
1427                        __assign_str(procedure, task->tk_msg.rpc_proc->p_name);
1428                ),
1429
1430                TP_printk(
1431                        "task:%u@%d xid=0x%08x %sv%d %s error=%ld (%s)",
1432                        __entry->task_id, __entry->client_id, __entry->xid,
1433                        __get_str(program), __entry->version,
1434                        __get_str(procedure), -__entry->error,
1435                        nfs_show_status(__entry->error)
1436                )
1437);
1438#define DEFINE_NFS_XDR_EVENT(name) \
1439        DEFINE_EVENT(nfs_xdr_event, name, \
1440                        TP_PROTO( \
1441                                const struct xdr_stream *xdr, \
1442                                int error \
1443                        ), \
1444                        TP_ARGS(xdr, error))
1445DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
1446DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
1447
1448#endif /* _TRACE_NFS_H */
1449
1450#undef TRACE_INCLUDE_PATH
1451#define TRACE_INCLUDE_PATH .
1452#define TRACE_INCLUDE_FILE nfstrace
1453/* This part must be outside protection */
1454#include <trace/define_trace.h>
1455