cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nfstrace.h (43098B)


      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
     14#include <trace/events/fs.h>
     15#include <trace/events/nfs.h>
     16#include <trace/events/sunrpc_base.h>
     17
     18#define nfs_show_cache_validity(v) \
     19	__print_flags(v, "|", \
     20			{ NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
     21			{ NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
     22			{ NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
     23			{ NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
     24			{ NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
     25			{ NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
     26			{ NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
     27			{ NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
     28			{ NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
     29			{ NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
     30			{ NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
     31			{ NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
     32			{ NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
     33			{ NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
     34			{ NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
     35			{ NFS_INO_INVALID_MODE, "INVALID_MODE" })
     36
     37#define nfs_show_nfsi_flags(v) \
     38	__print_flags(v, "|", \
     39			{ BIT(NFS_INO_STALE), "STALE" }, \
     40			{ BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
     41			{ BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
     42			{ BIT(NFS_INO_FSCACHE), "FSCACHE" }, \
     43			{ BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
     44			{ BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
     45			{ BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
     46			{ BIT(NFS_INO_ODIRECT), "ODIRECT" })
     47
     48DECLARE_EVENT_CLASS(nfs_inode_event,
     49		TP_PROTO(
     50			const struct inode *inode
     51		),
     52
     53		TP_ARGS(inode),
     54
     55		TP_STRUCT__entry(
     56			__field(dev_t, dev)
     57			__field(u32, fhandle)
     58			__field(u64, fileid)
     59			__field(u64, version)
     60		),
     61
     62		TP_fast_assign(
     63			const struct nfs_inode *nfsi = NFS_I(inode);
     64			__entry->dev = inode->i_sb->s_dev;
     65			__entry->fileid = nfsi->fileid;
     66			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
     67			__entry->version = inode_peek_iversion_raw(inode);
     68		),
     69
     70		TP_printk(
     71			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
     72			MAJOR(__entry->dev), MINOR(__entry->dev),
     73			(unsigned long long)__entry->fileid,
     74			__entry->fhandle,
     75			(unsigned long long)__entry->version
     76		)
     77);
     78
     79DECLARE_EVENT_CLASS(nfs_inode_event_done,
     80		TP_PROTO(
     81			const struct inode *inode,
     82			int error
     83		),
     84
     85		TP_ARGS(inode, error),
     86
     87		TP_STRUCT__entry(
     88			__field(unsigned long, error)
     89			__field(dev_t, dev)
     90			__field(u32, fhandle)
     91			__field(unsigned char, type)
     92			__field(u64, fileid)
     93			__field(u64, version)
     94			__field(loff_t, size)
     95			__field(unsigned long, nfsi_flags)
     96			__field(unsigned long, cache_validity)
     97		),
     98
     99		TP_fast_assign(
    100			const struct nfs_inode *nfsi = NFS_I(inode);
    101			__entry->error = error < 0 ? -error : 0;
    102			__entry->dev = inode->i_sb->s_dev;
    103			__entry->fileid = nfsi->fileid;
    104			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    105			__entry->type = nfs_umode_to_dtype(inode->i_mode);
    106			__entry->version = inode_peek_iversion_raw(inode);
    107			__entry->size = i_size_read(inode);
    108			__entry->nfsi_flags = nfsi->flags;
    109			__entry->cache_validity = nfsi->cache_validity;
    110		),
    111
    112		TP_printk(
    113			"error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
    114			"type=%u (%s) version=%llu size=%lld "
    115			"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
    116			-__entry->error, show_nfs_status(__entry->error),
    117			MAJOR(__entry->dev), MINOR(__entry->dev),
    118			(unsigned long long)__entry->fileid,
    119			__entry->fhandle,
    120			__entry->type,
    121			show_fs_dirent_type(__entry->type),
    122			(unsigned long long)__entry->version,
    123			(long long)__entry->size,
    124			__entry->cache_validity,
    125			nfs_show_cache_validity(__entry->cache_validity),
    126			__entry->nfsi_flags,
    127			nfs_show_nfsi_flags(__entry->nfsi_flags)
    128		)
    129);
    130
    131#define DEFINE_NFS_INODE_EVENT(name) \
    132	DEFINE_EVENT(nfs_inode_event, name, \
    133			TP_PROTO( \
    134				const struct inode *inode \
    135			), \
    136			TP_ARGS(inode))
    137#define DEFINE_NFS_INODE_EVENT_DONE(name) \
    138	DEFINE_EVENT(nfs_inode_event_done, name, \
    139			TP_PROTO( \
    140				const struct inode *inode, \
    141				int error \
    142			), \
    143			TP_ARGS(inode, error))
    144DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
    145DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
    146DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
    147DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
    148DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
    149DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
    150DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
    151DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
    152DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
    153DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
    154DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
    155DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
    156DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
    157DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
    158DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
    159DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
    160DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
    161DEFINE_NFS_INODE_EVENT(nfs_access_enter);
    162DEFINE_NFS_INODE_EVENT_DONE(nfs_set_cache_invalid);
    163DEFINE_NFS_INODE_EVENT(nfs_readdir_force_readdirplus);
    164DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_cache_fill_done);
    165DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_uncached_done);
    166
    167TRACE_EVENT(nfs_access_exit,
    168		TP_PROTO(
    169			const struct inode *inode,
    170			unsigned int mask,
    171			unsigned int permitted,
    172			int error
    173		),
    174
    175		TP_ARGS(inode, mask, permitted, error),
    176
    177		TP_STRUCT__entry(
    178			__field(unsigned long, error)
    179			__field(dev_t, dev)
    180			__field(u32, fhandle)
    181			__field(unsigned char, type)
    182			__field(u64, fileid)
    183			__field(u64, version)
    184			__field(loff_t, size)
    185			__field(unsigned long, nfsi_flags)
    186			__field(unsigned long, cache_validity)
    187			__field(unsigned int, mask)
    188			__field(unsigned int, permitted)
    189		),
    190
    191		TP_fast_assign(
    192			const struct nfs_inode *nfsi = NFS_I(inode);
    193			__entry->error = error < 0 ? -error : 0;
    194			__entry->dev = inode->i_sb->s_dev;
    195			__entry->fileid = nfsi->fileid;
    196			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    197			__entry->type = nfs_umode_to_dtype(inode->i_mode);
    198			__entry->version = inode_peek_iversion_raw(inode);
    199			__entry->size = i_size_read(inode);
    200			__entry->nfsi_flags = nfsi->flags;
    201			__entry->cache_validity = nfsi->cache_validity;
    202			__entry->mask = mask;
    203			__entry->permitted = permitted;
    204		),
    205
    206		TP_printk(
    207			"error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
    208			"type=%u (%s) version=%llu size=%lld "
    209			"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
    210			"mask=0x%x permitted=0x%x",
    211			-__entry->error, show_nfs_status(__entry->error),
    212			MAJOR(__entry->dev), MINOR(__entry->dev),
    213			(unsigned long long)__entry->fileid,
    214			__entry->fhandle,
    215			__entry->type,
    216			show_fs_dirent_type(__entry->type),
    217			(unsigned long long)__entry->version,
    218			(long long)__entry->size,
    219			__entry->cache_validity,
    220			nfs_show_cache_validity(__entry->cache_validity),
    221			__entry->nfsi_flags,
    222			nfs_show_nfsi_flags(__entry->nfsi_flags),
    223			__entry->mask, __entry->permitted
    224		)
    225);
    226
    227DECLARE_EVENT_CLASS(nfs_update_size_class,
    228		TP_PROTO(
    229			const struct inode *inode,
    230			loff_t new_size
    231		),
    232
    233		TP_ARGS(inode, new_size),
    234
    235		TP_STRUCT__entry(
    236			__field(dev_t, dev)
    237			__field(u32, fhandle)
    238			__field(u64, fileid)
    239			__field(u64, version)
    240			__field(loff_t, cur_size)
    241			__field(loff_t, new_size)
    242		),
    243
    244		TP_fast_assign(
    245			const struct nfs_inode *nfsi = NFS_I(inode);
    246
    247			__entry->dev = inode->i_sb->s_dev;
    248			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    249			__entry->fileid = nfsi->fileid;
    250			__entry->version = inode_peek_iversion_raw(inode);
    251			__entry->cur_size = i_size_read(inode);
    252			__entry->new_size = new_size;
    253		),
    254
    255		TP_printk(
    256			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cursize=%lld newsize=%lld",
    257			MAJOR(__entry->dev), MINOR(__entry->dev),
    258			(unsigned long long)__entry->fileid,
    259			__entry->fhandle, __entry->version,
    260			__entry->cur_size, __entry->new_size
    261		)
    262);
    263
    264#define DEFINE_NFS_UPDATE_SIZE_EVENT(name) \
    265	DEFINE_EVENT(nfs_update_size_class, nfs_size_##name, \
    266			TP_PROTO( \
    267				const struct inode *inode, \
    268				loff_t new_size \
    269			), \
    270			TP_ARGS(inode, new_size))
    271
    272DEFINE_NFS_UPDATE_SIZE_EVENT(truncate);
    273DEFINE_NFS_UPDATE_SIZE_EVENT(wcc);
    274DEFINE_NFS_UPDATE_SIZE_EVENT(update);
    275DEFINE_NFS_UPDATE_SIZE_EVENT(grow);
    276
    277DECLARE_EVENT_CLASS(nfs_inode_range_event,
    278		TP_PROTO(
    279			const struct inode *inode,
    280			loff_t range_start,
    281			loff_t range_end
    282		),
    283
    284		TP_ARGS(inode, range_start, range_end),
    285
    286		TP_STRUCT__entry(
    287			__field(dev_t, dev)
    288			__field(u32, fhandle)
    289			__field(u64, fileid)
    290			__field(u64, version)
    291			__field(loff_t, range_start)
    292			__field(loff_t, range_end)
    293		),
    294
    295		TP_fast_assign(
    296			const struct nfs_inode *nfsi = NFS_I(inode);
    297
    298			__entry->dev = inode->i_sb->s_dev;
    299			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    300			__entry->fileid = nfsi->fileid;
    301			__entry->version = inode_peek_iversion_raw(inode);
    302			__entry->range_start = range_start;
    303			__entry->range_end = range_end;
    304		),
    305
    306		TP_printk(
    307			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
    308			"range=[%lld, %lld]",
    309			MAJOR(__entry->dev), MINOR(__entry->dev),
    310			(unsigned long long)__entry->fileid,
    311			__entry->fhandle, __entry->version,
    312			__entry->range_start, __entry->range_end
    313		)
    314);
    315
    316#define DEFINE_NFS_INODE_RANGE_EVENT(name) \
    317	DEFINE_EVENT(nfs_inode_range_event, name, \
    318			TP_PROTO( \
    319				const struct inode *inode, \
    320				loff_t range_start, \
    321				loff_t range_end \
    322			), \
    323			TP_ARGS(inode, range_start, range_end))
    324
    325DEFINE_NFS_INODE_RANGE_EVENT(nfs_readdir_invalidate_cache_range);
    326
    327DECLARE_EVENT_CLASS(nfs_readdir_event,
    328		TP_PROTO(
    329			const struct file *file,
    330			const __be32 *verifier,
    331			u64 cookie,
    332			pgoff_t page_index,
    333			unsigned int dtsize
    334		),
    335
    336		TP_ARGS(file, verifier, cookie, page_index, dtsize),
    337
    338		TP_STRUCT__entry(
    339			__field(dev_t, dev)
    340			__field(u32, fhandle)
    341			__field(u64, fileid)
    342			__field(u64, version)
    343			__array(char, verifier, NFS4_VERIFIER_SIZE)
    344			__field(u64, cookie)
    345			__field(pgoff_t, index)
    346			__field(unsigned int, dtsize)
    347		),
    348
    349		TP_fast_assign(
    350			const struct inode *dir = file_inode(file);
    351			const struct nfs_inode *nfsi = NFS_I(dir);
    352
    353			__entry->dev = dir->i_sb->s_dev;
    354			__entry->fileid = nfsi->fileid;
    355			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    356			__entry->version = inode_peek_iversion_raw(dir);
    357			if (cookie != 0)
    358				memcpy(__entry->verifier, verifier,
    359				       NFS4_VERIFIER_SIZE);
    360			else
    361				memset(__entry->verifier, 0,
    362				       NFS4_VERIFIER_SIZE);
    363			__entry->cookie = cookie;
    364			__entry->index = page_index;
    365			__entry->dtsize = dtsize;
    366		),
    367
    368		TP_printk(
    369			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
    370			"cookie=%s:0x%llx cache_index=%lu dtsize=%u",
    371			MAJOR(__entry->dev), MINOR(__entry->dev),
    372			(unsigned long long)__entry->fileid, __entry->fhandle,
    373			__entry->version, show_nfs4_verifier(__entry->verifier),
    374			(unsigned long long)__entry->cookie, __entry->index,
    375			__entry->dtsize
    376		)
    377);
    378
    379#define DEFINE_NFS_READDIR_EVENT(name) \
    380	DEFINE_EVENT(nfs_readdir_event, name, \
    381			TP_PROTO( \
    382				const struct file *file, \
    383				const __be32 *verifier, \
    384				u64 cookie, \
    385				pgoff_t page_index, \
    386				unsigned int dtsize \
    387				), \
    388			TP_ARGS(file, verifier, cookie, page_index, dtsize))
    389
    390DEFINE_NFS_READDIR_EVENT(nfs_readdir_cache_fill);
    391DEFINE_NFS_READDIR_EVENT(nfs_readdir_uncached);
    392
    393DECLARE_EVENT_CLASS(nfs_lookup_event,
    394		TP_PROTO(
    395			const struct inode *dir,
    396			const struct dentry *dentry,
    397			unsigned int flags
    398		),
    399
    400		TP_ARGS(dir, dentry, flags),
    401
    402		TP_STRUCT__entry(
    403			__field(unsigned long, flags)
    404			__field(dev_t, dev)
    405			__field(u64, dir)
    406			__string(name, dentry->d_name.name)
    407		),
    408
    409		TP_fast_assign(
    410			__entry->dev = dir->i_sb->s_dev;
    411			__entry->dir = NFS_FILEID(dir);
    412			__entry->flags = flags;
    413			__assign_str(name, dentry->d_name.name);
    414		),
    415
    416		TP_printk(
    417			"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
    418			__entry->flags,
    419			show_fs_lookup_flags(__entry->flags),
    420			MAJOR(__entry->dev), MINOR(__entry->dev),
    421			(unsigned long long)__entry->dir,
    422			__get_str(name)
    423		)
    424);
    425
    426#define DEFINE_NFS_LOOKUP_EVENT(name) \
    427	DEFINE_EVENT(nfs_lookup_event, name, \
    428			TP_PROTO( \
    429				const struct inode *dir, \
    430				const struct dentry *dentry, \
    431				unsigned int flags \
    432			), \
    433			TP_ARGS(dir, dentry, flags))
    434
    435DECLARE_EVENT_CLASS(nfs_lookup_event_done,
    436		TP_PROTO(
    437			const struct inode *dir,
    438			const struct dentry *dentry,
    439			unsigned int flags,
    440			int error
    441		),
    442
    443		TP_ARGS(dir, dentry, flags, error),
    444
    445		TP_STRUCT__entry(
    446			__field(unsigned long, error)
    447			__field(unsigned long, flags)
    448			__field(dev_t, dev)
    449			__field(u64, dir)
    450			__string(name, dentry->d_name.name)
    451		),
    452
    453		TP_fast_assign(
    454			__entry->dev = dir->i_sb->s_dev;
    455			__entry->dir = NFS_FILEID(dir);
    456			__entry->error = error < 0 ? -error : 0;
    457			__entry->flags = flags;
    458			__assign_str(name, dentry->d_name.name);
    459		),
    460
    461		TP_printk(
    462			"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
    463			-__entry->error, show_nfs_status(__entry->error),
    464			__entry->flags,
    465			show_fs_lookup_flags(__entry->flags),
    466			MAJOR(__entry->dev), MINOR(__entry->dev),
    467			(unsigned long long)__entry->dir,
    468			__get_str(name)
    469		)
    470);
    471
    472#define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
    473	DEFINE_EVENT(nfs_lookup_event_done, name, \
    474			TP_PROTO( \
    475				const struct inode *dir, \
    476				const struct dentry *dentry, \
    477				unsigned int flags, \
    478				int error \
    479			), \
    480			TP_ARGS(dir, dentry, flags, error))
    481
    482DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
    483DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
    484DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
    485DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
    486DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup);
    487DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup_revalidate_failed);
    488DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_readdir_lookup_revalidate);
    489
    490TRACE_EVENT(nfs_atomic_open_enter,
    491		TP_PROTO(
    492			const struct inode *dir,
    493			const struct nfs_open_context *ctx,
    494			unsigned int flags
    495		),
    496
    497		TP_ARGS(dir, ctx, flags),
    498
    499		TP_STRUCT__entry(
    500			__field(unsigned long, flags)
    501			__field(unsigned long, fmode)
    502			__field(dev_t, dev)
    503			__field(u64, dir)
    504			__string(name, ctx->dentry->d_name.name)
    505		),
    506
    507		TP_fast_assign(
    508			__entry->dev = dir->i_sb->s_dev;
    509			__entry->dir = NFS_FILEID(dir);
    510			__entry->flags = flags;
    511			__entry->fmode = (__force unsigned long)ctx->mode;
    512			__assign_str(name, ctx->dentry->d_name.name);
    513		),
    514
    515		TP_printk(
    516			"flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
    517			__entry->flags,
    518			show_fs_fcntl_open_flags(__entry->flags),
    519			show_fs_fmode_flags(__entry->fmode),
    520			MAJOR(__entry->dev), MINOR(__entry->dev),
    521			(unsigned long long)__entry->dir,
    522			__get_str(name)
    523		)
    524);
    525
    526TRACE_EVENT(nfs_atomic_open_exit,
    527		TP_PROTO(
    528			const struct inode *dir,
    529			const struct nfs_open_context *ctx,
    530			unsigned int flags,
    531			int error
    532		),
    533
    534		TP_ARGS(dir, ctx, flags, error),
    535
    536		TP_STRUCT__entry(
    537			__field(unsigned long, error)
    538			__field(unsigned long, flags)
    539			__field(unsigned long, fmode)
    540			__field(dev_t, dev)
    541			__field(u64, dir)
    542			__string(name, ctx->dentry->d_name.name)
    543		),
    544
    545		TP_fast_assign(
    546			__entry->error = -error;
    547			__entry->dev = dir->i_sb->s_dev;
    548			__entry->dir = NFS_FILEID(dir);
    549			__entry->flags = flags;
    550			__entry->fmode = (__force unsigned long)ctx->mode;
    551			__assign_str(name, ctx->dentry->d_name.name);
    552		),
    553
    554		TP_printk(
    555			"error=%ld (%s) flags=0x%lx (%s) fmode=%s "
    556			"name=%02x:%02x:%llu/%s",
    557			-__entry->error, show_nfs_status(__entry->error),
    558			__entry->flags,
    559			show_fs_fcntl_open_flags(__entry->flags),
    560			show_fs_fmode_flags(__entry->fmode),
    561			MAJOR(__entry->dev), MINOR(__entry->dev),
    562			(unsigned long long)__entry->dir,
    563			__get_str(name)
    564		)
    565);
    566
    567TRACE_EVENT(nfs_create_enter,
    568		TP_PROTO(
    569			const struct inode *dir,
    570			const struct dentry *dentry,
    571			unsigned int flags
    572		),
    573
    574		TP_ARGS(dir, dentry, flags),
    575
    576		TP_STRUCT__entry(
    577			__field(unsigned long, flags)
    578			__field(dev_t, dev)
    579			__field(u64, dir)
    580			__string(name, dentry->d_name.name)
    581		),
    582
    583		TP_fast_assign(
    584			__entry->dev = dir->i_sb->s_dev;
    585			__entry->dir = NFS_FILEID(dir);
    586			__entry->flags = flags;
    587			__assign_str(name, dentry->d_name.name);
    588		),
    589
    590		TP_printk(
    591			"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
    592			__entry->flags,
    593			show_fs_fcntl_open_flags(__entry->flags),
    594			MAJOR(__entry->dev), MINOR(__entry->dev),
    595			(unsigned long long)__entry->dir,
    596			__get_str(name)
    597		)
    598);
    599
    600TRACE_EVENT(nfs_create_exit,
    601		TP_PROTO(
    602			const struct inode *dir,
    603			const struct dentry *dentry,
    604			unsigned int flags,
    605			int error
    606		),
    607
    608		TP_ARGS(dir, dentry, flags, error),
    609
    610		TP_STRUCT__entry(
    611			__field(unsigned long, error)
    612			__field(unsigned long, flags)
    613			__field(dev_t, dev)
    614			__field(u64, dir)
    615			__string(name, dentry->d_name.name)
    616		),
    617
    618		TP_fast_assign(
    619			__entry->error = -error;
    620			__entry->dev = dir->i_sb->s_dev;
    621			__entry->dir = NFS_FILEID(dir);
    622			__entry->flags = flags;
    623			__assign_str(name, dentry->d_name.name);
    624		),
    625
    626		TP_printk(
    627			"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
    628			-__entry->error, show_nfs_status(__entry->error),
    629			__entry->flags,
    630			show_fs_fcntl_open_flags(__entry->flags),
    631			MAJOR(__entry->dev), MINOR(__entry->dev),
    632			(unsigned long long)__entry->dir,
    633			__get_str(name)
    634		)
    635);
    636
    637DECLARE_EVENT_CLASS(nfs_directory_event,
    638		TP_PROTO(
    639			const struct inode *dir,
    640			const struct dentry *dentry
    641		),
    642
    643		TP_ARGS(dir, dentry),
    644
    645		TP_STRUCT__entry(
    646			__field(dev_t, dev)
    647			__field(u64, dir)
    648			__string(name, dentry->d_name.name)
    649		),
    650
    651		TP_fast_assign(
    652			__entry->dev = dir->i_sb->s_dev;
    653			__entry->dir = NFS_FILEID(dir);
    654			__assign_str(name, dentry->d_name.name);
    655		),
    656
    657		TP_printk(
    658			"name=%02x:%02x:%llu/%s",
    659			MAJOR(__entry->dev), MINOR(__entry->dev),
    660			(unsigned long long)__entry->dir,
    661			__get_str(name)
    662		)
    663);
    664
    665#define DEFINE_NFS_DIRECTORY_EVENT(name) \
    666	DEFINE_EVENT(nfs_directory_event, name, \
    667			TP_PROTO( \
    668				const struct inode *dir, \
    669				const struct dentry *dentry \
    670			), \
    671			TP_ARGS(dir, dentry))
    672
    673DECLARE_EVENT_CLASS(nfs_directory_event_done,
    674		TP_PROTO(
    675			const struct inode *dir,
    676			const struct dentry *dentry,
    677			int error
    678		),
    679
    680		TP_ARGS(dir, dentry, error),
    681
    682		TP_STRUCT__entry(
    683			__field(unsigned long, error)
    684			__field(dev_t, dev)
    685			__field(u64, dir)
    686			__string(name, dentry->d_name.name)
    687		),
    688
    689		TP_fast_assign(
    690			__entry->dev = dir->i_sb->s_dev;
    691			__entry->dir = NFS_FILEID(dir);
    692			__entry->error = error < 0 ? -error : 0;
    693			__assign_str(name, dentry->d_name.name);
    694		),
    695
    696		TP_printk(
    697			"error=%ld (%s) name=%02x:%02x:%llu/%s",
    698			-__entry->error, show_nfs_status(__entry->error),
    699			MAJOR(__entry->dev), MINOR(__entry->dev),
    700			(unsigned long long)__entry->dir,
    701			__get_str(name)
    702		)
    703);
    704
    705#define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
    706	DEFINE_EVENT(nfs_directory_event_done, name, \
    707			TP_PROTO( \
    708				const struct inode *dir, \
    709				const struct dentry *dentry, \
    710				int error \
    711			), \
    712			TP_ARGS(dir, dentry, error))
    713
    714DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
    715DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
    716DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
    717DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
    718DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
    719DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
    720DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
    721DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
    722DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
    723DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
    724DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
    725DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
    726
    727TRACE_EVENT(nfs_link_enter,
    728		TP_PROTO(
    729			const struct inode *inode,
    730			const struct inode *dir,
    731			const struct dentry *dentry
    732		),
    733
    734		TP_ARGS(inode, dir, dentry),
    735
    736		TP_STRUCT__entry(
    737			__field(dev_t, dev)
    738			__field(u64, fileid)
    739			__field(u64, dir)
    740			__string(name, dentry->d_name.name)
    741		),
    742
    743		TP_fast_assign(
    744			__entry->dev = inode->i_sb->s_dev;
    745			__entry->fileid = NFS_FILEID(inode);
    746			__entry->dir = NFS_FILEID(dir);
    747			__assign_str(name, dentry->d_name.name);
    748		),
    749
    750		TP_printk(
    751			"fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
    752			MAJOR(__entry->dev), MINOR(__entry->dev),
    753			__entry->fileid,
    754			MAJOR(__entry->dev), MINOR(__entry->dev),
    755			(unsigned long long)__entry->dir,
    756			__get_str(name)
    757		)
    758);
    759
    760TRACE_EVENT(nfs_link_exit,
    761		TP_PROTO(
    762			const struct inode *inode,
    763			const struct inode *dir,
    764			const struct dentry *dentry,
    765			int error
    766		),
    767
    768		TP_ARGS(inode, dir, dentry, error),
    769
    770		TP_STRUCT__entry(
    771			__field(unsigned long, error)
    772			__field(dev_t, dev)
    773			__field(u64, fileid)
    774			__field(u64, dir)
    775			__string(name, dentry->d_name.name)
    776		),
    777
    778		TP_fast_assign(
    779			__entry->dev = inode->i_sb->s_dev;
    780			__entry->fileid = NFS_FILEID(inode);
    781			__entry->dir = NFS_FILEID(dir);
    782			__entry->error = error < 0 ? -error : 0;
    783			__assign_str(name, dentry->d_name.name);
    784		),
    785
    786		TP_printk(
    787			"error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
    788			-__entry->error, show_nfs_status(__entry->error),
    789			MAJOR(__entry->dev), MINOR(__entry->dev),
    790			__entry->fileid,
    791			MAJOR(__entry->dev), MINOR(__entry->dev),
    792			(unsigned long long)__entry->dir,
    793			__get_str(name)
    794		)
    795);
    796
    797DECLARE_EVENT_CLASS(nfs_rename_event,
    798		TP_PROTO(
    799			const struct inode *old_dir,
    800			const struct dentry *old_dentry,
    801			const struct inode *new_dir,
    802			const struct dentry *new_dentry
    803		),
    804
    805		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
    806
    807		TP_STRUCT__entry(
    808			__field(dev_t, dev)
    809			__field(u64, old_dir)
    810			__field(u64, new_dir)
    811			__string(old_name, old_dentry->d_name.name)
    812			__string(new_name, new_dentry->d_name.name)
    813		),
    814
    815		TP_fast_assign(
    816			__entry->dev = old_dir->i_sb->s_dev;
    817			__entry->old_dir = NFS_FILEID(old_dir);
    818			__entry->new_dir = NFS_FILEID(new_dir);
    819			__assign_str(old_name, old_dentry->d_name.name);
    820			__assign_str(new_name, new_dentry->d_name.name);
    821		),
    822
    823		TP_printk(
    824			"old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
    825			MAJOR(__entry->dev), MINOR(__entry->dev),
    826			(unsigned long long)__entry->old_dir,
    827			__get_str(old_name),
    828			MAJOR(__entry->dev), MINOR(__entry->dev),
    829			(unsigned long long)__entry->new_dir,
    830			__get_str(new_name)
    831		)
    832);
    833#define DEFINE_NFS_RENAME_EVENT(name) \
    834	DEFINE_EVENT(nfs_rename_event, name, \
    835			TP_PROTO( \
    836				const struct inode *old_dir, \
    837				const struct dentry *old_dentry, \
    838				const struct inode *new_dir, \
    839				const struct dentry *new_dentry \
    840			), \
    841			TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
    842
    843DECLARE_EVENT_CLASS(nfs_rename_event_done,
    844		TP_PROTO(
    845			const struct inode *old_dir,
    846			const struct dentry *old_dentry,
    847			const struct inode *new_dir,
    848			const struct dentry *new_dentry,
    849			int error
    850		),
    851
    852		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
    853
    854		TP_STRUCT__entry(
    855			__field(dev_t, dev)
    856			__field(unsigned long, error)
    857			__field(u64, old_dir)
    858			__string(old_name, old_dentry->d_name.name)
    859			__field(u64, new_dir)
    860			__string(new_name, new_dentry->d_name.name)
    861		),
    862
    863		TP_fast_assign(
    864			__entry->dev = old_dir->i_sb->s_dev;
    865			__entry->error = -error;
    866			__entry->old_dir = NFS_FILEID(old_dir);
    867			__entry->new_dir = NFS_FILEID(new_dir);
    868			__assign_str(old_name, old_dentry->d_name.name);
    869			__assign_str(new_name, new_dentry->d_name.name);
    870		),
    871
    872		TP_printk(
    873			"error=%ld (%s) old_name=%02x:%02x:%llu/%s "
    874			"new_name=%02x:%02x:%llu/%s",
    875			-__entry->error, show_nfs_status(__entry->error),
    876			MAJOR(__entry->dev), MINOR(__entry->dev),
    877			(unsigned long long)__entry->old_dir,
    878			__get_str(old_name),
    879			MAJOR(__entry->dev), MINOR(__entry->dev),
    880			(unsigned long long)__entry->new_dir,
    881			__get_str(new_name)
    882		)
    883);
    884#define DEFINE_NFS_RENAME_EVENT_DONE(name) \
    885	DEFINE_EVENT(nfs_rename_event_done, name, \
    886			TP_PROTO( \
    887				const struct inode *old_dir, \
    888				const struct dentry *old_dentry, \
    889				const struct inode *new_dir, \
    890				const struct dentry *new_dentry, \
    891				int error \
    892			), \
    893			TP_ARGS(old_dir, old_dentry, new_dir, \
    894				new_dentry, error))
    895
    896DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
    897DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
    898
    899DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
    900
    901TRACE_EVENT(nfs_sillyrename_unlink,
    902		TP_PROTO(
    903			const struct nfs_unlinkdata *data,
    904			int error
    905		),
    906
    907		TP_ARGS(data, error),
    908
    909		TP_STRUCT__entry(
    910			__field(dev_t, dev)
    911			__field(unsigned long, error)
    912			__field(u64, dir)
    913			__dynamic_array(char, name, data->args.name.len + 1)
    914		),
    915
    916		TP_fast_assign(
    917			struct inode *dir = d_inode(data->dentry->d_parent);
    918			size_t len = data->args.name.len;
    919			__entry->dev = dir->i_sb->s_dev;
    920			__entry->dir = NFS_FILEID(dir);
    921			__entry->error = -error;
    922			memcpy(__get_str(name),
    923				data->args.name.name, len);
    924			__get_str(name)[len] = 0;
    925		),
    926
    927		TP_printk(
    928			"error=%ld (%s) name=%02x:%02x:%llu/%s",
    929			-__entry->error, show_nfs_status(__entry->error),
    930			MAJOR(__entry->dev), MINOR(__entry->dev),
    931			(unsigned long long)__entry->dir,
    932			__get_str(name)
    933		)
    934);
    935
    936TRACE_EVENT(nfs_aop_readpage,
    937		TP_PROTO(
    938			const struct inode *inode,
    939			struct page *page
    940		),
    941
    942		TP_ARGS(inode, page),
    943
    944		TP_STRUCT__entry(
    945			__field(dev_t, dev)
    946			__field(u32, fhandle)
    947			__field(u64, fileid)
    948			__field(u64, version)
    949			__field(loff_t, offset)
    950		),
    951
    952		TP_fast_assign(
    953			const struct nfs_inode *nfsi = NFS_I(inode);
    954
    955			__entry->dev = inode->i_sb->s_dev;
    956			__entry->fileid = nfsi->fileid;
    957			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    958			__entry->version = inode_peek_iversion_raw(inode);
    959			__entry->offset = page_index(page) << PAGE_SHIFT;
    960		),
    961
    962		TP_printk(
    963			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld",
    964			MAJOR(__entry->dev), MINOR(__entry->dev),
    965			(unsigned long long)__entry->fileid,
    966			__entry->fhandle, __entry->version,
    967			__entry->offset
    968		)
    969);
    970
    971TRACE_EVENT(nfs_aop_readpage_done,
    972		TP_PROTO(
    973			const struct inode *inode,
    974			struct page *page,
    975			int ret
    976		),
    977
    978		TP_ARGS(inode, page, ret),
    979
    980		TP_STRUCT__entry(
    981			__field(dev_t, dev)
    982			__field(u32, fhandle)
    983			__field(int, ret)
    984			__field(u64, fileid)
    985			__field(u64, version)
    986			__field(loff_t, offset)
    987		),
    988
    989		TP_fast_assign(
    990			const struct nfs_inode *nfsi = NFS_I(inode);
    991
    992			__entry->dev = inode->i_sb->s_dev;
    993			__entry->fileid = nfsi->fileid;
    994			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
    995			__entry->version = inode_peek_iversion_raw(inode);
    996			__entry->offset = page_index(page) << PAGE_SHIFT;
    997			__entry->ret = ret;
    998		),
    999
   1000		TP_printk(
   1001			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld ret=%d",
   1002			MAJOR(__entry->dev), MINOR(__entry->dev),
   1003			(unsigned long long)__entry->fileid,
   1004			__entry->fhandle, __entry->version,
   1005			__entry->offset, __entry->ret
   1006		)
   1007);
   1008
   1009TRACE_EVENT(nfs_aop_readahead,
   1010		TP_PROTO(
   1011			const struct inode *inode,
   1012			loff_t pos,
   1013			unsigned int nr_pages
   1014		),
   1015
   1016		TP_ARGS(inode, pos, nr_pages),
   1017
   1018		TP_STRUCT__entry(
   1019			__field(dev_t, dev)
   1020			__field(u32, fhandle)
   1021			__field(u64, fileid)
   1022			__field(u64, version)
   1023			__field(loff_t, offset)
   1024			__field(unsigned int, nr_pages)
   1025		),
   1026
   1027		TP_fast_assign(
   1028			const struct nfs_inode *nfsi = NFS_I(inode);
   1029
   1030			__entry->dev = inode->i_sb->s_dev;
   1031			__entry->fileid = nfsi->fileid;
   1032			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
   1033			__entry->version = inode_peek_iversion_raw(inode);
   1034			__entry->offset = pos;
   1035			__entry->nr_pages = nr_pages;
   1036		),
   1037
   1038		TP_printk(
   1039			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld nr_pages=%u",
   1040			MAJOR(__entry->dev), MINOR(__entry->dev),
   1041			(unsigned long long)__entry->fileid,
   1042			__entry->fhandle, __entry->version,
   1043			__entry->offset, __entry->nr_pages
   1044		)
   1045);
   1046
   1047TRACE_EVENT(nfs_aop_readahead_done,
   1048		TP_PROTO(
   1049			const struct inode *inode,
   1050			unsigned int nr_pages,
   1051			int ret
   1052		),
   1053
   1054		TP_ARGS(inode, nr_pages, ret),
   1055
   1056		TP_STRUCT__entry(
   1057			__field(dev_t, dev)
   1058			__field(u32, fhandle)
   1059			__field(int, ret)
   1060			__field(u64, fileid)
   1061			__field(u64, version)
   1062			__field(loff_t, offset)
   1063			__field(unsigned int, nr_pages)
   1064		),
   1065
   1066		TP_fast_assign(
   1067			const struct nfs_inode *nfsi = NFS_I(inode);
   1068
   1069			__entry->dev = inode->i_sb->s_dev;
   1070			__entry->fileid = nfsi->fileid;
   1071			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
   1072			__entry->version = inode_peek_iversion_raw(inode);
   1073			__entry->nr_pages = nr_pages;
   1074			__entry->ret = ret;
   1075		),
   1076
   1077		TP_printk(
   1078			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu nr_pages=%u ret=%d",
   1079			MAJOR(__entry->dev), MINOR(__entry->dev),
   1080			(unsigned long long)__entry->fileid,
   1081			__entry->fhandle, __entry->version,
   1082			__entry->nr_pages, __entry->ret
   1083		)
   1084);
   1085
   1086TRACE_EVENT(nfs_initiate_read,
   1087		TP_PROTO(
   1088			const struct nfs_pgio_header *hdr
   1089		),
   1090
   1091		TP_ARGS(hdr),
   1092
   1093		TP_STRUCT__entry(
   1094			__field(dev_t, dev)
   1095			__field(u32, fhandle)
   1096			__field(u64, fileid)
   1097			__field(loff_t, offset)
   1098			__field(u32, count)
   1099		),
   1100
   1101		TP_fast_assign(
   1102			const struct inode *inode = hdr->inode;
   1103			const struct nfs_inode *nfsi = NFS_I(inode);
   1104			const struct nfs_fh *fh = hdr->args.fh ?
   1105						  hdr->args.fh : &nfsi->fh;
   1106
   1107			__entry->offset = hdr->args.offset;
   1108			__entry->count = hdr->args.count;
   1109			__entry->dev = inode->i_sb->s_dev;
   1110			__entry->fileid = nfsi->fileid;
   1111			__entry->fhandle = nfs_fhandle_hash(fh);
   1112		),
   1113
   1114		TP_printk(
   1115			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1116			"offset=%lld count=%u",
   1117			MAJOR(__entry->dev), MINOR(__entry->dev),
   1118			(unsigned long long)__entry->fileid,
   1119			__entry->fhandle,
   1120			(long long)__entry->offset, __entry->count
   1121		)
   1122);
   1123
   1124TRACE_EVENT(nfs_readpage_done,
   1125		TP_PROTO(
   1126			const struct rpc_task *task,
   1127			const struct nfs_pgio_header *hdr
   1128		),
   1129
   1130		TP_ARGS(task, hdr),
   1131
   1132		TP_STRUCT__entry(
   1133			__field(dev_t, dev)
   1134			__field(u32, fhandle)
   1135			__field(u64, fileid)
   1136			__field(loff_t, offset)
   1137			__field(u32, arg_count)
   1138			__field(u32, res_count)
   1139			__field(bool, eof)
   1140			__field(int, status)
   1141		),
   1142
   1143		TP_fast_assign(
   1144			const struct inode *inode = hdr->inode;
   1145			const struct nfs_inode *nfsi = NFS_I(inode);
   1146			const struct nfs_fh *fh = hdr->args.fh ?
   1147						  hdr->args.fh : &nfsi->fh;
   1148
   1149			__entry->status = task->tk_status;
   1150			__entry->offset = hdr->args.offset;
   1151			__entry->arg_count = hdr->args.count;
   1152			__entry->res_count = hdr->res.count;
   1153			__entry->eof = hdr->res.eof;
   1154			__entry->dev = inode->i_sb->s_dev;
   1155			__entry->fileid = nfsi->fileid;
   1156			__entry->fhandle = nfs_fhandle_hash(fh);
   1157		),
   1158
   1159		TP_printk(
   1160			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1161			"offset=%lld count=%u res=%u status=%d%s",
   1162			MAJOR(__entry->dev), MINOR(__entry->dev),
   1163			(unsigned long long)__entry->fileid,
   1164			__entry->fhandle,
   1165			(long long)__entry->offset, __entry->arg_count,
   1166			__entry->res_count, __entry->status,
   1167			__entry->eof ? " eof" : ""
   1168		)
   1169);
   1170
   1171TRACE_EVENT(nfs_readpage_short,
   1172		TP_PROTO(
   1173			const struct rpc_task *task,
   1174			const struct nfs_pgio_header *hdr
   1175		),
   1176
   1177		TP_ARGS(task, hdr),
   1178
   1179		TP_STRUCT__entry(
   1180			__field(dev_t, dev)
   1181			__field(u32, fhandle)
   1182			__field(u64, fileid)
   1183			__field(loff_t, offset)
   1184			__field(u32, arg_count)
   1185			__field(u32, res_count)
   1186			__field(bool, eof)
   1187			__field(int, status)
   1188		),
   1189
   1190		TP_fast_assign(
   1191			const struct inode *inode = hdr->inode;
   1192			const struct nfs_inode *nfsi = NFS_I(inode);
   1193			const struct nfs_fh *fh = hdr->args.fh ?
   1194						  hdr->args.fh : &nfsi->fh;
   1195
   1196			__entry->status = task->tk_status;
   1197			__entry->offset = hdr->args.offset;
   1198			__entry->arg_count = hdr->args.count;
   1199			__entry->res_count = hdr->res.count;
   1200			__entry->eof = hdr->res.eof;
   1201			__entry->dev = inode->i_sb->s_dev;
   1202			__entry->fileid = nfsi->fileid;
   1203			__entry->fhandle = nfs_fhandle_hash(fh);
   1204		),
   1205
   1206		TP_printk(
   1207			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1208			"offset=%lld count=%u res=%u status=%d%s",
   1209			MAJOR(__entry->dev), MINOR(__entry->dev),
   1210			(unsigned long long)__entry->fileid,
   1211			__entry->fhandle,
   1212			(long long)__entry->offset, __entry->arg_count,
   1213			__entry->res_count, __entry->status,
   1214			__entry->eof ? " eof" : ""
   1215		)
   1216);
   1217
   1218DECLARE_EVENT_CLASS(nfs_fscache_page_event,
   1219		TP_PROTO(
   1220			const struct inode *inode,
   1221			struct page *page
   1222		),
   1223
   1224		TP_ARGS(inode, page),
   1225
   1226		TP_STRUCT__entry(
   1227			__field(dev_t, dev)
   1228			__field(u32, fhandle)
   1229			__field(u64, fileid)
   1230			__field(loff_t, offset)
   1231		),
   1232
   1233		TP_fast_assign(
   1234			const struct nfs_inode *nfsi = NFS_I(inode);
   1235			const struct nfs_fh *fh = &nfsi->fh;
   1236
   1237			__entry->offset = page_index(page) << PAGE_SHIFT;
   1238			__entry->dev = inode->i_sb->s_dev;
   1239			__entry->fileid = nfsi->fileid;
   1240			__entry->fhandle = nfs_fhandle_hash(fh);
   1241		),
   1242
   1243		TP_printk(
   1244			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1245			"offset=%lld",
   1246			MAJOR(__entry->dev), MINOR(__entry->dev),
   1247			(unsigned long long)__entry->fileid,
   1248			__entry->fhandle,
   1249			(long long)__entry->offset
   1250		)
   1251);
   1252DECLARE_EVENT_CLASS(nfs_fscache_page_event_done,
   1253		TP_PROTO(
   1254			const struct inode *inode,
   1255			struct page *page,
   1256			int error
   1257		),
   1258
   1259		TP_ARGS(inode, page, error),
   1260
   1261		TP_STRUCT__entry(
   1262			__field(int, error)
   1263			__field(dev_t, dev)
   1264			__field(u32, fhandle)
   1265			__field(u64, fileid)
   1266			__field(loff_t, offset)
   1267		),
   1268
   1269		TP_fast_assign(
   1270			const struct nfs_inode *nfsi = NFS_I(inode);
   1271			const struct nfs_fh *fh = &nfsi->fh;
   1272
   1273			__entry->offset = page_index(page) << PAGE_SHIFT;
   1274			__entry->dev = inode->i_sb->s_dev;
   1275			__entry->fileid = nfsi->fileid;
   1276			__entry->fhandle = nfs_fhandle_hash(fh);
   1277			__entry->error = error;
   1278		),
   1279
   1280		TP_printk(
   1281			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1282			"offset=%lld error=%d",
   1283			MAJOR(__entry->dev), MINOR(__entry->dev),
   1284			(unsigned long long)__entry->fileid,
   1285			__entry->fhandle,
   1286			(long long)__entry->offset, __entry->error
   1287		)
   1288);
   1289#define DEFINE_NFS_FSCACHE_PAGE_EVENT(name) \
   1290	DEFINE_EVENT(nfs_fscache_page_event, name, \
   1291			TP_PROTO( \
   1292				const struct inode *inode, \
   1293				struct page *page \
   1294			), \
   1295			TP_ARGS(inode, page))
   1296#define DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(name) \
   1297	DEFINE_EVENT(nfs_fscache_page_event_done, name, \
   1298			TP_PROTO( \
   1299				const struct inode *inode, \
   1300				struct page *page, \
   1301				int error \
   1302			), \
   1303			TP_ARGS(inode, page, error))
   1304DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_read_page);
   1305DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_read_page_exit);
   1306DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_write_page);
   1307DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_write_page_exit);
   1308
   1309TRACE_EVENT(nfs_pgio_error,
   1310	TP_PROTO(
   1311		const struct nfs_pgio_header *hdr,
   1312		int error,
   1313		loff_t pos
   1314	),
   1315
   1316	TP_ARGS(hdr, error, pos),
   1317
   1318	TP_STRUCT__entry(
   1319		__field(dev_t, dev)
   1320		__field(u32, fhandle)
   1321		__field(u64, fileid)
   1322		__field(loff_t, offset)
   1323		__field(u32, arg_count)
   1324		__field(u32, res_count)
   1325		__field(loff_t, pos)
   1326		__field(int, status)
   1327	),
   1328
   1329	TP_fast_assign(
   1330		const struct inode *inode = hdr->inode;
   1331		const struct nfs_inode *nfsi = NFS_I(inode);
   1332		const struct nfs_fh *fh = hdr->args.fh ?
   1333					  hdr->args.fh : &nfsi->fh;
   1334
   1335		__entry->status = error;
   1336		__entry->offset = hdr->args.offset;
   1337		__entry->arg_count = hdr->args.count;
   1338		__entry->res_count = hdr->res.count;
   1339		__entry->dev = inode->i_sb->s_dev;
   1340		__entry->fileid = nfsi->fileid;
   1341		__entry->fhandle = nfs_fhandle_hash(fh);
   1342	),
   1343
   1344	TP_printk("fileid=%02x:%02x:%llu fhandle=0x%08x "
   1345		  "offset=%lld count=%u res=%u pos=%llu status=%d",
   1346		MAJOR(__entry->dev), MINOR(__entry->dev),
   1347		(unsigned long long)__entry->fileid, __entry->fhandle,
   1348		(long long)__entry->offset, __entry->arg_count, __entry->res_count,
   1349		__entry->pos, __entry->status
   1350	)
   1351);
   1352
   1353TRACE_EVENT(nfs_initiate_write,
   1354		TP_PROTO(
   1355			const struct nfs_pgio_header *hdr
   1356		),
   1357
   1358		TP_ARGS(hdr),
   1359
   1360		TP_STRUCT__entry(
   1361			__field(dev_t, dev)
   1362			__field(u32, fhandle)
   1363			__field(u64, fileid)
   1364			__field(loff_t, offset)
   1365			__field(u32, count)
   1366			__field(unsigned long, stable)
   1367		),
   1368
   1369		TP_fast_assign(
   1370			const struct inode *inode = hdr->inode;
   1371			const struct nfs_inode *nfsi = NFS_I(inode);
   1372			const struct nfs_fh *fh = hdr->args.fh ?
   1373						  hdr->args.fh : &nfsi->fh;
   1374
   1375			__entry->offset = hdr->args.offset;
   1376			__entry->count = hdr->args.count;
   1377			__entry->stable = hdr->args.stable;
   1378			__entry->dev = inode->i_sb->s_dev;
   1379			__entry->fileid = nfsi->fileid;
   1380			__entry->fhandle = nfs_fhandle_hash(fh);
   1381		),
   1382
   1383		TP_printk(
   1384			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1385			"offset=%lld count=%u stable=%s",
   1386			MAJOR(__entry->dev), MINOR(__entry->dev),
   1387			(unsigned long long)__entry->fileid,
   1388			__entry->fhandle,
   1389			(long long)__entry->offset, __entry->count,
   1390			show_nfs_stable_how(__entry->stable)
   1391		)
   1392);
   1393
   1394TRACE_EVENT(nfs_writeback_done,
   1395		TP_PROTO(
   1396			const struct rpc_task *task,
   1397			const struct nfs_pgio_header *hdr
   1398		),
   1399
   1400		TP_ARGS(task, hdr),
   1401
   1402		TP_STRUCT__entry(
   1403			__field(dev_t, dev)
   1404			__field(u32, fhandle)
   1405			__field(u64, fileid)
   1406			__field(loff_t, offset)
   1407			__field(u32, arg_count)
   1408			__field(u32, res_count)
   1409			__field(int, status)
   1410			__field(unsigned long, stable)
   1411			__array(char, verifier, NFS4_VERIFIER_SIZE)
   1412		),
   1413
   1414		TP_fast_assign(
   1415			const struct inode *inode = hdr->inode;
   1416			const struct nfs_inode *nfsi = NFS_I(inode);
   1417			const struct nfs_fh *fh = hdr->args.fh ?
   1418						  hdr->args.fh : &nfsi->fh;
   1419			const struct nfs_writeverf *verf = hdr->res.verf;
   1420
   1421			__entry->status = task->tk_status;
   1422			__entry->offset = hdr->args.offset;
   1423			__entry->arg_count = hdr->args.count;
   1424			__entry->res_count = hdr->res.count;
   1425			__entry->stable = verf->committed;
   1426			memcpy(__entry->verifier,
   1427				&verf->verifier,
   1428				NFS4_VERIFIER_SIZE);
   1429			__entry->dev = inode->i_sb->s_dev;
   1430			__entry->fileid = nfsi->fileid;
   1431			__entry->fhandle = nfs_fhandle_hash(fh);
   1432		),
   1433
   1434		TP_printk(
   1435			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1436			"offset=%lld count=%u res=%u status=%d stable=%s "
   1437			"verifier=%s",
   1438			MAJOR(__entry->dev), MINOR(__entry->dev),
   1439			(unsigned long long)__entry->fileid,
   1440			__entry->fhandle,
   1441			(long long)__entry->offset, __entry->arg_count,
   1442			__entry->res_count, __entry->status,
   1443			show_nfs_stable_how(__entry->stable),
   1444			show_nfs4_verifier(__entry->verifier)
   1445		)
   1446);
   1447
   1448DECLARE_EVENT_CLASS(nfs_page_error_class,
   1449		TP_PROTO(
   1450			const struct nfs_page *req,
   1451			int error
   1452		),
   1453
   1454		TP_ARGS(req, error),
   1455
   1456		TP_STRUCT__entry(
   1457			__field(const void *, req)
   1458			__field(pgoff_t, index)
   1459			__field(unsigned int, offset)
   1460			__field(unsigned int, pgbase)
   1461			__field(unsigned int, bytes)
   1462			__field(int, error)
   1463		),
   1464
   1465		TP_fast_assign(
   1466			__entry->req = req;
   1467			__entry->index = req->wb_index;
   1468			__entry->offset = req->wb_offset;
   1469			__entry->pgbase = req->wb_pgbase;
   1470			__entry->bytes = req->wb_bytes;
   1471			__entry->error = error;
   1472		),
   1473
   1474		TP_printk(
   1475			"req=%p index=%lu offset=%u pgbase=%u bytes=%u error=%d",
   1476			__entry->req, __entry->index, __entry->offset,
   1477			__entry->pgbase, __entry->bytes, __entry->error
   1478		)
   1479);
   1480
   1481#define DEFINE_NFS_PAGEERR_EVENT(name) \
   1482	DEFINE_EVENT(nfs_page_error_class, name, \
   1483			TP_PROTO( \
   1484				const struct nfs_page *req, \
   1485				int error \
   1486			), \
   1487			TP_ARGS(req, error))
   1488
   1489DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
   1490DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
   1491DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
   1492
   1493TRACE_EVENT(nfs_initiate_commit,
   1494		TP_PROTO(
   1495			const struct nfs_commit_data *data
   1496		),
   1497
   1498		TP_ARGS(data),
   1499
   1500		TP_STRUCT__entry(
   1501			__field(dev_t, dev)
   1502			__field(u32, fhandle)
   1503			__field(u64, fileid)
   1504			__field(loff_t, offset)
   1505			__field(u32, count)
   1506		),
   1507
   1508		TP_fast_assign(
   1509			const struct inode *inode = data->inode;
   1510			const struct nfs_inode *nfsi = NFS_I(inode);
   1511			const struct nfs_fh *fh = data->args.fh ?
   1512						  data->args.fh : &nfsi->fh;
   1513
   1514			__entry->offset = data->args.offset;
   1515			__entry->count = data->args.count;
   1516			__entry->dev = inode->i_sb->s_dev;
   1517			__entry->fileid = nfsi->fileid;
   1518			__entry->fhandle = nfs_fhandle_hash(fh);
   1519		),
   1520
   1521		TP_printk(
   1522			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1523			"offset=%lld count=%u",
   1524			MAJOR(__entry->dev), MINOR(__entry->dev),
   1525			(unsigned long long)__entry->fileid,
   1526			__entry->fhandle,
   1527			(long long)__entry->offset, __entry->count
   1528		)
   1529);
   1530
   1531TRACE_EVENT(nfs_commit_done,
   1532		TP_PROTO(
   1533			const struct rpc_task *task,
   1534			const struct nfs_commit_data *data
   1535		),
   1536
   1537		TP_ARGS(task, data),
   1538
   1539		TP_STRUCT__entry(
   1540			__field(dev_t, dev)
   1541			__field(u32, fhandle)
   1542			__field(u64, fileid)
   1543			__field(loff_t, offset)
   1544			__field(int, status)
   1545			__field(unsigned long, stable)
   1546			__array(char, verifier, NFS4_VERIFIER_SIZE)
   1547		),
   1548
   1549		TP_fast_assign(
   1550			const struct inode *inode = data->inode;
   1551			const struct nfs_inode *nfsi = NFS_I(inode);
   1552			const struct nfs_fh *fh = data->args.fh ?
   1553						  data->args.fh : &nfsi->fh;
   1554			const struct nfs_writeverf *verf = data->res.verf;
   1555
   1556			__entry->status = task->tk_status;
   1557			__entry->offset = data->args.offset;
   1558			__entry->stable = verf->committed;
   1559			memcpy(__entry->verifier,
   1560				&verf->verifier,
   1561				NFS4_VERIFIER_SIZE);
   1562			__entry->dev = inode->i_sb->s_dev;
   1563			__entry->fileid = nfsi->fileid;
   1564			__entry->fhandle = nfs_fhandle_hash(fh);
   1565		),
   1566
   1567		TP_printk(
   1568			"fileid=%02x:%02x:%llu fhandle=0x%08x "
   1569			"offset=%lld status=%d stable=%s verifier=%s",
   1570			MAJOR(__entry->dev), MINOR(__entry->dev),
   1571			(unsigned long long)__entry->fileid,
   1572			__entry->fhandle,
   1573			(long long)__entry->offset, __entry->status,
   1574			show_nfs_stable_how(__entry->stable),
   1575			show_nfs4_verifier(__entry->verifier)
   1576		)
   1577);
   1578
   1579TRACE_EVENT(nfs_fh_to_dentry,
   1580		TP_PROTO(
   1581			const struct super_block *sb,
   1582			const struct nfs_fh *fh,
   1583			u64 fileid,
   1584			int error
   1585		),
   1586
   1587		TP_ARGS(sb, fh, fileid, error),
   1588
   1589		TP_STRUCT__entry(
   1590			__field(int, error)
   1591			__field(dev_t, dev)
   1592			__field(u32, fhandle)
   1593			__field(u64, fileid)
   1594		),
   1595
   1596		TP_fast_assign(
   1597			__entry->error = error;
   1598			__entry->dev = sb->s_dev;
   1599			__entry->fileid = fileid;
   1600			__entry->fhandle = nfs_fhandle_hash(fh);
   1601		),
   1602
   1603		TP_printk(
   1604			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
   1605			__entry->error,
   1606			MAJOR(__entry->dev), MINOR(__entry->dev),
   1607			(unsigned long long)__entry->fileid,
   1608			__entry->fhandle
   1609		)
   1610);
   1611
   1612DECLARE_EVENT_CLASS(nfs_xdr_event,
   1613		TP_PROTO(
   1614			const struct xdr_stream *xdr,
   1615			int error
   1616		),
   1617
   1618		TP_ARGS(xdr, error),
   1619
   1620		TP_STRUCT__entry(
   1621			__field(unsigned int, task_id)
   1622			__field(unsigned int, client_id)
   1623			__field(u32, xid)
   1624			__field(int, version)
   1625			__field(unsigned long, error)
   1626			__string(program,
   1627				 xdr->rqst->rq_task->tk_client->cl_program->name)
   1628			__string(procedure,
   1629				 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
   1630		),
   1631
   1632		TP_fast_assign(
   1633			const struct rpc_rqst *rqstp = xdr->rqst;
   1634			const struct rpc_task *task = rqstp->rq_task;
   1635
   1636			__entry->task_id = task->tk_pid;
   1637			__entry->client_id = task->tk_client->cl_clid;
   1638			__entry->xid = be32_to_cpu(rqstp->rq_xid);
   1639			__entry->version = task->tk_client->cl_vers;
   1640			__entry->error = error;
   1641			__assign_str(program,
   1642				     task->tk_client->cl_program->name);
   1643			__assign_str(procedure, task->tk_msg.rpc_proc->p_name);
   1644		),
   1645
   1646		TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
   1647			  " xid=0x%08x %sv%d %s error=%ld (%s)",
   1648			__entry->task_id, __entry->client_id, __entry->xid,
   1649			__get_str(program), __entry->version,
   1650			__get_str(procedure), -__entry->error,
   1651			show_nfs_status(__entry->error)
   1652		)
   1653);
   1654#define DEFINE_NFS_XDR_EVENT(name) \
   1655	DEFINE_EVENT(nfs_xdr_event, name, \
   1656			TP_PROTO( \
   1657				const struct xdr_stream *xdr, \
   1658				int error \
   1659			), \
   1660			TP_ARGS(xdr, error))
   1661DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
   1662DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
   1663
   1664#endif /* _TRACE_NFS_H */
   1665
   1666#undef TRACE_INCLUDE_PATH
   1667#define TRACE_INCLUDE_PATH .
   1668#define TRACE_INCLUDE_FILE nfstrace
   1669/* This part must be outside protection */
   1670#include <trace/define_trace.h>