Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Feb 10-13, 2025
Register
Loading...
Note: File does not exist in v3.1.
   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>