xref: /linux/fs/nfs/nfstrace.h (revision 11d03d0a1ed8dbdabab1b5ab21861ad5cad4aef2)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f4ce1299STrond Myklebust /*
3f4ce1299STrond Myklebust  * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com>
4f4ce1299STrond Myklebust  */
5f4ce1299STrond Myklebust #undef TRACE_SYSTEM
6f4ce1299STrond Myklebust #define TRACE_SYSTEM nfs
7f4ce1299STrond Myklebust 
8f4ce1299STrond Myklebust #if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ)
9f4ce1299STrond Myklebust #define _TRACE_NFS_H
10f4ce1299STrond Myklebust 
11f4ce1299STrond Myklebust #include <linux/tracepoint.h>
121eb5d98fSJeff Layton #include <linux/iversion.h>
13f4ce1299STrond Myklebust 
149d2d48bbSChuck Lever #include <trace/events/fs.h>
158791545eSChuck Lever #include <trace/events/nfs.h>
16b4776a34SChuck Lever #include <trace/events/sunrpc_base.h>
17b4776a34SChuck Lever 
18f4ce1299STrond Myklebust #define nfs_show_cache_validity(v) \
19f4ce1299STrond Myklebust 	__print_flags(v, "|", \
20f4ce1299STrond Myklebust 			{ NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
21f4ce1299STrond Myklebust 			{ NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
22f4ce1299STrond Myklebust 			{ NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
23f4ce1299STrond Myklebust 			{ NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
24f4ce1299STrond Myklebust 			{ NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
257d4006c1SChuck Lever 			{ NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
267d4006c1SChuck Lever 			{ NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
277d4006c1SChuck Lever 			{ NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
287d4006c1SChuck Lever 			{ NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
297d4006c1SChuck Lever 			{ NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
300f44da51SFrank van der Linden 			{ NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
318a27c7ccSTrond Myklebust 			{ NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
328a27c7ccSTrond Myklebust 			{ NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
33fabf2b34STrond Myklebust 			{ NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
34720869ebSTrond Myklebust 			{ NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
35720869ebSTrond Myklebust 			{ NFS_INO_INVALID_MODE, "INVALID_MODE" })
367d4006c1SChuck Lever 
37f4ce1299STrond Myklebust #define nfs_show_nfsi_flags(v) \
38f4ce1299STrond Myklebust 	__print_flags(v, "|", \
397d4006c1SChuck Lever 			{ BIT(NFS_INO_STALE), "STALE" }, \
407d4006c1SChuck Lever 			{ BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
417d4006c1SChuck Lever 			{ BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
427d4006c1SChuck Lever 			{ BIT(NFS_INO_FSCACHE), "FSCACHE" }, \
437d4006c1SChuck Lever 			{ BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
447d4006c1SChuck Lever 			{ BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
457d4006c1SChuck Lever 			{ BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
467d4006c1SChuck Lever 			{ BIT(NFS_INO_ODIRECT), "ODIRECT" })
47f4ce1299STrond Myklebust 
48f4ce1299STrond Myklebust DECLARE_EVENT_CLASS(nfs_inode_event,
49f4ce1299STrond Myklebust 		TP_PROTO(
50f4ce1299STrond Myklebust 			const struct inode *inode
51f4ce1299STrond Myklebust 		),
52f4ce1299STrond Myklebust 
53f4ce1299STrond Myklebust 		TP_ARGS(inode),
54f4ce1299STrond Myklebust 
55f4ce1299STrond Myklebust 		TP_STRUCT__entry(
56f4ce1299STrond Myklebust 			__field(dev_t, dev)
57f4ce1299STrond Myklebust 			__field(u32, fhandle)
58f4ce1299STrond Myklebust 			__field(u64, fileid)
59f4ce1299STrond Myklebust 			__field(u64, version)
60f4ce1299STrond Myklebust 		),
61f4ce1299STrond Myklebust 
62f4ce1299STrond Myklebust 		TP_fast_assign(
63f4ce1299STrond Myklebust 			const struct nfs_inode *nfsi = NFS_I(inode);
64f4ce1299STrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
65f4ce1299STrond Myklebust 			__entry->fileid = nfsi->fileid;
66f4ce1299STrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
671eb5d98fSJeff Layton 			__entry->version = inode_peek_iversion_raw(inode);
68f4ce1299STrond Myklebust 		),
69f4ce1299STrond Myklebust 
70f4ce1299STrond Myklebust 		TP_printk(
71f4ce1299STrond Myklebust 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
72f4ce1299STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
73f4ce1299STrond Myklebust 			(unsigned long long)__entry->fileid,
74f4ce1299STrond Myklebust 			__entry->fhandle,
75f4ce1299STrond Myklebust 			(unsigned long long)__entry->version
76f4ce1299STrond Myklebust 		)
77f4ce1299STrond Myklebust );
78f4ce1299STrond Myklebust 
79f4ce1299STrond Myklebust DECLARE_EVENT_CLASS(nfs_inode_event_done,
80f4ce1299STrond Myklebust 		TP_PROTO(
81f4ce1299STrond Myklebust 			const struct inode *inode,
82f4ce1299STrond Myklebust 			int error
83f4ce1299STrond Myklebust 		),
84f4ce1299STrond Myklebust 
85f4ce1299STrond Myklebust 		TP_ARGS(inode, error),
86f4ce1299STrond Myklebust 
87f4ce1299STrond Myklebust 		TP_STRUCT__entry(
8838a638a7SChuck Lever 			__field(unsigned long, error)
89f4ce1299STrond Myklebust 			__field(dev_t, dev)
90f4ce1299STrond Myklebust 			__field(u32, fhandle)
91f4ce1299STrond Myklebust 			__field(unsigned char, type)
92f4ce1299STrond Myklebust 			__field(u64, fileid)
93f4ce1299STrond Myklebust 			__field(u64, version)
94f4ce1299STrond Myklebust 			__field(loff_t, size)
95f4ce1299STrond Myklebust 			__field(unsigned long, nfsi_flags)
96f4ce1299STrond Myklebust 			__field(unsigned long, cache_validity)
97f4ce1299STrond Myklebust 		),
98f4ce1299STrond Myklebust 
99f4ce1299STrond Myklebust 		TP_fast_assign(
100f4ce1299STrond Myklebust 			const struct nfs_inode *nfsi = NFS_I(inode);
10138a638a7SChuck Lever 			__entry->error = error < 0 ? -error : 0;
102f4ce1299STrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
103f4ce1299STrond Myklebust 			__entry->fileid = nfsi->fileid;
104f4ce1299STrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
105f4ce1299STrond Myklebust 			__entry->type = nfs_umode_to_dtype(inode->i_mode);
1061eb5d98fSJeff Layton 			__entry->version = inode_peek_iversion_raw(inode);
107f4ce1299STrond Myklebust 			__entry->size = i_size_read(inode);
108f4ce1299STrond Myklebust 			__entry->nfsi_flags = nfsi->flags;
109f4ce1299STrond Myklebust 			__entry->cache_validity = nfsi->cache_validity;
110f4ce1299STrond Myklebust 		),
111f4ce1299STrond Myklebust 
112f4ce1299STrond Myklebust 		TP_printk(
11338a638a7SChuck Lever 			"error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
114f4ce1299STrond Myklebust 			"type=%u (%s) version=%llu size=%lld "
1157d4006c1SChuck Lever 			"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
1168791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
117f4ce1299STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
118f4ce1299STrond Myklebust 			(unsigned long long)__entry->fileid,
119f4ce1299STrond Myklebust 			__entry->fhandle,
120f4ce1299STrond Myklebust 			__entry->type,
1219d2d48bbSChuck Lever 			show_fs_dirent_type(__entry->type),
122f4ce1299STrond Myklebust 			(unsigned long long)__entry->version,
123f4ce1299STrond Myklebust 			(long long)__entry->size,
124f4ce1299STrond Myklebust 			__entry->cache_validity,
125f4ce1299STrond Myklebust 			nfs_show_cache_validity(__entry->cache_validity),
126f4ce1299STrond Myklebust 			__entry->nfsi_flags,
127f4ce1299STrond Myklebust 			nfs_show_nfsi_flags(__entry->nfsi_flags)
128f4ce1299STrond Myklebust 		)
129f4ce1299STrond Myklebust );
130f4ce1299STrond Myklebust 
131f4ce1299STrond Myklebust #define DEFINE_NFS_INODE_EVENT(name) \
132f4ce1299STrond Myklebust 	DEFINE_EVENT(nfs_inode_event, name, \
133f4ce1299STrond Myklebust 			TP_PROTO( \
134f4ce1299STrond Myklebust 				const struct inode *inode \
135f4ce1299STrond Myklebust 			), \
136f4ce1299STrond Myklebust 			TP_ARGS(inode))
137f4ce1299STrond Myklebust #define DEFINE_NFS_INODE_EVENT_DONE(name) \
138f4ce1299STrond Myklebust 	DEFINE_EVENT(nfs_inode_event_done, name, \
139f4ce1299STrond Myklebust 			TP_PROTO( \
140f4ce1299STrond Myklebust 				const struct inode *inode, \
141f4ce1299STrond Myklebust 				int error \
142f4ce1299STrond Myklebust 			), \
143f4ce1299STrond Myklebust 			TP_ARGS(inode, error))
14493ce4af7STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
145f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
146f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
147f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
148f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
149f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
150f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
151f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
152f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
153f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
154f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
155f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
156f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
157f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
158f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
159f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
160f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
161f4ce1299STrond Myklebust DEFINE_NFS_INODE_EVENT(nfs_access_enter);
16293c2e5e0SBenjamin Coddington DEFINE_NFS_INODE_EVENT_DONE(nfs_set_cache_invalid);
163310e3187STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_cache_fill_done);
164310e3187STrond Myklebust DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_uncached_done);
165e8194b7dSTrond Myklebust 
166e8194b7dSTrond Myklebust TRACE_EVENT(nfs_access_exit,
167e8194b7dSTrond Myklebust 		TP_PROTO(
168e8194b7dSTrond Myklebust 			const struct inode *inode,
169e8194b7dSTrond Myklebust 			unsigned int mask,
170e8194b7dSTrond Myklebust 			unsigned int permitted,
171e8194b7dSTrond Myklebust 			int error
172e8194b7dSTrond Myklebust 		),
173e8194b7dSTrond Myklebust 
174e8194b7dSTrond Myklebust 		TP_ARGS(inode, mask, permitted, error),
175e8194b7dSTrond Myklebust 
176e8194b7dSTrond Myklebust 		TP_STRUCT__entry(
177e8194b7dSTrond Myklebust 			__field(unsigned long, error)
178e8194b7dSTrond Myklebust 			__field(dev_t, dev)
179e8194b7dSTrond Myklebust 			__field(u32, fhandle)
180e8194b7dSTrond Myklebust 			__field(unsigned char, type)
181e8194b7dSTrond Myklebust 			__field(u64, fileid)
182e8194b7dSTrond Myklebust 			__field(u64, version)
183e8194b7dSTrond Myklebust 			__field(loff_t, size)
184e8194b7dSTrond Myklebust 			__field(unsigned long, nfsi_flags)
185e8194b7dSTrond Myklebust 			__field(unsigned long, cache_validity)
186e8194b7dSTrond Myklebust 			__field(unsigned int, mask)
187e8194b7dSTrond Myklebust 			__field(unsigned int, permitted)
188e8194b7dSTrond Myklebust 		),
189e8194b7dSTrond Myklebust 
190e8194b7dSTrond Myklebust 		TP_fast_assign(
191e8194b7dSTrond Myklebust 			const struct nfs_inode *nfsi = NFS_I(inode);
192e8194b7dSTrond Myklebust 			__entry->error = error < 0 ? -error : 0;
193e8194b7dSTrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
194e8194b7dSTrond Myklebust 			__entry->fileid = nfsi->fileid;
195e8194b7dSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
196e8194b7dSTrond Myklebust 			__entry->type = nfs_umode_to_dtype(inode->i_mode);
197e8194b7dSTrond Myklebust 			__entry->version = inode_peek_iversion_raw(inode);
198e8194b7dSTrond Myklebust 			__entry->size = i_size_read(inode);
199e8194b7dSTrond Myklebust 			__entry->nfsi_flags = nfsi->flags;
200e8194b7dSTrond Myklebust 			__entry->cache_validity = nfsi->cache_validity;
201e8194b7dSTrond Myklebust 			__entry->mask = mask;
202e8194b7dSTrond Myklebust 			__entry->permitted = permitted;
203e8194b7dSTrond Myklebust 		),
204e8194b7dSTrond Myklebust 
205e8194b7dSTrond Myklebust 		TP_printk(
206e8194b7dSTrond Myklebust 			"error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
207e8194b7dSTrond Myklebust 			"type=%u (%s) version=%llu size=%lld "
208e8194b7dSTrond Myklebust 			"cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
209e8194b7dSTrond Myklebust 			"mask=0x%x permitted=0x%x",
2108791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
211e8194b7dSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
212e8194b7dSTrond Myklebust 			(unsigned long long)__entry->fileid,
213e8194b7dSTrond Myklebust 			__entry->fhandle,
214e8194b7dSTrond Myklebust 			__entry->type,
2159d2d48bbSChuck Lever 			show_fs_dirent_type(__entry->type),
216e8194b7dSTrond Myklebust 			(unsigned long long)__entry->version,
217e8194b7dSTrond Myklebust 			(long long)__entry->size,
218e8194b7dSTrond Myklebust 			__entry->cache_validity,
219e8194b7dSTrond Myklebust 			nfs_show_cache_validity(__entry->cache_validity),
220e8194b7dSTrond Myklebust 			__entry->nfsi_flags,
221e8194b7dSTrond Myklebust 			nfs_show_nfsi_flags(__entry->nfsi_flags),
222e8194b7dSTrond Myklebust 			__entry->mask, __entry->permitted
223e8194b7dSTrond Myklebust 		)
224e8194b7dSTrond Myklebust );
225f4ce1299STrond Myklebust 
226110cb2d2SChuck Lever DECLARE_EVENT_CLASS(nfs_update_size_class,
227110cb2d2SChuck Lever 		TP_PROTO(
228110cb2d2SChuck Lever 			const struct inode *inode,
229110cb2d2SChuck Lever 			loff_t new_size
230110cb2d2SChuck Lever 		),
231110cb2d2SChuck Lever 
232110cb2d2SChuck Lever 		TP_ARGS(inode, new_size),
233110cb2d2SChuck Lever 
234110cb2d2SChuck Lever 		TP_STRUCT__entry(
235110cb2d2SChuck Lever 			__field(dev_t, dev)
236110cb2d2SChuck Lever 			__field(u32, fhandle)
237110cb2d2SChuck Lever 			__field(u64, fileid)
238110cb2d2SChuck Lever 			__field(u64, version)
239110cb2d2SChuck Lever 			__field(loff_t, cur_size)
240110cb2d2SChuck Lever 			__field(loff_t, new_size)
241110cb2d2SChuck Lever 		),
242110cb2d2SChuck Lever 
243110cb2d2SChuck Lever 		TP_fast_assign(
244110cb2d2SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
245110cb2d2SChuck Lever 
246110cb2d2SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
247110cb2d2SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
248110cb2d2SChuck Lever 			__entry->fileid = nfsi->fileid;
249110cb2d2SChuck Lever 			__entry->version = inode_peek_iversion_raw(inode);
250110cb2d2SChuck Lever 			__entry->cur_size = i_size_read(inode);
251110cb2d2SChuck Lever 			__entry->new_size = new_size;
252110cb2d2SChuck Lever 		),
253110cb2d2SChuck Lever 
254110cb2d2SChuck Lever 		TP_printk(
255110cb2d2SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cursize=%lld newsize=%lld",
256110cb2d2SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
257110cb2d2SChuck Lever 			(unsigned long long)__entry->fileid,
258110cb2d2SChuck Lever 			__entry->fhandle, __entry->version,
259110cb2d2SChuck Lever 			__entry->cur_size, __entry->new_size
260110cb2d2SChuck Lever 		)
261110cb2d2SChuck Lever );
262110cb2d2SChuck Lever 
263110cb2d2SChuck Lever #define DEFINE_NFS_UPDATE_SIZE_EVENT(name) \
264110cb2d2SChuck Lever 	DEFINE_EVENT(nfs_update_size_class, nfs_size_##name, \
265110cb2d2SChuck Lever 			TP_PROTO( \
266110cb2d2SChuck Lever 				const struct inode *inode, \
267110cb2d2SChuck Lever 				loff_t new_size \
268110cb2d2SChuck Lever 			), \
269110cb2d2SChuck Lever 			TP_ARGS(inode, new_size))
270110cb2d2SChuck Lever 
271110cb2d2SChuck Lever DEFINE_NFS_UPDATE_SIZE_EVENT(truncate);
272110cb2d2SChuck Lever DEFINE_NFS_UPDATE_SIZE_EVENT(wcc);
273110cb2d2SChuck Lever DEFINE_NFS_UPDATE_SIZE_EVENT(update);
274110cb2d2SChuck Lever DEFINE_NFS_UPDATE_SIZE_EVENT(grow);
275110cb2d2SChuck Lever 
276*11d03d0aSTrond Myklebust DECLARE_EVENT_CLASS(nfs_inode_range_event,
277*11d03d0aSTrond Myklebust 		TP_PROTO(
278*11d03d0aSTrond Myklebust 			const struct inode *inode,
279*11d03d0aSTrond Myklebust 			loff_t range_start,
280*11d03d0aSTrond Myklebust 			loff_t range_end
281*11d03d0aSTrond Myklebust 		),
282*11d03d0aSTrond Myklebust 
283*11d03d0aSTrond Myklebust 		TP_ARGS(inode, range_start, range_end),
284*11d03d0aSTrond Myklebust 
285*11d03d0aSTrond Myklebust 		TP_STRUCT__entry(
286*11d03d0aSTrond Myklebust 			__field(dev_t, dev)
287*11d03d0aSTrond Myklebust 			__field(u32, fhandle)
288*11d03d0aSTrond Myklebust 			__field(u64, fileid)
289*11d03d0aSTrond Myklebust 			__field(u64, version)
290*11d03d0aSTrond Myklebust 			__field(loff_t, range_start)
291*11d03d0aSTrond Myklebust 			__field(loff_t, range_end)
292*11d03d0aSTrond Myklebust 		),
293*11d03d0aSTrond Myklebust 
294*11d03d0aSTrond Myklebust 		TP_fast_assign(
295*11d03d0aSTrond Myklebust 			const struct nfs_inode *nfsi = NFS_I(inode);
296*11d03d0aSTrond Myklebust 
297*11d03d0aSTrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
298*11d03d0aSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
299*11d03d0aSTrond Myklebust 			__entry->fileid = nfsi->fileid;
300*11d03d0aSTrond Myklebust 			__entry->version = inode_peek_iversion_raw(inode);
301*11d03d0aSTrond Myklebust 			__entry->range_start = range_start;
302*11d03d0aSTrond Myklebust 			__entry->range_end = range_end;
303*11d03d0aSTrond Myklebust 		),
304*11d03d0aSTrond Myklebust 
305*11d03d0aSTrond Myklebust 		TP_printk(
306*11d03d0aSTrond Myklebust 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
307*11d03d0aSTrond Myklebust 			"range=[%lld, %lld]",
308*11d03d0aSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
309*11d03d0aSTrond Myklebust 			(unsigned long long)__entry->fileid,
310*11d03d0aSTrond Myklebust 			__entry->fhandle, __entry->version,
311*11d03d0aSTrond Myklebust 			__entry->range_start, __entry->range_end
312*11d03d0aSTrond Myklebust 		)
313*11d03d0aSTrond Myklebust );
314*11d03d0aSTrond Myklebust 
315*11d03d0aSTrond Myklebust #define DEFINE_NFS_INODE_RANGE_EVENT(name) \
316*11d03d0aSTrond Myklebust 	DEFINE_EVENT(nfs_inode_range_event, name, \
317*11d03d0aSTrond Myklebust 			TP_PROTO( \
318*11d03d0aSTrond Myklebust 				const struct inode *inode, \
319*11d03d0aSTrond Myklebust 				loff_t range_start, \
320*11d03d0aSTrond Myklebust 				loff_t range_end \
321*11d03d0aSTrond Myklebust 			), \
322*11d03d0aSTrond Myklebust 			TP_ARGS(inode, range_start, range_end))
323*11d03d0aSTrond Myklebust 
324*11d03d0aSTrond Myklebust DEFINE_NFS_INODE_RANGE_EVENT(nfs_readdir_invalidate_cache_range);
325*11d03d0aSTrond Myklebust 
326310e3187STrond Myklebust DECLARE_EVENT_CLASS(nfs_readdir_event,
327310e3187STrond Myklebust 		TP_PROTO(
328310e3187STrond Myklebust 			const struct file *file,
329310e3187STrond Myklebust 			const __be32 *verifier,
330310e3187STrond Myklebust 			u64 cookie,
331310e3187STrond Myklebust 			pgoff_t page_index,
332310e3187STrond Myklebust 			unsigned int dtsize
333310e3187STrond Myklebust 		),
334310e3187STrond Myklebust 
335310e3187STrond Myklebust 		TP_ARGS(file, verifier, cookie, page_index, dtsize),
336310e3187STrond Myklebust 
337310e3187STrond Myklebust 		TP_STRUCT__entry(
338310e3187STrond Myklebust 			__field(dev_t, dev)
339310e3187STrond Myklebust 			__field(u32, fhandle)
340310e3187STrond Myklebust 			__field(u64, fileid)
341310e3187STrond Myklebust 			__field(u64, version)
342310e3187STrond Myklebust 			__array(char, verifier, NFS4_VERIFIER_SIZE)
343310e3187STrond Myklebust 			__field(u64, cookie)
344310e3187STrond Myklebust 			__field(pgoff_t, index)
345310e3187STrond Myklebust 			__field(unsigned int, dtsize)
346310e3187STrond Myklebust 		),
347310e3187STrond Myklebust 
348310e3187STrond Myklebust 		TP_fast_assign(
349310e3187STrond Myklebust 			const struct inode *dir = file_inode(file);
350310e3187STrond Myklebust 			const struct nfs_inode *nfsi = NFS_I(dir);
351310e3187STrond Myklebust 
352310e3187STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
353310e3187STrond Myklebust 			__entry->fileid = nfsi->fileid;
354310e3187STrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
355310e3187STrond Myklebust 			__entry->version = inode_peek_iversion_raw(dir);
356310e3187STrond Myklebust 			if (cookie != 0)
357310e3187STrond Myklebust 				memcpy(__entry->verifier, verifier,
358310e3187STrond Myklebust 				       NFS4_VERIFIER_SIZE);
359310e3187STrond Myklebust 			else
360310e3187STrond Myklebust 				memset(__entry->verifier, 0,
361310e3187STrond Myklebust 				       NFS4_VERIFIER_SIZE);
362310e3187STrond Myklebust 			__entry->cookie = cookie;
363310e3187STrond Myklebust 			__entry->index = page_index;
364310e3187STrond Myklebust 			__entry->dtsize = dtsize;
365310e3187STrond Myklebust 		),
366310e3187STrond Myklebust 
367310e3187STrond Myklebust 		TP_printk(
368310e3187STrond Myklebust 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
369310e3187STrond Myklebust 			"cookie=%s:0x%llx cache_index=%lu dtsize=%u",
370310e3187STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
371310e3187STrond Myklebust 			(unsigned long long)__entry->fileid, __entry->fhandle,
372310e3187STrond Myklebust 			__entry->version, show_nfs4_verifier(__entry->verifier),
373310e3187STrond Myklebust 			(unsigned long long)__entry->cookie, __entry->index,
374310e3187STrond Myklebust 			__entry->dtsize
375310e3187STrond Myklebust 		)
376310e3187STrond Myklebust );
377310e3187STrond Myklebust 
378310e3187STrond Myklebust #define DEFINE_NFS_READDIR_EVENT(name) \
379310e3187STrond Myklebust 	DEFINE_EVENT(nfs_readdir_event, name, \
380310e3187STrond Myklebust 			TP_PROTO( \
381310e3187STrond Myklebust 				const struct file *file, \
382310e3187STrond Myklebust 				const __be32 *verifier, \
383310e3187STrond Myklebust 				u64 cookie, \
384310e3187STrond Myklebust 				pgoff_t page_index, \
385310e3187STrond Myklebust 				unsigned int dtsize \
386310e3187STrond Myklebust 				), \
387310e3187STrond Myklebust 			TP_ARGS(file, verifier, cookie, page_index, dtsize))
388310e3187STrond Myklebust 
389310e3187STrond Myklebust DEFINE_NFS_READDIR_EVENT(nfs_readdir_cache_fill);
390310e3187STrond Myklebust DEFINE_NFS_READDIR_EVENT(nfs_readdir_uncached);
391310e3187STrond Myklebust 
3926e0d0be7STrond Myklebust DECLARE_EVENT_CLASS(nfs_lookup_event,
3936e0d0be7STrond Myklebust 		TP_PROTO(
3946e0d0be7STrond Myklebust 			const struct inode *dir,
3956e0d0be7STrond Myklebust 			const struct dentry *dentry,
3966e0d0be7STrond Myklebust 			unsigned int flags
3976e0d0be7STrond Myklebust 		),
3986e0d0be7STrond Myklebust 
3996e0d0be7STrond Myklebust 		TP_ARGS(dir, dentry, flags),
4006e0d0be7STrond Myklebust 
4016e0d0be7STrond Myklebust 		TP_STRUCT__entry(
4027d4006c1SChuck Lever 			__field(unsigned long, flags)
4036e0d0be7STrond Myklebust 			__field(dev_t, dev)
4046e0d0be7STrond Myklebust 			__field(u64, dir)
4056e0d0be7STrond Myklebust 			__string(name, dentry->d_name.name)
4066e0d0be7STrond Myklebust 		),
4076e0d0be7STrond Myklebust 
4086e0d0be7STrond Myklebust 		TP_fast_assign(
4096e0d0be7STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
4106e0d0be7STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
4116e0d0be7STrond Myklebust 			__entry->flags = flags;
4126e0d0be7STrond Myklebust 			__assign_str(name, dentry->d_name.name);
4136e0d0be7STrond Myklebust 		),
4146e0d0be7STrond Myklebust 
4156e0d0be7STrond Myklebust 		TP_printk(
4167d4006c1SChuck Lever 			"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
4176e0d0be7STrond Myklebust 			__entry->flags,
4189d2d48bbSChuck Lever 			show_fs_lookup_flags(__entry->flags),
4196e0d0be7STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
4206e0d0be7STrond Myklebust 			(unsigned long long)__entry->dir,
4216e0d0be7STrond Myklebust 			__get_str(name)
4226e0d0be7STrond Myklebust 		)
4236e0d0be7STrond Myklebust );
4246e0d0be7STrond Myklebust 
4256e0d0be7STrond Myklebust #define DEFINE_NFS_LOOKUP_EVENT(name) \
4266e0d0be7STrond Myklebust 	DEFINE_EVENT(nfs_lookup_event, name, \
4276e0d0be7STrond Myklebust 			TP_PROTO( \
4286e0d0be7STrond Myklebust 				const struct inode *dir, \
4296e0d0be7STrond Myklebust 				const struct dentry *dentry, \
4306e0d0be7STrond Myklebust 				unsigned int flags \
4316e0d0be7STrond Myklebust 			), \
4326e0d0be7STrond Myklebust 			TP_ARGS(dir, dentry, flags))
4336e0d0be7STrond Myklebust 
4346e0d0be7STrond Myklebust DECLARE_EVENT_CLASS(nfs_lookup_event_done,
4356e0d0be7STrond Myklebust 		TP_PROTO(
4366e0d0be7STrond Myklebust 			const struct inode *dir,
4376e0d0be7STrond Myklebust 			const struct dentry *dentry,
4386e0d0be7STrond Myklebust 			unsigned int flags,
4396e0d0be7STrond Myklebust 			int error
4406e0d0be7STrond Myklebust 		),
4416e0d0be7STrond Myklebust 
4426e0d0be7STrond Myklebust 		TP_ARGS(dir, dentry, flags, error),
4436e0d0be7STrond Myklebust 
4446e0d0be7STrond Myklebust 		TP_STRUCT__entry(
44538a638a7SChuck Lever 			__field(unsigned long, error)
4467d4006c1SChuck Lever 			__field(unsigned long, flags)
4476e0d0be7STrond Myklebust 			__field(dev_t, dev)
4486e0d0be7STrond Myklebust 			__field(u64, dir)
4496e0d0be7STrond Myklebust 			__string(name, dentry->d_name.name)
4506e0d0be7STrond Myklebust 		),
4516e0d0be7STrond Myklebust 
4526e0d0be7STrond Myklebust 		TP_fast_assign(
4536e0d0be7STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
4546e0d0be7STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
45538a638a7SChuck Lever 			__entry->error = error < 0 ? -error : 0;
4566e0d0be7STrond Myklebust 			__entry->flags = flags;
4576e0d0be7STrond Myklebust 			__assign_str(name, dentry->d_name.name);
4586e0d0be7STrond Myklebust 		),
4596e0d0be7STrond Myklebust 
4606e0d0be7STrond Myklebust 		TP_printk(
4617d4006c1SChuck Lever 			"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
4628791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
4636e0d0be7STrond Myklebust 			__entry->flags,
4649d2d48bbSChuck Lever 			show_fs_lookup_flags(__entry->flags),
4656e0d0be7STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
4666e0d0be7STrond Myklebust 			(unsigned long long)__entry->dir,
4676e0d0be7STrond Myklebust 			__get_str(name)
4686e0d0be7STrond Myklebust 		)
4696e0d0be7STrond Myklebust );
4706e0d0be7STrond Myklebust 
4716e0d0be7STrond Myklebust #define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
4726e0d0be7STrond Myklebust 	DEFINE_EVENT(nfs_lookup_event_done, name, \
4736e0d0be7STrond Myklebust 			TP_PROTO( \
4746e0d0be7STrond Myklebust 				const struct inode *dir, \
4756e0d0be7STrond Myklebust 				const struct dentry *dentry, \
4766e0d0be7STrond Myklebust 				unsigned int flags, \
4776e0d0be7STrond Myklebust 				int error \
4786e0d0be7STrond Myklebust 			), \
4796e0d0be7STrond Myklebust 			TP_ARGS(dir, dentry, flags, error))
4806e0d0be7STrond Myklebust 
4816e0d0be7STrond Myklebust DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
4826e0d0be7STrond Myklebust DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
4836e0d0be7STrond Myklebust DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
4846e0d0be7STrond Myklebust DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
485eace45a1STrond Myklebust DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup);
486eace45a1STrond Myklebust DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup_revalidate_failed);
487eace45a1STrond Myklebust DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_readdir_lookup_revalidate);
4886e0d0be7STrond Myklebust 
4896e0d0be7STrond Myklebust TRACE_EVENT(nfs_atomic_open_enter,
4906e0d0be7STrond Myklebust 		TP_PROTO(
4916e0d0be7STrond Myklebust 			const struct inode *dir,
4926e0d0be7STrond Myklebust 			const struct nfs_open_context *ctx,
4936e0d0be7STrond Myklebust 			unsigned int flags
4946e0d0be7STrond Myklebust 		),
4956e0d0be7STrond Myklebust 
4966e0d0be7STrond Myklebust 		TP_ARGS(dir, ctx, flags),
4976e0d0be7STrond Myklebust 
4986e0d0be7STrond Myklebust 		TP_STRUCT__entry(
4997d4006c1SChuck Lever 			__field(unsigned long, flags)
5009d2d48bbSChuck Lever 			__field(unsigned long, fmode)
5016e0d0be7STrond Myklebust 			__field(dev_t, dev)
5026e0d0be7STrond Myklebust 			__field(u64, dir)
5036e0d0be7STrond Myklebust 			__string(name, ctx->dentry->d_name.name)
5046e0d0be7STrond Myklebust 		),
5056e0d0be7STrond Myklebust 
5066e0d0be7STrond Myklebust 		TP_fast_assign(
5076e0d0be7STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
5086e0d0be7STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
5096e0d0be7STrond Myklebust 			__entry->flags = flags;
5109d2d48bbSChuck Lever 			__entry->fmode = (__force unsigned long)ctx->mode;
5116e0d0be7STrond Myklebust 			__assign_str(name, ctx->dentry->d_name.name);
5126e0d0be7STrond Myklebust 		),
5136e0d0be7STrond Myklebust 
5146e0d0be7STrond Myklebust 		TP_printk(
5157d4006c1SChuck Lever 			"flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
5166e0d0be7STrond Myklebust 			__entry->flags,
5179d2d48bbSChuck Lever 			show_fs_fcntl_open_flags(__entry->flags),
5189d2d48bbSChuck Lever 			show_fs_fmode_flags(__entry->fmode),
5196e0d0be7STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
5206e0d0be7STrond Myklebust 			(unsigned long long)__entry->dir,
5216e0d0be7STrond Myklebust 			__get_str(name)
5226e0d0be7STrond Myklebust 		)
5236e0d0be7STrond Myklebust );
5246e0d0be7STrond Myklebust 
5256e0d0be7STrond Myklebust TRACE_EVENT(nfs_atomic_open_exit,
5266e0d0be7STrond Myklebust 		TP_PROTO(
5276e0d0be7STrond Myklebust 			const struct inode *dir,
5286e0d0be7STrond Myklebust 			const struct nfs_open_context *ctx,
5296e0d0be7STrond Myklebust 			unsigned int flags,
5306e0d0be7STrond Myklebust 			int error
5316e0d0be7STrond Myklebust 		),
5326e0d0be7STrond Myklebust 
5336e0d0be7STrond Myklebust 		TP_ARGS(dir, ctx, flags, error),
5346e0d0be7STrond Myklebust 
5356e0d0be7STrond Myklebust 		TP_STRUCT__entry(
53638a638a7SChuck Lever 			__field(unsigned long, error)
5377d4006c1SChuck Lever 			__field(unsigned long, flags)
5389d2d48bbSChuck Lever 			__field(unsigned long, fmode)
5396e0d0be7STrond Myklebust 			__field(dev_t, dev)
5406e0d0be7STrond Myklebust 			__field(u64, dir)
5416e0d0be7STrond Myklebust 			__string(name, ctx->dentry->d_name.name)
5426e0d0be7STrond Myklebust 		),
5436e0d0be7STrond Myklebust 
5446e0d0be7STrond Myklebust 		TP_fast_assign(
54538a638a7SChuck Lever 			__entry->error = -error;
5466e0d0be7STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
5476e0d0be7STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
5486e0d0be7STrond Myklebust 			__entry->flags = flags;
5499d2d48bbSChuck Lever 			__entry->fmode = (__force unsigned long)ctx->mode;
5506e0d0be7STrond Myklebust 			__assign_str(name, ctx->dentry->d_name.name);
5516e0d0be7STrond Myklebust 		),
5526e0d0be7STrond Myklebust 
5536e0d0be7STrond Myklebust 		TP_printk(
5547d4006c1SChuck Lever 			"error=%ld (%s) flags=0x%lx (%s) fmode=%s "
5556e0d0be7STrond Myklebust 			"name=%02x:%02x:%llu/%s",
5568791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
5576e0d0be7STrond Myklebust 			__entry->flags,
5589d2d48bbSChuck Lever 			show_fs_fcntl_open_flags(__entry->flags),
5599d2d48bbSChuck Lever 			show_fs_fmode_flags(__entry->fmode),
5606e0d0be7STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
5616e0d0be7STrond Myklebust 			(unsigned long long)__entry->dir,
5626e0d0be7STrond Myklebust 			__get_str(name)
5636e0d0be7STrond Myklebust 		)
5646e0d0be7STrond Myklebust );
5656e0d0be7STrond Myklebust 
5668b0ad3d4STrond Myklebust TRACE_EVENT(nfs_create_enter,
5678b0ad3d4STrond Myklebust 		TP_PROTO(
5688b0ad3d4STrond Myklebust 			const struct inode *dir,
5698b0ad3d4STrond Myklebust 			const struct dentry *dentry,
5708b0ad3d4STrond Myklebust 			unsigned int flags
5718b0ad3d4STrond Myklebust 		),
5728b0ad3d4STrond Myklebust 
5738b0ad3d4STrond Myklebust 		TP_ARGS(dir, dentry, flags),
5748b0ad3d4STrond Myklebust 
5758b0ad3d4STrond Myklebust 		TP_STRUCT__entry(
5767d4006c1SChuck Lever 			__field(unsigned long, flags)
5778b0ad3d4STrond Myklebust 			__field(dev_t, dev)
5788b0ad3d4STrond Myklebust 			__field(u64, dir)
5798b0ad3d4STrond Myklebust 			__string(name, dentry->d_name.name)
5808b0ad3d4STrond Myklebust 		),
5818b0ad3d4STrond Myklebust 
5828b0ad3d4STrond Myklebust 		TP_fast_assign(
5838b0ad3d4STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
5848b0ad3d4STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
5858b0ad3d4STrond Myklebust 			__entry->flags = flags;
5868b0ad3d4STrond Myklebust 			__assign_str(name, dentry->d_name.name);
5878b0ad3d4STrond Myklebust 		),
5888b0ad3d4STrond Myklebust 
5898b0ad3d4STrond Myklebust 		TP_printk(
5907d4006c1SChuck Lever 			"flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
5918b0ad3d4STrond Myklebust 			__entry->flags,
5929d2d48bbSChuck Lever 			show_fs_fcntl_open_flags(__entry->flags),
5938b0ad3d4STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
5948b0ad3d4STrond Myklebust 			(unsigned long long)__entry->dir,
5958b0ad3d4STrond Myklebust 			__get_str(name)
5968b0ad3d4STrond Myklebust 		)
5978b0ad3d4STrond Myklebust );
5988b0ad3d4STrond Myklebust 
5998b0ad3d4STrond Myklebust TRACE_EVENT(nfs_create_exit,
6008b0ad3d4STrond Myklebust 		TP_PROTO(
6018b0ad3d4STrond Myklebust 			const struct inode *dir,
6028b0ad3d4STrond Myklebust 			const struct dentry *dentry,
6038b0ad3d4STrond Myklebust 			unsigned int flags,
6048b0ad3d4STrond Myklebust 			int error
6058b0ad3d4STrond Myklebust 		),
6068b0ad3d4STrond Myklebust 
6078b0ad3d4STrond Myklebust 		TP_ARGS(dir, dentry, flags, error),
6088b0ad3d4STrond Myklebust 
6098b0ad3d4STrond Myklebust 		TP_STRUCT__entry(
61038a638a7SChuck Lever 			__field(unsigned long, error)
6117d4006c1SChuck Lever 			__field(unsigned long, flags)
6128b0ad3d4STrond Myklebust 			__field(dev_t, dev)
6138b0ad3d4STrond Myklebust 			__field(u64, dir)
6148b0ad3d4STrond Myklebust 			__string(name, dentry->d_name.name)
6158b0ad3d4STrond Myklebust 		),
6168b0ad3d4STrond Myklebust 
6178b0ad3d4STrond Myklebust 		TP_fast_assign(
61838a638a7SChuck Lever 			__entry->error = -error;
6198b0ad3d4STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
6208b0ad3d4STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
6218b0ad3d4STrond Myklebust 			__entry->flags = flags;
6228b0ad3d4STrond Myklebust 			__assign_str(name, dentry->d_name.name);
6238b0ad3d4STrond Myklebust 		),
6248b0ad3d4STrond Myklebust 
6258b0ad3d4STrond Myklebust 		TP_printk(
6267d4006c1SChuck Lever 			"error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
6278791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
6288b0ad3d4STrond Myklebust 			__entry->flags,
6299d2d48bbSChuck Lever 			show_fs_fcntl_open_flags(__entry->flags),
6308b0ad3d4STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
6318b0ad3d4STrond Myklebust 			(unsigned long long)__entry->dir,
6328b0ad3d4STrond Myklebust 			__get_str(name)
6338b0ad3d4STrond Myklebust 		)
6348b0ad3d4STrond Myklebust );
6358b0ad3d4STrond Myklebust 
6361ca42382STrond Myklebust DECLARE_EVENT_CLASS(nfs_directory_event,
6371ca42382STrond Myklebust 		TP_PROTO(
6381ca42382STrond Myklebust 			const struct inode *dir,
6391ca42382STrond Myklebust 			const struct dentry *dentry
6401ca42382STrond Myklebust 		),
6411ca42382STrond Myklebust 
6421ca42382STrond Myklebust 		TP_ARGS(dir, dentry),
6431ca42382STrond Myklebust 
6441ca42382STrond Myklebust 		TP_STRUCT__entry(
6451ca42382STrond Myklebust 			__field(dev_t, dev)
6461ca42382STrond Myklebust 			__field(u64, dir)
6471ca42382STrond Myklebust 			__string(name, dentry->d_name.name)
6481ca42382STrond Myklebust 		),
6491ca42382STrond Myklebust 
6501ca42382STrond Myklebust 		TP_fast_assign(
6511ca42382STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
6521ca42382STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
6531ca42382STrond Myklebust 			__assign_str(name, dentry->d_name.name);
6541ca42382STrond Myklebust 		),
6551ca42382STrond Myklebust 
6561ca42382STrond Myklebust 		TP_printk(
6571ca42382STrond Myklebust 			"name=%02x:%02x:%llu/%s",
6581ca42382STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
6591ca42382STrond Myklebust 			(unsigned long long)__entry->dir,
6601ca42382STrond Myklebust 			__get_str(name)
6611ca42382STrond Myklebust 		)
6621ca42382STrond Myklebust );
6631ca42382STrond Myklebust 
6641ca42382STrond Myklebust #define DEFINE_NFS_DIRECTORY_EVENT(name) \
6651ca42382STrond Myklebust 	DEFINE_EVENT(nfs_directory_event, name, \
6661ca42382STrond Myklebust 			TP_PROTO( \
6671ca42382STrond Myklebust 				const struct inode *dir, \
6681ca42382STrond Myklebust 				const struct dentry *dentry \
6691ca42382STrond Myklebust 			), \
6701ca42382STrond Myklebust 			TP_ARGS(dir, dentry))
6711ca42382STrond Myklebust 
6721ca42382STrond Myklebust DECLARE_EVENT_CLASS(nfs_directory_event_done,
6731ca42382STrond Myklebust 		TP_PROTO(
6741ca42382STrond Myklebust 			const struct inode *dir,
6751ca42382STrond Myklebust 			const struct dentry *dentry,
6761ca42382STrond Myklebust 			int error
6771ca42382STrond Myklebust 		),
6781ca42382STrond Myklebust 
6791ca42382STrond Myklebust 		TP_ARGS(dir, dentry, error),
6801ca42382STrond Myklebust 
6811ca42382STrond Myklebust 		TP_STRUCT__entry(
68238a638a7SChuck Lever 			__field(unsigned long, error)
6831ca42382STrond Myklebust 			__field(dev_t, dev)
6841ca42382STrond Myklebust 			__field(u64, dir)
6851ca42382STrond Myklebust 			__string(name, dentry->d_name.name)
6861ca42382STrond Myklebust 		),
6871ca42382STrond Myklebust 
6881ca42382STrond Myklebust 		TP_fast_assign(
6891ca42382STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
6901ca42382STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
69138a638a7SChuck Lever 			__entry->error = error < 0 ? -error : 0;
6921ca42382STrond Myklebust 			__assign_str(name, dentry->d_name.name);
6931ca42382STrond Myklebust 		),
6941ca42382STrond Myklebust 
6951ca42382STrond Myklebust 		TP_printk(
69638a638a7SChuck Lever 			"error=%ld (%s) name=%02x:%02x:%llu/%s",
6978791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
6981ca42382STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
6991ca42382STrond Myklebust 			(unsigned long long)__entry->dir,
7001ca42382STrond Myklebust 			__get_str(name)
7011ca42382STrond Myklebust 		)
7021ca42382STrond Myklebust );
7031ca42382STrond Myklebust 
7041ca42382STrond Myklebust #define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
7051ca42382STrond Myklebust 	DEFINE_EVENT(nfs_directory_event_done, name, \
7061ca42382STrond Myklebust 			TP_PROTO( \
7071ca42382STrond Myklebust 				const struct inode *dir, \
7081ca42382STrond Myklebust 				const struct dentry *dentry, \
7091ca42382STrond Myklebust 				int error \
7101ca42382STrond Myklebust 			), \
7111ca42382STrond Myklebust 			TP_ARGS(dir, dentry, error))
7121ca42382STrond Myklebust 
7131ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
7141ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
7151ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
7161ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
7171ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
7181ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
7191ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
7201ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
7211ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
7221ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
7231ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
7241ca42382STrond Myklebust DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
7251ca42382STrond Myklebust 
7261fd1085bSTrond Myklebust TRACE_EVENT(nfs_link_enter,
7271fd1085bSTrond Myklebust 		TP_PROTO(
7281fd1085bSTrond Myklebust 			const struct inode *inode,
7291fd1085bSTrond Myklebust 			const struct inode *dir,
7301fd1085bSTrond Myklebust 			const struct dentry *dentry
7311fd1085bSTrond Myklebust 		),
7321fd1085bSTrond Myklebust 
7331fd1085bSTrond Myklebust 		TP_ARGS(inode, dir, dentry),
7341fd1085bSTrond Myklebust 
7351fd1085bSTrond Myklebust 		TP_STRUCT__entry(
7361fd1085bSTrond Myklebust 			__field(dev_t, dev)
7371fd1085bSTrond Myklebust 			__field(u64, fileid)
7381fd1085bSTrond Myklebust 			__field(u64, dir)
7391fd1085bSTrond Myklebust 			__string(name, dentry->d_name.name)
7401fd1085bSTrond Myklebust 		),
7411fd1085bSTrond Myklebust 
7421fd1085bSTrond Myklebust 		TP_fast_assign(
7431fd1085bSTrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
7441fd1085bSTrond Myklebust 			__entry->fileid = NFS_FILEID(inode);
7451fd1085bSTrond Myklebust 			__entry->dir = NFS_FILEID(dir);
7461fd1085bSTrond Myklebust 			__assign_str(name, dentry->d_name.name);
7471fd1085bSTrond Myklebust 		),
7481fd1085bSTrond Myklebust 
7491fd1085bSTrond Myklebust 		TP_printk(
7501fd1085bSTrond Myklebust 			"fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
7511fd1085bSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
7521fd1085bSTrond Myklebust 			__entry->fileid,
7531fd1085bSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
7541fd1085bSTrond Myklebust 			(unsigned long long)__entry->dir,
7551fd1085bSTrond Myklebust 			__get_str(name)
7561fd1085bSTrond Myklebust 		)
7571fd1085bSTrond Myklebust );
7581fd1085bSTrond Myklebust 
7591fd1085bSTrond Myklebust TRACE_EVENT(nfs_link_exit,
7601fd1085bSTrond Myklebust 		TP_PROTO(
7611fd1085bSTrond Myklebust 			const struct inode *inode,
7621fd1085bSTrond Myklebust 			const struct inode *dir,
7631fd1085bSTrond Myklebust 			const struct dentry *dentry,
7641fd1085bSTrond Myklebust 			int error
7651fd1085bSTrond Myklebust 		),
7661fd1085bSTrond Myklebust 
7671fd1085bSTrond Myklebust 		TP_ARGS(inode, dir, dentry, error),
7681fd1085bSTrond Myklebust 
7691fd1085bSTrond Myklebust 		TP_STRUCT__entry(
77038a638a7SChuck Lever 			__field(unsigned long, error)
7711fd1085bSTrond Myklebust 			__field(dev_t, dev)
7721fd1085bSTrond Myklebust 			__field(u64, fileid)
7731fd1085bSTrond Myklebust 			__field(u64, dir)
7741fd1085bSTrond Myklebust 			__string(name, dentry->d_name.name)
7751fd1085bSTrond Myklebust 		),
7761fd1085bSTrond Myklebust 
7771fd1085bSTrond Myklebust 		TP_fast_assign(
7781fd1085bSTrond Myklebust 			__entry->dev = inode->i_sb->s_dev;
7791fd1085bSTrond Myklebust 			__entry->fileid = NFS_FILEID(inode);
7801fd1085bSTrond Myklebust 			__entry->dir = NFS_FILEID(dir);
78138a638a7SChuck Lever 			__entry->error = error < 0 ? -error : 0;
7821fd1085bSTrond Myklebust 			__assign_str(name, dentry->d_name.name);
7831fd1085bSTrond Myklebust 		),
7841fd1085bSTrond Myklebust 
7851fd1085bSTrond Myklebust 		TP_printk(
78638a638a7SChuck Lever 			"error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
7878791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
7881fd1085bSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
7891fd1085bSTrond Myklebust 			__entry->fileid,
7901fd1085bSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
7911fd1085bSTrond Myklebust 			(unsigned long long)__entry->dir,
7921fd1085bSTrond Myklebust 			__get_str(name)
7931fd1085bSTrond Myklebust 		)
7941fd1085bSTrond Myklebust );
7951fd1085bSTrond Myklebust 
79670ded201STrond Myklebust DECLARE_EVENT_CLASS(nfs_rename_event,
79770ded201STrond Myklebust 		TP_PROTO(
79870ded201STrond Myklebust 			const struct inode *old_dir,
79970ded201STrond Myklebust 			const struct dentry *old_dentry,
80070ded201STrond Myklebust 			const struct inode *new_dir,
80170ded201STrond Myklebust 			const struct dentry *new_dentry
80270ded201STrond Myklebust 		),
80370ded201STrond Myklebust 
80470ded201STrond Myklebust 		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
80570ded201STrond Myklebust 
80670ded201STrond Myklebust 		TP_STRUCT__entry(
80770ded201STrond Myklebust 			__field(dev_t, dev)
80870ded201STrond Myklebust 			__field(u64, old_dir)
80970ded201STrond Myklebust 			__field(u64, new_dir)
81070ded201STrond Myklebust 			__string(old_name, old_dentry->d_name.name)
81170ded201STrond Myklebust 			__string(new_name, new_dentry->d_name.name)
81270ded201STrond Myklebust 		),
81370ded201STrond Myklebust 
81470ded201STrond Myklebust 		TP_fast_assign(
81570ded201STrond Myklebust 			__entry->dev = old_dir->i_sb->s_dev;
81670ded201STrond Myklebust 			__entry->old_dir = NFS_FILEID(old_dir);
81770ded201STrond Myklebust 			__entry->new_dir = NFS_FILEID(new_dir);
81870ded201STrond Myklebust 			__assign_str(old_name, old_dentry->d_name.name);
81970ded201STrond Myklebust 			__assign_str(new_name, new_dentry->d_name.name);
82070ded201STrond Myklebust 		),
82170ded201STrond Myklebust 
82270ded201STrond Myklebust 		TP_printk(
82370ded201STrond Myklebust 			"old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
82470ded201STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
82570ded201STrond Myklebust 			(unsigned long long)__entry->old_dir,
82670ded201STrond Myklebust 			__get_str(old_name),
82770ded201STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
82870ded201STrond Myklebust 			(unsigned long long)__entry->new_dir,
82970ded201STrond Myklebust 			__get_str(new_name)
83070ded201STrond Myklebust 		)
83170ded201STrond Myklebust );
83270ded201STrond Myklebust #define DEFINE_NFS_RENAME_EVENT(name) \
83370ded201STrond Myklebust 	DEFINE_EVENT(nfs_rename_event, name, \
83470ded201STrond Myklebust 			TP_PROTO( \
83570ded201STrond Myklebust 				const struct inode *old_dir, \
83670ded201STrond Myklebust 				const struct dentry *old_dentry, \
83770ded201STrond Myklebust 				const struct inode *new_dir, \
83870ded201STrond Myklebust 				const struct dentry *new_dentry \
83970ded201STrond Myklebust 			), \
84070ded201STrond Myklebust 			TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
84170ded201STrond Myklebust 
84270ded201STrond Myklebust DECLARE_EVENT_CLASS(nfs_rename_event_done,
84370ded201STrond Myklebust 		TP_PROTO(
84470ded201STrond Myklebust 			const struct inode *old_dir,
84570ded201STrond Myklebust 			const struct dentry *old_dentry,
84670ded201STrond Myklebust 			const struct inode *new_dir,
84770ded201STrond Myklebust 			const struct dentry *new_dentry,
84870ded201STrond Myklebust 			int error
84970ded201STrond Myklebust 		),
85070ded201STrond Myklebust 
85170ded201STrond Myklebust 		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
85270ded201STrond Myklebust 
85370ded201STrond Myklebust 		TP_STRUCT__entry(
85470ded201STrond Myklebust 			__field(dev_t, dev)
85538a638a7SChuck Lever 			__field(unsigned long, error)
85670ded201STrond Myklebust 			__field(u64, old_dir)
85770ded201STrond Myklebust 			__string(old_name, old_dentry->d_name.name)
85870ded201STrond Myklebust 			__field(u64, new_dir)
85970ded201STrond Myklebust 			__string(new_name, new_dentry->d_name.name)
86070ded201STrond Myklebust 		),
86170ded201STrond Myklebust 
86270ded201STrond Myklebust 		TP_fast_assign(
86370ded201STrond Myklebust 			__entry->dev = old_dir->i_sb->s_dev;
86438a638a7SChuck Lever 			__entry->error = -error;
86570ded201STrond Myklebust 			__entry->old_dir = NFS_FILEID(old_dir);
86670ded201STrond Myklebust 			__entry->new_dir = NFS_FILEID(new_dir);
86770ded201STrond Myklebust 			__assign_str(old_name, old_dentry->d_name.name);
86870ded201STrond Myklebust 			__assign_str(new_name, new_dentry->d_name.name);
86970ded201STrond Myklebust 		),
87070ded201STrond Myklebust 
87170ded201STrond Myklebust 		TP_printk(
87238a638a7SChuck Lever 			"error=%ld (%s) old_name=%02x:%02x:%llu/%s "
87370ded201STrond Myklebust 			"new_name=%02x:%02x:%llu/%s",
8748791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
87570ded201STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
87670ded201STrond Myklebust 			(unsigned long long)__entry->old_dir,
87770ded201STrond Myklebust 			__get_str(old_name),
87870ded201STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
87970ded201STrond Myklebust 			(unsigned long long)__entry->new_dir,
88070ded201STrond Myklebust 			__get_str(new_name)
88170ded201STrond Myklebust 		)
88270ded201STrond Myklebust );
88370ded201STrond Myklebust #define DEFINE_NFS_RENAME_EVENT_DONE(name) \
88470ded201STrond Myklebust 	DEFINE_EVENT(nfs_rename_event_done, name, \
88570ded201STrond Myklebust 			TP_PROTO( \
88670ded201STrond Myklebust 				const struct inode *old_dir, \
88770ded201STrond Myklebust 				const struct dentry *old_dentry, \
88870ded201STrond Myklebust 				const struct inode *new_dir, \
88970ded201STrond Myklebust 				const struct dentry *new_dentry, \
89070ded201STrond Myklebust 				int error \
89170ded201STrond Myklebust 			), \
89270ded201STrond Myklebust 			TP_ARGS(old_dir, old_dentry, new_dir, \
89370ded201STrond Myklebust 				new_dentry, error))
89470ded201STrond Myklebust 
89570ded201STrond Myklebust DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
89670ded201STrond Myklebust DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
89770ded201STrond Myklebust 
89870ded201STrond Myklebust DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
89970ded201STrond Myklebust 
90070ded201STrond Myklebust TRACE_EVENT(nfs_sillyrename_unlink,
90170ded201STrond Myklebust 		TP_PROTO(
90270ded201STrond Myklebust 			const struct nfs_unlinkdata *data,
90370ded201STrond Myklebust 			int error
90470ded201STrond Myklebust 		),
90570ded201STrond Myklebust 
90670ded201STrond Myklebust 		TP_ARGS(data, error),
90770ded201STrond Myklebust 
90870ded201STrond Myklebust 		TP_STRUCT__entry(
90970ded201STrond Myklebust 			__field(dev_t, dev)
91038a638a7SChuck Lever 			__field(unsigned long, error)
91170ded201STrond Myklebust 			__field(u64, dir)
91270ded201STrond Myklebust 			__dynamic_array(char, name, data->args.name.len + 1)
91370ded201STrond Myklebust 		),
91470ded201STrond Myklebust 
91570ded201STrond Myklebust 		TP_fast_assign(
916884be175SAl Viro 			struct inode *dir = d_inode(data->dentry->d_parent);
91770ded201STrond Myklebust 			size_t len = data->args.name.len;
91870ded201STrond Myklebust 			__entry->dev = dir->i_sb->s_dev;
91970ded201STrond Myklebust 			__entry->dir = NFS_FILEID(dir);
92038a638a7SChuck Lever 			__entry->error = -error;
921752d596bSDaniel Bristot de Oliveira 			memcpy(__get_str(name),
92270ded201STrond Myklebust 				data->args.name.name, len);
923752d596bSDaniel Bristot de Oliveira 			__get_str(name)[len] = 0;
92470ded201STrond Myklebust 		),
92570ded201STrond Myklebust 
92670ded201STrond Myklebust 		TP_printk(
92738a638a7SChuck Lever 			"error=%ld (%s) name=%02x:%02x:%llu/%s",
9288791545eSChuck Lever 			-__entry->error, show_nfs_status(__entry->error),
92970ded201STrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
93070ded201STrond Myklebust 			(unsigned long long)__entry->dir,
93170ded201STrond Myklebust 			__get_str(name)
93270ded201STrond Myklebust 		)
93370ded201STrond Myklebust );
9348224b273SChuck Lever 
935d9f87743SChuck Lever TRACE_EVENT(nfs_aop_readpage,
936d9f87743SChuck Lever 		TP_PROTO(
937d9f87743SChuck Lever 			const struct inode *inode,
938d9f87743SChuck Lever 			struct page *page
939d9f87743SChuck Lever 		),
940d9f87743SChuck Lever 
941d9f87743SChuck Lever 		TP_ARGS(inode, page),
942d9f87743SChuck Lever 
943d9f87743SChuck Lever 		TP_STRUCT__entry(
944d9f87743SChuck Lever 			__field(dev_t, dev)
945d9f87743SChuck Lever 			__field(u32, fhandle)
946d9f87743SChuck Lever 			__field(u64, fileid)
947d9f87743SChuck Lever 			__field(u64, version)
948d9f87743SChuck Lever 			__field(loff_t, offset)
949d9f87743SChuck Lever 		),
950d9f87743SChuck Lever 
951d9f87743SChuck Lever 		TP_fast_assign(
952d9f87743SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
953d9f87743SChuck Lever 
954d9f87743SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
955d9f87743SChuck Lever 			__entry->fileid = nfsi->fileid;
956d9f87743SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
957d9f87743SChuck Lever 			__entry->version = inode_peek_iversion_raw(inode);
958d9f87743SChuck Lever 			__entry->offset = page_index(page) << PAGE_SHIFT;
959d9f87743SChuck Lever 		),
960d9f87743SChuck Lever 
961d9f87743SChuck Lever 		TP_printk(
962d9f87743SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld",
963d9f87743SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
964d9f87743SChuck Lever 			(unsigned long long)__entry->fileid,
965d9f87743SChuck Lever 			__entry->fhandle, __entry->version,
966d9f87743SChuck Lever 			__entry->offset
967d9f87743SChuck Lever 		)
968d9f87743SChuck Lever );
969d9f87743SChuck Lever 
970d9f87743SChuck Lever TRACE_EVENT(nfs_aop_readpage_done,
971d9f87743SChuck Lever 		TP_PROTO(
972d9f87743SChuck Lever 			const struct inode *inode,
973d9f87743SChuck Lever 			struct page *page,
974d9f87743SChuck Lever 			int ret
975d9f87743SChuck Lever 		),
976d9f87743SChuck Lever 
977d9f87743SChuck Lever 		TP_ARGS(inode, page, ret),
978d9f87743SChuck Lever 
979d9f87743SChuck Lever 		TP_STRUCT__entry(
980d9f87743SChuck Lever 			__field(dev_t, dev)
981d9f87743SChuck Lever 			__field(u32, fhandle)
982d9f87743SChuck Lever 			__field(int, ret)
983d9f87743SChuck Lever 			__field(u64, fileid)
984d9f87743SChuck Lever 			__field(u64, version)
985d9f87743SChuck Lever 			__field(loff_t, offset)
986d9f87743SChuck Lever 		),
987d9f87743SChuck Lever 
988d9f87743SChuck Lever 		TP_fast_assign(
989d9f87743SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
990d9f87743SChuck Lever 
991d9f87743SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
992d9f87743SChuck Lever 			__entry->fileid = nfsi->fileid;
993d9f87743SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
994d9f87743SChuck Lever 			__entry->version = inode_peek_iversion_raw(inode);
995d9f87743SChuck Lever 			__entry->offset = page_index(page) << PAGE_SHIFT;
996d9f87743SChuck Lever 			__entry->ret = ret;
997d9f87743SChuck Lever 		),
998d9f87743SChuck Lever 
999d9f87743SChuck Lever 		TP_printk(
1000d9f87743SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld ret=%d",
1001d9f87743SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
1002d9f87743SChuck Lever 			(unsigned long long)__entry->fileid,
1003d9f87743SChuck Lever 			__entry->fhandle, __entry->version,
1004d9f87743SChuck Lever 			__entry->offset, __entry->ret
1005d9f87743SChuck Lever 		)
1006d9f87743SChuck Lever );
1007d9f87743SChuck Lever 
1008d9f87743SChuck Lever TRACE_EVENT(nfs_aop_readahead,
1009d9f87743SChuck Lever 		TP_PROTO(
1010d9f87743SChuck Lever 			const struct inode *inode,
10118786fde8SMatthew Wilcox (Oracle) 			loff_t pos,
1012d9f87743SChuck Lever 			unsigned int nr_pages
1013d9f87743SChuck Lever 		),
1014d9f87743SChuck Lever 
10158786fde8SMatthew Wilcox (Oracle) 		TP_ARGS(inode, pos, nr_pages),
1016d9f87743SChuck Lever 
1017d9f87743SChuck Lever 		TP_STRUCT__entry(
1018d9f87743SChuck Lever 			__field(dev_t, dev)
1019d9f87743SChuck Lever 			__field(u32, fhandle)
1020d9f87743SChuck Lever 			__field(u64, fileid)
1021d9f87743SChuck Lever 			__field(u64, version)
1022edfa0b16SDave Wysochanski 			__field(loff_t, offset)
1023d9f87743SChuck Lever 			__field(unsigned int, nr_pages)
1024d9f87743SChuck Lever 		),
1025d9f87743SChuck Lever 
1026d9f87743SChuck Lever 		TP_fast_assign(
1027d9f87743SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
1028d9f87743SChuck Lever 
1029d9f87743SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
1030d9f87743SChuck Lever 			__entry->fileid = nfsi->fileid;
1031d9f87743SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1032d9f87743SChuck Lever 			__entry->version = inode_peek_iversion_raw(inode);
10338786fde8SMatthew Wilcox (Oracle) 			__entry->offset = pos;
1034d9f87743SChuck Lever 			__entry->nr_pages = nr_pages;
1035d9f87743SChuck Lever 		),
1036d9f87743SChuck Lever 
1037d9f87743SChuck Lever 		TP_printk(
1038edfa0b16SDave Wysochanski 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld nr_pages=%u",
1039d9f87743SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
1040d9f87743SChuck Lever 			(unsigned long long)__entry->fileid,
1041d9f87743SChuck Lever 			__entry->fhandle, __entry->version,
1042edfa0b16SDave Wysochanski 			__entry->offset, __entry->nr_pages
1043d9f87743SChuck Lever 		)
1044d9f87743SChuck Lever );
1045d9f87743SChuck Lever 
1046d9f87743SChuck Lever TRACE_EVENT(nfs_aop_readahead_done,
1047d9f87743SChuck Lever 		TP_PROTO(
1048d9f87743SChuck Lever 			const struct inode *inode,
1049d9f87743SChuck Lever 			unsigned int nr_pages,
1050d9f87743SChuck Lever 			int ret
1051d9f87743SChuck Lever 		),
1052d9f87743SChuck Lever 
1053d9f87743SChuck Lever 		TP_ARGS(inode, nr_pages, ret),
1054d9f87743SChuck Lever 
1055d9f87743SChuck Lever 		TP_STRUCT__entry(
1056d9f87743SChuck Lever 			__field(dev_t, dev)
1057d9f87743SChuck Lever 			__field(u32, fhandle)
1058d9f87743SChuck Lever 			__field(int, ret)
1059d9f87743SChuck Lever 			__field(u64, fileid)
1060d9f87743SChuck Lever 			__field(u64, version)
1061edfa0b16SDave Wysochanski 			__field(loff_t, offset)
1062d9f87743SChuck Lever 			__field(unsigned int, nr_pages)
1063d9f87743SChuck Lever 		),
1064d9f87743SChuck Lever 
1065d9f87743SChuck Lever 		TP_fast_assign(
1066d9f87743SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
1067d9f87743SChuck Lever 
1068d9f87743SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
1069d9f87743SChuck Lever 			__entry->fileid = nfsi->fileid;
1070d9f87743SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1071d9f87743SChuck Lever 			__entry->version = inode_peek_iversion_raw(inode);
1072d9f87743SChuck Lever 			__entry->nr_pages = nr_pages;
1073d9f87743SChuck Lever 			__entry->ret = ret;
1074d9f87743SChuck Lever 		),
1075d9f87743SChuck Lever 
1076d9f87743SChuck Lever 		TP_printk(
1077d9f87743SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu nr_pages=%u ret=%d",
1078d9f87743SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
1079d9f87743SChuck Lever 			(unsigned long long)__entry->fileid,
1080d9f87743SChuck Lever 			__entry->fhandle, __entry->version,
1081d9f87743SChuck Lever 			__entry->nr_pages, __entry->ret
1082d9f87743SChuck Lever 		)
1083d9f87743SChuck Lever );
1084d9f87743SChuck Lever 
10858224b273SChuck Lever TRACE_EVENT(nfs_initiate_read,
10868224b273SChuck Lever 		TP_PROTO(
10872343172dSTrond Myklebust 			const struct nfs_pgio_header *hdr
10888224b273SChuck Lever 		),
10898224b273SChuck Lever 
10902343172dSTrond Myklebust 		TP_ARGS(hdr),
10918224b273SChuck Lever 
10928224b273SChuck Lever 		TP_STRUCT__entry(
10938224b273SChuck Lever 			__field(dev_t, dev)
10948224b273SChuck Lever 			__field(u32, fhandle)
10958224b273SChuck Lever 			__field(u64, fileid)
10962343172dSTrond Myklebust 			__field(loff_t, offset)
10972343172dSTrond Myklebust 			__field(u32, count)
10988224b273SChuck Lever 		),
10998224b273SChuck Lever 
11008224b273SChuck Lever 		TP_fast_assign(
11012343172dSTrond Myklebust 			const struct inode *inode = hdr->inode;
11028224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
11032343172dSTrond Myklebust 			const struct nfs_fh *fh = hdr->args.fh ?
11042343172dSTrond Myklebust 						  hdr->args.fh : &nfsi->fh;
11058224b273SChuck Lever 
11062343172dSTrond Myklebust 			__entry->offset = hdr->args.offset;
11072343172dSTrond Myklebust 			__entry->count = hdr->args.count;
11088224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
11098224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
11102343172dSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
11118224b273SChuck Lever 		),
11128224b273SChuck Lever 
11138224b273SChuck Lever 		TP_printk(
11148224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
11152343172dSTrond Myklebust 			"offset=%lld count=%u",
11168224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
11178224b273SChuck Lever 			(unsigned long long)__entry->fileid,
11188224b273SChuck Lever 			__entry->fhandle,
11192343172dSTrond Myklebust 			(long long)__entry->offset, __entry->count
11208224b273SChuck Lever 		)
11218224b273SChuck Lever );
11228224b273SChuck Lever 
11238224b273SChuck Lever TRACE_EVENT(nfs_readpage_done,
11248224b273SChuck Lever 		TP_PROTO(
11252343172dSTrond Myklebust 			const struct rpc_task *task,
11262343172dSTrond Myklebust 			const struct nfs_pgio_header *hdr
11278224b273SChuck Lever 		),
11288224b273SChuck Lever 
11292343172dSTrond Myklebust 		TP_ARGS(task, hdr),
11308224b273SChuck Lever 
11318224b273SChuck Lever 		TP_STRUCT__entry(
11328224b273SChuck Lever 			__field(dev_t, dev)
11338224b273SChuck Lever 			__field(u32, fhandle)
11348224b273SChuck Lever 			__field(u64, fileid)
11352343172dSTrond Myklebust 			__field(loff_t, offset)
11362343172dSTrond Myklebust 			__field(u32, arg_count)
11372343172dSTrond Myklebust 			__field(u32, res_count)
11382343172dSTrond Myklebust 			__field(bool, eof)
11392343172dSTrond Myklebust 			__field(int, status)
11408224b273SChuck Lever 		),
11418224b273SChuck Lever 
11428224b273SChuck Lever 		TP_fast_assign(
11432343172dSTrond Myklebust 			const struct inode *inode = hdr->inode;
11448224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
11452343172dSTrond Myklebust 			const struct nfs_fh *fh = hdr->args.fh ?
11462343172dSTrond Myklebust 						  hdr->args.fh : &nfsi->fh;
11478224b273SChuck Lever 
11482343172dSTrond Myklebust 			__entry->status = task->tk_status;
11492343172dSTrond Myklebust 			__entry->offset = hdr->args.offset;
11502343172dSTrond Myklebust 			__entry->arg_count = hdr->args.count;
11512343172dSTrond Myklebust 			__entry->res_count = hdr->res.count;
11522343172dSTrond Myklebust 			__entry->eof = hdr->res.eof;
11538224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
11548224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
11552343172dSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
11568224b273SChuck Lever 		),
11578224b273SChuck Lever 
11588224b273SChuck Lever 		TP_printk(
11598224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
11602343172dSTrond Myklebust 			"offset=%lld count=%u res=%u status=%d%s",
11618224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
11628224b273SChuck Lever 			(unsigned long long)__entry->fileid,
11638224b273SChuck Lever 			__entry->fhandle,
11642343172dSTrond Myklebust 			(long long)__entry->offset, __entry->arg_count,
11652343172dSTrond Myklebust 			__entry->res_count, __entry->status,
11668224b273SChuck Lever 			__entry->eof ? " eof" : ""
11678224b273SChuck Lever 		)
11688224b273SChuck Lever );
11698224b273SChuck Lever 
1170fd2b6121SChuck Lever TRACE_EVENT(nfs_readpage_short,
1171fd2b6121SChuck Lever 		TP_PROTO(
1172fd2b6121SChuck Lever 			const struct rpc_task *task,
1173fd2b6121SChuck Lever 			const struct nfs_pgio_header *hdr
1174fd2b6121SChuck Lever 		),
1175fd2b6121SChuck Lever 
1176fd2b6121SChuck Lever 		TP_ARGS(task, hdr),
1177fd2b6121SChuck Lever 
1178fd2b6121SChuck Lever 		TP_STRUCT__entry(
1179fd2b6121SChuck Lever 			__field(dev_t, dev)
1180fd2b6121SChuck Lever 			__field(u32, fhandle)
1181fd2b6121SChuck Lever 			__field(u64, fileid)
1182fd2b6121SChuck Lever 			__field(loff_t, offset)
1183fd2b6121SChuck Lever 			__field(u32, arg_count)
1184fd2b6121SChuck Lever 			__field(u32, res_count)
1185fd2b6121SChuck Lever 			__field(bool, eof)
1186fd2b6121SChuck Lever 			__field(int, status)
1187fd2b6121SChuck Lever 		),
1188fd2b6121SChuck Lever 
1189fd2b6121SChuck Lever 		TP_fast_assign(
1190fd2b6121SChuck Lever 			const struct inode *inode = hdr->inode;
1191fd2b6121SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
1192fd2b6121SChuck Lever 			const struct nfs_fh *fh = hdr->args.fh ?
1193fd2b6121SChuck Lever 						  hdr->args.fh : &nfsi->fh;
1194fd2b6121SChuck Lever 
1195fd2b6121SChuck Lever 			__entry->status = task->tk_status;
1196fd2b6121SChuck Lever 			__entry->offset = hdr->args.offset;
1197fd2b6121SChuck Lever 			__entry->arg_count = hdr->args.count;
1198fd2b6121SChuck Lever 			__entry->res_count = hdr->res.count;
1199fd2b6121SChuck Lever 			__entry->eof = hdr->res.eof;
1200fd2b6121SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
1201fd2b6121SChuck Lever 			__entry->fileid = nfsi->fileid;
1202fd2b6121SChuck Lever 			__entry->fhandle = nfs_fhandle_hash(fh);
1203fd2b6121SChuck Lever 		),
1204fd2b6121SChuck Lever 
1205fd2b6121SChuck Lever 		TP_printk(
1206fd2b6121SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
1207fd2b6121SChuck Lever 			"offset=%lld count=%u res=%u status=%d%s",
1208fd2b6121SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
1209fd2b6121SChuck Lever 			(unsigned long long)__entry->fileid,
1210fd2b6121SChuck Lever 			__entry->fhandle,
1211fd2b6121SChuck Lever 			(long long)__entry->offset, __entry->arg_count,
1212fd2b6121SChuck Lever 			__entry->res_count, __entry->status,
1213fd2b6121SChuck Lever 			__entry->eof ? " eof" : ""
1214fd2b6121SChuck Lever 		)
1215fd2b6121SChuck Lever );
1216fd2b6121SChuck Lever 
1217cd2ed9bdSChuck Lever TRACE_EVENT(nfs_pgio_error,
1218cd2ed9bdSChuck Lever 	TP_PROTO(
1219cd2ed9bdSChuck Lever 		const struct nfs_pgio_header *hdr,
1220cd2ed9bdSChuck Lever 		int error,
1221cd2ed9bdSChuck Lever 		loff_t pos
1222cd2ed9bdSChuck Lever 	),
1223cd2ed9bdSChuck Lever 
1224cd2ed9bdSChuck Lever 	TP_ARGS(hdr, error, pos),
1225cd2ed9bdSChuck Lever 
1226cd2ed9bdSChuck Lever 	TP_STRUCT__entry(
1227cd2ed9bdSChuck Lever 		__field(dev_t, dev)
1228cd2ed9bdSChuck Lever 		__field(u32, fhandle)
1229cd2ed9bdSChuck Lever 		__field(u64, fileid)
1230cd2ed9bdSChuck Lever 		__field(loff_t, offset)
1231cd2ed9bdSChuck Lever 		__field(u32, arg_count)
1232cd2ed9bdSChuck Lever 		__field(u32, res_count)
1233cd2ed9bdSChuck Lever 		__field(loff_t, pos)
1234cd2ed9bdSChuck Lever 		__field(int, status)
1235cd2ed9bdSChuck Lever 	),
1236cd2ed9bdSChuck Lever 
1237cd2ed9bdSChuck Lever 	TP_fast_assign(
1238cd2ed9bdSChuck Lever 		const struct inode *inode = hdr->inode;
1239cd2ed9bdSChuck Lever 		const struct nfs_inode *nfsi = NFS_I(inode);
1240cd2ed9bdSChuck Lever 		const struct nfs_fh *fh = hdr->args.fh ?
1241cd2ed9bdSChuck Lever 					  hdr->args.fh : &nfsi->fh;
1242cd2ed9bdSChuck Lever 
1243cd2ed9bdSChuck Lever 		__entry->status = error;
1244cd2ed9bdSChuck Lever 		__entry->offset = hdr->args.offset;
1245cd2ed9bdSChuck Lever 		__entry->arg_count = hdr->args.count;
1246cd2ed9bdSChuck Lever 		__entry->res_count = hdr->res.count;
1247cd2ed9bdSChuck Lever 		__entry->dev = inode->i_sb->s_dev;
1248cd2ed9bdSChuck Lever 		__entry->fileid = nfsi->fileid;
1249cd2ed9bdSChuck Lever 		__entry->fhandle = nfs_fhandle_hash(fh);
1250cd2ed9bdSChuck Lever 	),
1251cd2ed9bdSChuck Lever 
1252cd2ed9bdSChuck Lever 	TP_printk("fileid=%02x:%02x:%llu fhandle=0x%08x "
1253cd2ed9bdSChuck Lever 		  "offset=%lld count=%u res=%u pos=%llu status=%d",
1254cd2ed9bdSChuck Lever 		MAJOR(__entry->dev), MINOR(__entry->dev),
1255cd2ed9bdSChuck Lever 		(unsigned long long)__entry->fileid, __entry->fhandle,
1256cd2ed9bdSChuck Lever 		(long long)__entry->offset, __entry->arg_count, __entry->res_count,
1257cd2ed9bdSChuck Lever 		__entry->pos, __entry->status
1258cd2ed9bdSChuck Lever 	)
1259cd2ed9bdSChuck Lever );
1260cd2ed9bdSChuck Lever 
12618224b273SChuck Lever TRACE_EVENT(nfs_initiate_write,
12628224b273SChuck Lever 		TP_PROTO(
12635bb2a7cbSTrond Myklebust 			const struct nfs_pgio_header *hdr
12648224b273SChuck Lever 		),
12658224b273SChuck Lever 
12665bb2a7cbSTrond Myklebust 		TP_ARGS(hdr),
12678224b273SChuck Lever 
12688224b273SChuck Lever 		TP_STRUCT__entry(
12698224b273SChuck Lever 			__field(dev_t, dev)
12708224b273SChuck Lever 			__field(u32, fhandle)
12718224b273SChuck Lever 			__field(u64, fileid)
12725bb2a7cbSTrond Myklebust 			__field(loff_t, offset)
12735bb2a7cbSTrond Myklebust 			__field(u32, count)
12748791545eSChuck Lever 			__field(unsigned long, stable)
12758224b273SChuck Lever 		),
12768224b273SChuck Lever 
12778224b273SChuck Lever 		TP_fast_assign(
12785bb2a7cbSTrond Myklebust 			const struct inode *inode = hdr->inode;
12798224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
12805bb2a7cbSTrond Myklebust 			const struct nfs_fh *fh = hdr->args.fh ?
12815bb2a7cbSTrond Myklebust 						  hdr->args.fh : &nfsi->fh;
12828224b273SChuck Lever 
12835bb2a7cbSTrond Myklebust 			__entry->offset = hdr->args.offset;
12845bb2a7cbSTrond Myklebust 			__entry->count = hdr->args.count;
12855bb2a7cbSTrond Myklebust 			__entry->stable = hdr->args.stable;
12868224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
12878224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
12885bb2a7cbSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
12898224b273SChuck Lever 		),
12908224b273SChuck Lever 
12918224b273SChuck Lever 		TP_printk(
12928224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
12935bb2a7cbSTrond Myklebust 			"offset=%lld count=%u stable=%s",
12948224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
12958224b273SChuck Lever 			(unsigned long long)__entry->fileid,
12968224b273SChuck Lever 			__entry->fhandle,
12975bb2a7cbSTrond Myklebust 			(long long)__entry->offset, __entry->count,
12988791545eSChuck Lever 			show_nfs_stable_how(__entry->stable)
12998224b273SChuck Lever 		)
13008224b273SChuck Lever );
13018224b273SChuck Lever 
13028224b273SChuck Lever TRACE_EVENT(nfs_writeback_done,
13038224b273SChuck Lever 		TP_PROTO(
13045bb2a7cbSTrond Myklebust 			const struct rpc_task *task,
13055bb2a7cbSTrond Myklebust 			const struct nfs_pgio_header *hdr
13068224b273SChuck Lever 		),
13078224b273SChuck Lever 
13085bb2a7cbSTrond Myklebust 		TP_ARGS(task, hdr),
13098224b273SChuck Lever 
13108224b273SChuck Lever 		TP_STRUCT__entry(
13118224b273SChuck Lever 			__field(dev_t, dev)
13128224b273SChuck Lever 			__field(u32, fhandle)
13138224b273SChuck Lever 			__field(u64, fileid)
13145bb2a7cbSTrond Myklebust 			__field(loff_t, offset)
13155bb2a7cbSTrond Myklebust 			__field(u32, arg_count)
13165bb2a7cbSTrond Myklebust 			__field(u32, res_count)
13175bb2a7cbSTrond Myklebust 			__field(int, status)
13188791545eSChuck Lever 			__field(unsigned long, stable)
13195bb2a7cbSTrond Myklebust 			__array(char, verifier, NFS4_VERIFIER_SIZE)
13208224b273SChuck Lever 		),
13218224b273SChuck Lever 
13228224b273SChuck Lever 		TP_fast_assign(
13235bb2a7cbSTrond Myklebust 			const struct inode *inode = hdr->inode;
13248224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
13255bb2a7cbSTrond Myklebust 			const struct nfs_fh *fh = hdr->args.fh ?
13265bb2a7cbSTrond Myklebust 						  hdr->args.fh : &nfsi->fh;
13275bb2a7cbSTrond Myklebust 			const struct nfs_writeverf *verf = hdr->res.verf;
13288224b273SChuck Lever 
13295bb2a7cbSTrond Myklebust 			__entry->status = task->tk_status;
13305bb2a7cbSTrond Myklebust 			__entry->offset = hdr->args.offset;
13315bb2a7cbSTrond Myklebust 			__entry->arg_count = hdr->args.count;
13325bb2a7cbSTrond Myklebust 			__entry->res_count = hdr->res.count;
13335bb2a7cbSTrond Myklebust 			__entry->stable = verf->committed;
13345bb2a7cbSTrond Myklebust 			memcpy(__entry->verifier,
13355bb2a7cbSTrond Myklebust 				&verf->verifier,
13365bb2a7cbSTrond Myklebust 				NFS4_VERIFIER_SIZE);
13378224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
13388224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
13395bb2a7cbSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
13408224b273SChuck Lever 		),
13418224b273SChuck Lever 
13428224b273SChuck Lever 		TP_printk(
13438224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
13445bb2a7cbSTrond Myklebust 			"offset=%lld count=%u res=%u status=%d stable=%s "
13455bb2a7cbSTrond Myklebust 			"verifier=%s",
13468224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
13478224b273SChuck Lever 			(unsigned long long)__entry->fileid,
13488224b273SChuck Lever 			__entry->fhandle,
13495bb2a7cbSTrond Myklebust 			(long long)__entry->offset, __entry->arg_count,
13505bb2a7cbSTrond Myklebust 			__entry->res_count, __entry->status,
13518791545eSChuck Lever 			show_nfs_stable_how(__entry->stable),
13528791545eSChuck Lever 			show_nfs4_verifier(__entry->verifier)
13538224b273SChuck Lever 		)
13548224b273SChuck Lever );
13558224b273SChuck Lever 
1356861e1671SChuck Lever DECLARE_EVENT_CLASS(nfs_page_error_class,
1357861e1671SChuck Lever 		TP_PROTO(
1358861e1671SChuck Lever 			const struct nfs_page *req,
1359861e1671SChuck Lever 			int error
1360861e1671SChuck Lever 		),
1361861e1671SChuck Lever 
1362861e1671SChuck Lever 		TP_ARGS(req, error),
1363861e1671SChuck Lever 
1364861e1671SChuck Lever 		TP_STRUCT__entry(
1365861e1671SChuck Lever 			__field(const void *, req)
1366861e1671SChuck Lever 			__field(pgoff_t, index)
1367861e1671SChuck Lever 			__field(unsigned int, offset)
1368861e1671SChuck Lever 			__field(unsigned int, pgbase)
1369861e1671SChuck Lever 			__field(unsigned int, bytes)
1370861e1671SChuck Lever 			__field(int, error)
1371861e1671SChuck Lever 		),
1372861e1671SChuck Lever 
1373861e1671SChuck Lever 		TP_fast_assign(
1374861e1671SChuck Lever 			__entry->req = req;
1375861e1671SChuck Lever 			__entry->index = req->wb_index;
1376861e1671SChuck Lever 			__entry->offset = req->wb_offset;
1377861e1671SChuck Lever 			__entry->pgbase = req->wb_pgbase;
1378861e1671SChuck Lever 			__entry->bytes = req->wb_bytes;
1379861e1671SChuck Lever 			__entry->error = error;
1380861e1671SChuck Lever 		),
1381861e1671SChuck Lever 
1382861e1671SChuck Lever 		TP_printk(
1383861e1671SChuck Lever 			"req=%p index=%lu offset=%u pgbase=%u bytes=%u error=%d",
1384861e1671SChuck Lever 			__entry->req, __entry->index, __entry->offset,
1385861e1671SChuck Lever 			__entry->pgbase, __entry->bytes, __entry->error
1386861e1671SChuck Lever 		)
1387861e1671SChuck Lever );
1388861e1671SChuck Lever 
1389861e1671SChuck Lever #define DEFINE_NFS_PAGEERR_EVENT(name) \
1390861e1671SChuck Lever 	DEFINE_EVENT(nfs_page_error_class, name, \
1391861e1671SChuck Lever 			TP_PROTO( \
1392861e1671SChuck Lever 				const struct nfs_page *req, \
1393861e1671SChuck Lever 				int error \
1394861e1671SChuck Lever 			), \
1395861e1671SChuck Lever 			TP_ARGS(req, error))
1396861e1671SChuck Lever 
1397861e1671SChuck Lever DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
1398861e1671SChuck Lever DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
1399861e1671SChuck Lever DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
1400861e1671SChuck Lever 
14018224b273SChuck Lever TRACE_EVENT(nfs_initiate_commit,
14028224b273SChuck Lever 		TP_PROTO(
14038224b273SChuck Lever 			const struct nfs_commit_data *data
14048224b273SChuck Lever 		),
14058224b273SChuck Lever 
14068224b273SChuck Lever 		TP_ARGS(data),
14078224b273SChuck Lever 
14088224b273SChuck Lever 		TP_STRUCT__entry(
14098224b273SChuck Lever 			__field(dev_t, dev)
14108224b273SChuck Lever 			__field(u32, fhandle)
14118224b273SChuck Lever 			__field(u64, fileid)
14127bdd297eSTrond Myklebust 			__field(loff_t, offset)
14137bdd297eSTrond Myklebust 			__field(u32, count)
14148224b273SChuck Lever 		),
14158224b273SChuck Lever 
14168224b273SChuck Lever 		TP_fast_assign(
14178224b273SChuck Lever 			const struct inode *inode = data->inode;
14188224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
14197bdd297eSTrond Myklebust 			const struct nfs_fh *fh = data->args.fh ?
14207bdd297eSTrond Myklebust 						  data->args.fh : &nfsi->fh;
14218224b273SChuck Lever 
14228224b273SChuck Lever 			__entry->offset = data->args.offset;
14238224b273SChuck Lever 			__entry->count = data->args.count;
14248224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
14258224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
14267bdd297eSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
14278224b273SChuck Lever 		),
14288224b273SChuck Lever 
14298224b273SChuck Lever 		TP_printk(
14308224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
14317bdd297eSTrond Myklebust 			"offset=%lld count=%u",
14328224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
14338224b273SChuck Lever 			(unsigned long long)__entry->fileid,
14348224b273SChuck Lever 			__entry->fhandle,
14357bdd297eSTrond Myklebust 			(long long)__entry->offset, __entry->count
14368224b273SChuck Lever 		)
14378224b273SChuck Lever );
14388224b273SChuck Lever 
14398224b273SChuck Lever TRACE_EVENT(nfs_commit_done,
14408224b273SChuck Lever 		TP_PROTO(
14417bdd297eSTrond Myklebust 			const struct rpc_task *task,
14428224b273SChuck Lever 			const struct nfs_commit_data *data
14438224b273SChuck Lever 		),
14448224b273SChuck Lever 
14457bdd297eSTrond Myklebust 		TP_ARGS(task, data),
14468224b273SChuck Lever 
14478224b273SChuck Lever 		TP_STRUCT__entry(
14488224b273SChuck Lever 			__field(dev_t, dev)
14498224b273SChuck Lever 			__field(u32, fhandle)
14508224b273SChuck Lever 			__field(u64, fileid)
14517bdd297eSTrond Myklebust 			__field(loff_t, offset)
14527bdd297eSTrond Myklebust 			__field(int, status)
14538791545eSChuck Lever 			__field(unsigned long, stable)
14547bdd297eSTrond Myklebust 			__array(char, verifier, NFS4_VERIFIER_SIZE)
14558224b273SChuck Lever 		),
14568224b273SChuck Lever 
14578224b273SChuck Lever 		TP_fast_assign(
14588224b273SChuck Lever 			const struct inode *inode = data->inode;
14598224b273SChuck Lever 			const struct nfs_inode *nfsi = NFS_I(inode);
14607bdd297eSTrond Myklebust 			const struct nfs_fh *fh = data->args.fh ?
14617bdd297eSTrond Myklebust 						  data->args.fh : &nfsi->fh;
14627bdd297eSTrond Myklebust 			const struct nfs_writeverf *verf = data->res.verf;
14638224b273SChuck Lever 
14647bdd297eSTrond Myklebust 			__entry->status = task->tk_status;
14658224b273SChuck Lever 			__entry->offset = data->args.offset;
14667bdd297eSTrond Myklebust 			__entry->stable = verf->committed;
14677bdd297eSTrond Myklebust 			memcpy(__entry->verifier,
14687bdd297eSTrond Myklebust 				&verf->verifier,
14697bdd297eSTrond Myklebust 				NFS4_VERIFIER_SIZE);
14708224b273SChuck Lever 			__entry->dev = inode->i_sb->s_dev;
14718224b273SChuck Lever 			__entry->fileid = nfsi->fileid;
14727bdd297eSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
14738224b273SChuck Lever 		),
14748224b273SChuck Lever 
14758224b273SChuck Lever 		TP_printk(
14768224b273SChuck Lever 			"fileid=%02x:%02x:%llu fhandle=0x%08x "
14777bdd297eSTrond Myklebust 			"offset=%lld status=%d stable=%s verifier=%s",
14788224b273SChuck Lever 			MAJOR(__entry->dev), MINOR(__entry->dev),
14798224b273SChuck Lever 			(unsigned long long)__entry->fileid,
14808224b273SChuck Lever 			__entry->fhandle,
14817bdd297eSTrond Myklebust 			(long long)__entry->offset, __entry->status,
14828791545eSChuck Lever 			show_nfs_stable_how(__entry->stable),
14838791545eSChuck Lever 			show_nfs4_verifier(__entry->verifier)
14848224b273SChuck Lever 		)
14858224b273SChuck Lever );
14868224b273SChuck Lever 
148743622eabSTrond Myklebust TRACE_EVENT(nfs_fh_to_dentry,
148843622eabSTrond Myklebust 		TP_PROTO(
148943622eabSTrond Myklebust 			const struct super_block *sb,
149043622eabSTrond Myklebust 			const struct nfs_fh *fh,
149143622eabSTrond Myklebust 			u64 fileid,
149243622eabSTrond Myklebust 			int error
149343622eabSTrond Myklebust 		),
149443622eabSTrond Myklebust 
149543622eabSTrond Myklebust 		TP_ARGS(sb, fh, fileid, error),
149643622eabSTrond Myklebust 
149743622eabSTrond Myklebust 		TP_STRUCT__entry(
149843622eabSTrond Myklebust 			__field(int, error)
149943622eabSTrond Myklebust 			__field(dev_t, dev)
150043622eabSTrond Myklebust 			__field(u32, fhandle)
150143622eabSTrond Myklebust 			__field(u64, fileid)
150243622eabSTrond Myklebust 		),
150343622eabSTrond Myklebust 
150443622eabSTrond Myklebust 		TP_fast_assign(
150543622eabSTrond Myklebust 			__entry->error = error;
150643622eabSTrond Myklebust 			__entry->dev = sb->s_dev;
150743622eabSTrond Myklebust 			__entry->fileid = fileid;
150843622eabSTrond Myklebust 			__entry->fhandle = nfs_fhandle_hash(fh);
150943622eabSTrond Myklebust 		),
151043622eabSTrond Myklebust 
151143622eabSTrond Myklebust 		TP_printk(
151243622eabSTrond Myklebust 			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
151343622eabSTrond Myklebust 			__entry->error,
151443622eabSTrond Myklebust 			MAJOR(__entry->dev), MINOR(__entry->dev),
151543622eabSTrond Myklebust 			(unsigned long long)__entry->fileid,
151643622eabSTrond Myklebust 			__entry->fhandle
151743622eabSTrond Myklebust 		)
151843622eabSTrond Myklebust );
151943622eabSTrond Myklebust 
15203d66bae1STrond Myklebust DECLARE_EVENT_CLASS(nfs_xdr_event,
1521f23f6584SChuck Lever 		TP_PROTO(
152262a92ba9SChuck Lever 			const struct xdr_stream *xdr,
1523f23f6584SChuck Lever 			int error
1524f23f6584SChuck Lever 		),
1525f23f6584SChuck Lever 
152662a92ba9SChuck Lever 		TP_ARGS(xdr, error),
1527f23f6584SChuck Lever 
1528f23f6584SChuck Lever 		TP_STRUCT__entry(
152962a92ba9SChuck Lever 			__field(unsigned int, task_id)
153062a92ba9SChuck Lever 			__field(unsigned int, client_id)
153162a92ba9SChuck Lever 			__field(u32, xid)
15325be59458SChuck Lever 			__field(int, version)
153338a638a7SChuck Lever 			__field(unsigned long, error)
15345be59458SChuck Lever 			__string(program,
15355be59458SChuck Lever 				 xdr->rqst->rq_task->tk_client->cl_program->name)
15365be59458SChuck Lever 			__string(procedure,
15375be59458SChuck Lever 				 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
1538f23f6584SChuck Lever 		),
1539f23f6584SChuck Lever 
1540f23f6584SChuck Lever 		TP_fast_assign(
154162a92ba9SChuck Lever 			const struct rpc_rqst *rqstp = xdr->rqst;
154262a92ba9SChuck Lever 			const struct rpc_task *task = rqstp->rq_task;
154362a92ba9SChuck Lever 
154462a92ba9SChuck Lever 			__entry->task_id = task->tk_pid;
154562a92ba9SChuck Lever 			__entry->client_id = task->tk_client->cl_clid;
154662a92ba9SChuck Lever 			__entry->xid = be32_to_cpu(rqstp->rq_xid);
15475be59458SChuck Lever 			__entry->version = task->tk_client->cl_vers;
1548f23f6584SChuck Lever 			__entry->error = error;
15495be59458SChuck Lever 			__assign_str(program,
155078c14b38SJoe Perches 				     task->tk_client->cl_program->name);
155178c14b38SJoe Perches 			__assign_str(procedure, task->tk_msg.rpc_proc->p_name);
1552f23f6584SChuck Lever 		),
1553f23f6584SChuck Lever 
1554b4776a34SChuck Lever 		TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
1555b4776a34SChuck Lever 			  " xid=0x%08x %sv%d %s error=%ld (%s)",
155662a92ba9SChuck Lever 			__entry->task_id, __entry->client_id, __entry->xid,
15575be59458SChuck Lever 			__get_str(program), __entry->version,
15585be59458SChuck Lever 			__get_str(procedure), -__entry->error,
15598791545eSChuck Lever 			show_nfs_status(__entry->error)
1560f23f6584SChuck Lever 		)
1561f23f6584SChuck Lever );
15623d66bae1STrond Myklebust #define DEFINE_NFS_XDR_EVENT(name) \
15633d66bae1STrond Myklebust 	DEFINE_EVENT(nfs_xdr_event, name, \
15643d66bae1STrond Myklebust 			TP_PROTO( \
15653d66bae1STrond Myklebust 				const struct xdr_stream *xdr, \
15663d66bae1STrond Myklebust 				int error \
15673d66bae1STrond Myklebust 			), \
15683d66bae1STrond Myklebust 			TP_ARGS(xdr, error))
15693d66bae1STrond Myklebust DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
1570eb3d58c6STrond Myklebust DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
1571f23f6584SChuck Lever 
1572f4ce1299STrond Myklebust #endif /* _TRACE_NFS_H */
1573f4ce1299STrond Myklebust 
1574f4ce1299STrond Myklebust #undef TRACE_INCLUDE_PATH
1575f4ce1299STrond Myklebust #define TRACE_INCLUDE_PATH .
1576f4ce1299STrond Myklebust #define TRACE_INCLUDE_FILE nfstrace
1577f4ce1299STrond Myklebust /* This part must be outside protection */
1578f4ce1299STrond Myklebust #include <trace/define_trace.h>
1579