Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com>
  3 */
  4#undef TRACE_SYSTEM
  5#define TRACE_SYSTEM nfs
  6
  7#if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ)
  8#define _TRACE_NFS_H
  9
 10#include <linux/tracepoint.h>
 
 11
 12#define nfs_show_file_type(ftype) \
 13	__print_symbolic(ftype, \
 14			{ DT_UNKNOWN, "UNKNOWN" }, \
 15			{ DT_FIFO, "FIFO" }, \
 16			{ DT_CHR, "CHR" }, \
 17			{ DT_DIR, "DIR" }, \
 18			{ DT_BLK, "BLK" }, \
 19			{ DT_REG, "REG" }, \
 20			{ DT_LNK, "LNK" }, \
 21			{ DT_SOCK, "SOCK" }, \
 22			{ DT_WHT, "WHT" })
 23
 24#define nfs_show_cache_validity(v) \
 25	__print_flags(v, "|", \
 26			{ NFS_INO_INVALID_ATTR, "INVALID_ATTR" }, \
 27			{ NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
 28			{ NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
 29			{ NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
 30			{ NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
 31			{ NFS_INO_REVAL_PAGECACHE, "REVAL_PAGECACHE" }, \
 32			{ NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
 33			{ NFS_INO_INVALID_LABEL, "INVALID_LABEL" })
 
 
 
 
 
 
 
 
 
 
 34
 35#define nfs_show_nfsi_flags(v) \
 36	__print_flags(v, "|", \
 37			{ 1 << NFS_INO_ADVISE_RDPLUS, "ADVISE_RDPLUS" }, \
 38			{ 1 << NFS_INO_STALE, "STALE" }, \
 39			{ 1 << NFS_INO_INVALIDATING, "INVALIDATING" }, \
 40			{ 1 << NFS_INO_FLUSHING, "FLUSHING" }, \
 41			{ 1 << NFS_INO_FSCACHE, "FSCACHE" }, \
 42			{ 1 << NFS_INO_LAYOUTCOMMIT, "NEED_LAYOUTCOMMIT" }, \
 43			{ 1 << NFS_INO_LAYOUTCOMMITTING, "LAYOUTCOMMIT" })
 
 44
 45DECLARE_EVENT_CLASS(nfs_inode_event,
 46		TP_PROTO(
 47			const struct inode *inode
 48		),
 49
 50		TP_ARGS(inode),
 51
 52		TP_STRUCT__entry(
 53			__field(dev_t, dev)
 54			__field(u32, fhandle)
 55			__field(u64, fileid)
 56			__field(u64, version)
 57		),
 58
 59		TP_fast_assign(
 60			const struct nfs_inode *nfsi = NFS_I(inode);
 61			__entry->dev = inode->i_sb->s_dev;
 62			__entry->fileid = nfsi->fileid;
 63			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
 64			__entry->version = inode->i_version;
 65		),
 66
 67		TP_printk(
 68			"fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
 69			MAJOR(__entry->dev), MINOR(__entry->dev),
 70			(unsigned long long)__entry->fileid,
 71			__entry->fhandle,
 72			(unsigned long long)__entry->version
 73		)
 74);
 75
 76DECLARE_EVENT_CLASS(nfs_inode_event_done,
 77		TP_PROTO(
 78			const struct inode *inode,
 79			int error
 80		),
 81
 82		TP_ARGS(inode, error),
 83
 84		TP_STRUCT__entry(
 85			__field(int, error)
 86			__field(dev_t, dev)
 87			__field(u32, fhandle)
 88			__field(unsigned char, type)
 89			__field(u64, fileid)
 90			__field(u64, version)
 91			__field(loff_t, size)
 92			__field(unsigned long, nfsi_flags)
 93			__field(unsigned long, cache_validity)
 94		),
 95
 96		TP_fast_assign(
 97			const struct nfs_inode *nfsi = NFS_I(inode);
 98			__entry->error = error;
 99			__entry->dev = inode->i_sb->s_dev;
100			__entry->fileid = nfsi->fileid;
101			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
102			__entry->type = nfs_umode_to_dtype(inode->i_mode);
103			__entry->version = inode->i_version;
104			__entry->size = i_size_read(inode);
105			__entry->nfsi_flags = nfsi->flags;
106			__entry->cache_validity = nfsi->cache_validity;
107		),
108
109		TP_printk(
110			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
111			"type=%u (%s) version=%llu size=%lld "
112			"cache_validity=%lu (%s) nfs_flags=%ld (%s)",
113			__entry->error,
114			MAJOR(__entry->dev), MINOR(__entry->dev),
115			(unsigned long long)__entry->fileid,
116			__entry->fhandle,
117			__entry->type,
118			nfs_show_file_type(__entry->type),
119			(unsigned long long)__entry->version,
120			(long long)__entry->size,
121			__entry->cache_validity,
122			nfs_show_cache_validity(__entry->cache_validity),
123			__entry->nfsi_flags,
124			nfs_show_nfsi_flags(__entry->nfsi_flags)
125		)
126);
127
128#define DEFINE_NFS_INODE_EVENT(name) \
129	DEFINE_EVENT(nfs_inode_event, name, \
130			TP_PROTO( \
131				const struct inode *inode \
132			), \
133			TP_ARGS(inode))
134#define DEFINE_NFS_INODE_EVENT_DONE(name) \
135	DEFINE_EVENT(nfs_inode_event_done, name, \
136			TP_PROTO( \
137				const struct inode *inode, \
138				int error \
139			), \
140			TP_ARGS(inode, error))
 
141DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
142DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
143DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
144DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
145DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
146DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
147DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
148DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
149DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
150DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
151DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
152DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
153DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
154DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
155DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
156DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
157DEFINE_NFS_INODE_EVENT(nfs_access_enter);
158DEFINE_NFS_INODE_EVENT_DONE(nfs_access_exit);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
160#define show_lookup_flags(flags) \
161	__print_flags((unsigned long)flags, "|", \
162			{ LOOKUP_AUTOMOUNT, "AUTOMOUNT" }, \
163			{ LOOKUP_DIRECTORY, "DIRECTORY" }, \
164			{ LOOKUP_OPEN, "OPEN" }, \
165			{ LOOKUP_CREATE, "CREATE" }, \
166			{ LOOKUP_EXCL, "EXCL" })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
168DECLARE_EVENT_CLASS(nfs_lookup_event,
169		TP_PROTO(
170			const struct inode *dir,
171			const struct dentry *dentry,
172			unsigned int flags
173		),
174
175		TP_ARGS(dir, dentry, flags),
176
177		TP_STRUCT__entry(
178			__field(unsigned int, flags)
179			__field(dev_t, dev)
180			__field(u64, dir)
181			__string(name, dentry->d_name.name)
182		),
183
184		TP_fast_assign(
185			__entry->dev = dir->i_sb->s_dev;
186			__entry->dir = NFS_FILEID(dir);
187			__entry->flags = flags;
188			__assign_str(name, dentry->d_name.name);
189		),
190
191		TP_printk(
192			"flags=%u (%s) name=%02x:%02x:%llu/%s",
193			__entry->flags,
194			show_lookup_flags(__entry->flags),
195			MAJOR(__entry->dev), MINOR(__entry->dev),
196			(unsigned long long)__entry->dir,
197			__get_str(name)
198		)
199);
200
201#define DEFINE_NFS_LOOKUP_EVENT(name) \
202	DEFINE_EVENT(nfs_lookup_event, name, \
203			TP_PROTO( \
204				const struct inode *dir, \
205				const struct dentry *dentry, \
206				unsigned int flags \
207			), \
208			TP_ARGS(dir, dentry, flags))
209
210DECLARE_EVENT_CLASS(nfs_lookup_event_done,
211		TP_PROTO(
212			const struct inode *dir,
213			const struct dentry *dentry,
214			unsigned int flags,
215			int error
216		),
217
218		TP_ARGS(dir, dentry, flags, error),
219
220		TP_STRUCT__entry(
221			__field(int, error)
222			__field(unsigned int, flags)
223			__field(dev_t, dev)
224			__field(u64, dir)
225			__string(name, dentry->d_name.name)
226		),
227
228		TP_fast_assign(
229			__entry->dev = dir->i_sb->s_dev;
230			__entry->dir = NFS_FILEID(dir);
231			__entry->error = error;
232			__entry->flags = flags;
233			__assign_str(name, dentry->d_name.name);
234		),
235
236		TP_printk(
237			"error=%d flags=%u (%s) name=%02x:%02x:%llu/%s",
238			__entry->error,
239			__entry->flags,
240			show_lookup_flags(__entry->flags),
241			MAJOR(__entry->dev), MINOR(__entry->dev),
242			(unsigned long long)__entry->dir,
243			__get_str(name)
244		)
245);
246
247#define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
248	DEFINE_EVENT(nfs_lookup_event_done, name, \
249			TP_PROTO( \
250				const struct inode *dir, \
251				const struct dentry *dentry, \
252				unsigned int flags, \
253				int error \
254			), \
255			TP_ARGS(dir, dentry, flags, error))
256
257DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
258DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
259DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
260DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
261
262#define show_open_flags(flags) \
263	__print_flags((unsigned long)flags, "|", \
264		{ O_CREAT, "O_CREAT" }, \
265		{ O_EXCL, "O_EXCL" }, \
266		{ O_TRUNC, "O_TRUNC" }, \
267		{ O_APPEND, "O_APPEND" }, \
268		{ O_DSYNC, "O_DSYNC" }, \
269		{ O_DIRECT, "O_DIRECT" }, \
270		{ O_DIRECTORY, "O_DIRECTORY" })
271
272#define show_fmode_flags(mode) \
273	__print_flags(mode, "|", \
274		{ ((__force unsigned long)FMODE_READ), "READ" }, \
275		{ ((__force unsigned long)FMODE_WRITE), "WRITE" }, \
276		{ ((__force unsigned long)FMODE_EXEC), "EXEC" })
277
278TRACE_EVENT(nfs_atomic_open_enter,
279		TP_PROTO(
280			const struct inode *dir,
281			const struct nfs_open_context *ctx,
282			unsigned int flags
283		),
284
285		TP_ARGS(dir, ctx, flags),
286
287		TP_STRUCT__entry(
288			__field(unsigned int, flags)
289			__field(unsigned int, fmode)
290			__field(dev_t, dev)
291			__field(u64, dir)
292			__string(name, ctx->dentry->d_name.name)
293		),
294
295		TP_fast_assign(
296			__entry->dev = dir->i_sb->s_dev;
297			__entry->dir = NFS_FILEID(dir);
298			__entry->flags = flags;
299			__entry->fmode = (__force unsigned int)ctx->mode;
300			__assign_str(name, ctx->dentry->d_name.name);
301		),
302
303		TP_printk(
304			"flags=%u (%s) fmode=%s name=%02x:%02x:%llu/%s",
305			__entry->flags,
306			show_open_flags(__entry->flags),
307			show_fmode_flags(__entry->fmode),
308			MAJOR(__entry->dev), MINOR(__entry->dev),
309			(unsigned long long)__entry->dir,
310			__get_str(name)
311		)
312);
313
314TRACE_EVENT(nfs_atomic_open_exit,
315		TP_PROTO(
316			const struct inode *dir,
317			const struct nfs_open_context *ctx,
318			unsigned int flags,
319			int error
320		),
321
322		TP_ARGS(dir, ctx, flags, error),
323
324		TP_STRUCT__entry(
325			__field(int, error)
326			__field(unsigned int, flags)
327			__field(unsigned int, fmode)
328			__field(dev_t, dev)
329			__field(u64, dir)
330			__string(name, ctx->dentry->d_name.name)
331		),
332
333		TP_fast_assign(
334			__entry->error = error;
335			__entry->dev = dir->i_sb->s_dev;
336			__entry->dir = NFS_FILEID(dir);
337			__entry->flags = flags;
338			__entry->fmode = (__force unsigned int)ctx->mode;
339			__assign_str(name, ctx->dentry->d_name.name);
340		),
341
342		TP_printk(
343			"error=%d flags=%u (%s) fmode=%s "
344			"name=%02x:%02x:%llu/%s",
345			__entry->error,
346			__entry->flags,
347			show_open_flags(__entry->flags),
348			show_fmode_flags(__entry->fmode),
349			MAJOR(__entry->dev), MINOR(__entry->dev),
350			(unsigned long long)__entry->dir,
351			__get_str(name)
352		)
353);
354
355TRACE_EVENT(nfs_create_enter,
356		TP_PROTO(
357			const struct inode *dir,
358			const struct dentry *dentry,
359			unsigned int flags
360		),
361
362		TP_ARGS(dir, dentry, flags),
363
364		TP_STRUCT__entry(
365			__field(unsigned int, flags)
366			__field(dev_t, dev)
367			__field(u64, dir)
368			__string(name, dentry->d_name.name)
369		),
370
371		TP_fast_assign(
372			__entry->dev = dir->i_sb->s_dev;
373			__entry->dir = NFS_FILEID(dir);
374			__entry->flags = flags;
375			__assign_str(name, dentry->d_name.name);
376		),
377
378		TP_printk(
379			"flags=%u (%s) name=%02x:%02x:%llu/%s",
380			__entry->flags,
381			show_open_flags(__entry->flags),
382			MAJOR(__entry->dev), MINOR(__entry->dev),
383			(unsigned long long)__entry->dir,
384			__get_str(name)
385		)
386);
387
388TRACE_EVENT(nfs_create_exit,
389		TP_PROTO(
390			const struct inode *dir,
391			const struct dentry *dentry,
392			unsigned int flags,
393			int error
394		),
395
396		TP_ARGS(dir, dentry, flags, error),
397
398		TP_STRUCT__entry(
399			__field(int, error)
400			__field(unsigned int, flags)
401			__field(dev_t, dev)
402			__field(u64, dir)
403			__string(name, dentry->d_name.name)
404		),
405
406		TP_fast_assign(
407			__entry->error = error;
408			__entry->dev = dir->i_sb->s_dev;
409			__entry->dir = NFS_FILEID(dir);
410			__entry->flags = flags;
411			__assign_str(name, dentry->d_name.name);
412		),
413
414		TP_printk(
415			"error=%d flags=%u (%s) name=%02x:%02x:%llu/%s",
416			__entry->error,
417			__entry->flags,
418			show_open_flags(__entry->flags),
419			MAJOR(__entry->dev), MINOR(__entry->dev),
420			(unsigned long long)__entry->dir,
421			__get_str(name)
422		)
423);
424
425DECLARE_EVENT_CLASS(nfs_directory_event,
426		TP_PROTO(
427			const struct inode *dir,
428			const struct dentry *dentry
429		),
430
431		TP_ARGS(dir, dentry),
432
433		TP_STRUCT__entry(
434			__field(dev_t, dev)
435			__field(u64, dir)
436			__string(name, dentry->d_name.name)
437		),
438
439		TP_fast_assign(
440			__entry->dev = dir->i_sb->s_dev;
441			__entry->dir = NFS_FILEID(dir);
442			__assign_str(name, dentry->d_name.name);
443		),
444
445		TP_printk(
446			"name=%02x:%02x:%llu/%s",
447			MAJOR(__entry->dev), MINOR(__entry->dev),
448			(unsigned long long)__entry->dir,
449			__get_str(name)
450		)
451);
452
453#define DEFINE_NFS_DIRECTORY_EVENT(name) \
454	DEFINE_EVENT(nfs_directory_event, name, \
455			TP_PROTO( \
456				const struct inode *dir, \
457				const struct dentry *dentry \
458			), \
459			TP_ARGS(dir, dentry))
460
461DECLARE_EVENT_CLASS(nfs_directory_event_done,
462		TP_PROTO(
463			const struct inode *dir,
464			const struct dentry *dentry,
465			int error
466		),
467
468		TP_ARGS(dir, dentry, error),
469
470		TP_STRUCT__entry(
471			__field(int, error)
472			__field(dev_t, dev)
473			__field(u64, dir)
474			__string(name, dentry->d_name.name)
475		),
476
477		TP_fast_assign(
478			__entry->dev = dir->i_sb->s_dev;
479			__entry->dir = NFS_FILEID(dir);
480			__entry->error = error;
481			__assign_str(name, dentry->d_name.name);
482		),
483
484		TP_printk(
485			"error=%d name=%02x:%02x:%llu/%s",
486			__entry->error,
487			MAJOR(__entry->dev), MINOR(__entry->dev),
488			(unsigned long long)__entry->dir,
489			__get_str(name)
490		)
491);
492
493#define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
494	DEFINE_EVENT(nfs_directory_event_done, name, \
495			TP_PROTO( \
496				const struct inode *dir, \
497				const struct dentry *dentry, \
498				int error \
499			), \
500			TP_ARGS(dir, dentry, error))
501
502DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
503DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
504DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
505DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
506DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
507DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
508DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
509DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
510DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
511DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
512DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
513DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
514
515TRACE_EVENT(nfs_link_enter,
516		TP_PROTO(
517			const struct inode *inode,
518			const struct inode *dir,
519			const struct dentry *dentry
520		),
521
522		TP_ARGS(inode, dir, dentry),
523
524		TP_STRUCT__entry(
525			__field(dev_t, dev)
526			__field(u64, fileid)
527			__field(u64, dir)
528			__string(name, dentry->d_name.name)
529		),
530
531		TP_fast_assign(
532			__entry->dev = inode->i_sb->s_dev;
533			__entry->fileid = NFS_FILEID(inode);
534			__entry->dir = NFS_FILEID(dir);
535			__assign_str(name, dentry->d_name.name);
536		),
537
538		TP_printk(
539			"fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
540			MAJOR(__entry->dev), MINOR(__entry->dev),
541			__entry->fileid,
542			MAJOR(__entry->dev), MINOR(__entry->dev),
543			(unsigned long long)__entry->dir,
544			__get_str(name)
545		)
546);
547
548TRACE_EVENT(nfs_link_exit,
549		TP_PROTO(
550			const struct inode *inode,
551			const struct inode *dir,
552			const struct dentry *dentry,
553			int error
554		),
555
556		TP_ARGS(inode, dir, dentry, error),
557
558		TP_STRUCT__entry(
559			__field(int, error)
560			__field(dev_t, dev)
561			__field(u64, fileid)
562			__field(u64, dir)
563			__string(name, dentry->d_name.name)
564		),
565
566		TP_fast_assign(
567			__entry->dev = inode->i_sb->s_dev;
568			__entry->fileid = NFS_FILEID(inode);
569			__entry->dir = NFS_FILEID(dir);
570			__entry->error = error;
571			__assign_str(name, dentry->d_name.name);
572		),
573
574		TP_printk(
575			"error=%d fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
576			__entry->error,
577			MAJOR(__entry->dev), MINOR(__entry->dev),
578			__entry->fileid,
579			MAJOR(__entry->dev), MINOR(__entry->dev),
580			(unsigned long long)__entry->dir,
581			__get_str(name)
582		)
583);
584
585DECLARE_EVENT_CLASS(nfs_rename_event,
586		TP_PROTO(
587			const struct inode *old_dir,
588			const struct dentry *old_dentry,
589			const struct inode *new_dir,
590			const struct dentry *new_dentry
591		),
592
593		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
594
595		TP_STRUCT__entry(
596			__field(dev_t, dev)
597			__field(u64, old_dir)
598			__field(u64, new_dir)
599			__string(old_name, old_dentry->d_name.name)
600			__string(new_name, new_dentry->d_name.name)
601		),
602
603		TP_fast_assign(
604			__entry->dev = old_dir->i_sb->s_dev;
605			__entry->old_dir = NFS_FILEID(old_dir);
606			__entry->new_dir = NFS_FILEID(new_dir);
607			__assign_str(old_name, old_dentry->d_name.name);
608			__assign_str(new_name, new_dentry->d_name.name);
609		),
610
611		TP_printk(
612			"old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
613			MAJOR(__entry->dev), MINOR(__entry->dev),
614			(unsigned long long)__entry->old_dir,
615			__get_str(old_name),
616			MAJOR(__entry->dev), MINOR(__entry->dev),
617			(unsigned long long)__entry->new_dir,
618			__get_str(new_name)
619		)
620);
621#define DEFINE_NFS_RENAME_EVENT(name) \
622	DEFINE_EVENT(nfs_rename_event, name, \
623			TP_PROTO( \
624				const struct inode *old_dir, \
625				const struct dentry *old_dentry, \
626				const struct inode *new_dir, \
627				const struct dentry *new_dentry \
628			), \
629			TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
630
631DECLARE_EVENT_CLASS(nfs_rename_event_done,
632		TP_PROTO(
633			const struct inode *old_dir,
634			const struct dentry *old_dentry,
635			const struct inode *new_dir,
636			const struct dentry *new_dentry,
637			int error
638		),
639
640		TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
641
642		TP_STRUCT__entry(
643			__field(dev_t, dev)
644			__field(int, error)
645			__field(u64, old_dir)
646			__string(old_name, old_dentry->d_name.name)
647			__field(u64, new_dir)
648			__string(new_name, new_dentry->d_name.name)
649		),
650
651		TP_fast_assign(
652			__entry->dev = old_dir->i_sb->s_dev;
 
653			__entry->old_dir = NFS_FILEID(old_dir);
654			__entry->new_dir = NFS_FILEID(new_dir);
655			__entry->error = error;
656			__assign_str(old_name, old_dentry->d_name.name);
657			__assign_str(new_name, new_dentry->d_name.name);
658		),
659
660		TP_printk(
661			"error=%d old_name=%02x:%02x:%llu/%s "
662			"new_name=%02x:%02x:%llu/%s",
663			__entry->error,
664			MAJOR(__entry->dev), MINOR(__entry->dev),
665			(unsigned long long)__entry->old_dir,
666			__get_str(old_name),
667			MAJOR(__entry->dev), MINOR(__entry->dev),
668			(unsigned long long)__entry->new_dir,
669			__get_str(new_name)
670		)
671);
672#define DEFINE_NFS_RENAME_EVENT_DONE(name) \
673	DEFINE_EVENT(nfs_rename_event_done, name, \
674			TP_PROTO( \
675				const struct inode *old_dir, \
676				const struct dentry *old_dentry, \
677				const struct inode *new_dir, \
678				const struct dentry *new_dentry, \
679				int error \
680			), \
681			TP_ARGS(old_dir, old_dentry, new_dir, \
682				new_dentry, error))
683
684DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
685DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
686
687DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
688
689TRACE_EVENT(nfs_sillyrename_unlink,
690		TP_PROTO(
691			const struct nfs_unlinkdata *data,
692			int error
693		),
694
695		TP_ARGS(data, error),
696
697		TP_STRUCT__entry(
698			__field(dev_t, dev)
699			__field(int, error)
700			__field(u64, dir)
701			__dynamic_array(char, name, data->args.name.len + 1)
702		),
703
704		TP_fast_assign(
705			struct inode *dir = data->dir;
706			size_t len = data->args.name.len;
707			__entry->dev = dir->i_sb->s_dev;
708			__entry->dir = NFS_FILEID(dir);
709			__entry->error = error;
710			memcpy(__get_dynamic_array(name),
711				data->args.name.name, len);
712			((char *)__get_dynamic_array(name))[len] = 0;
713		),
714
715		TP_printk(
716			"error=%d name=%02x:%02x:%llu/%s",
717			__entry->error,
718			MAJOR(__entry->dev), MINOR(__entry->dev),
719			(unsigned long long)__entry->dir,
720			__get_str(name)
721		)
722);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
723#endif /* _TRACE_NFS_H */
724
725#undef TRACE_INCLUDE_PATH
726#define TRACE_INCLUDE_PATH .
727#define TRACE_INCLUDE_FILE nfstrace
728/* This part must be outside protection */
729#include <trace/define_trace.h>
v6.2
   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/misc/fs.h>
  15#include <trace/misc/nfs.h>
  16#include <trace/misc/sunrpc.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, error)
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->error = 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			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1161			"offset=%lld count=%u res=%u%s", __entry->error,
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->eof ? " eof" : ""
1167		)
1168);
1169
1170TRACE_EVENT(nfs_readpage_short,
1171		TP_PROTO(
1172			const struct rpc_task *task,
1173			const struct nfs_pgio_header *hdr
1174		),
1175
1176		TP_ARGS(task, hdr),
1177
1178		TP_STRUCT__entry(
1179			__field(dev_t, dev)
1180			__field(u32, fhandle)
1181			__field(u64, fileid)
1182			__field(loff_t, offset)
1183			__field(u32, arg_count)
1184			__field(u32, res_count)
1185			__field(bool, eof)
1186			__field(int, error)
1187		),
1188
1189		TP_fast_assign(
1190			const struct inode *inode = hdr->inode;
1191			const struct nfs_inode *nfsi = NFS_I(inode);
1192			const struct nfs_fh *fh = hdr->args.fh ?
1193						  hdr->args.fh : &nfsi->fh;
1194
1195			__entry->error = task->tk_status;
1196			__entry->offset = hdr->args.offset;
1197			__entry->arg_count = hdr->args.count;
1198			__entry->res_count = hdr->res.count;
1199			__entry->eof = hdr->res.eof;
1200			__entry->dev = inode->i_sb->s_dev;
1201			__entry->fileid = nfsi->fileid;
1202			__entry->fhandle = nfs_fhandle_hash(fh);
1203		),
1204
1205		TP_printk(
1206			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1207			"offset=%lld count=%u res=%u%s", __entry->error,
1208			MAJOR(__entry->dev), MINOR(__entry->dev),
1209			(unsigned long long)__entry->fileid,
1210			__entry->fhandle,
1211			(long long)__entry->offset, __entry->arg_count,
1212			__entry->res_count, __entry->eof ? " eof" : ""
1213		)
1214);
1215
1216DECLARE_EVENT_CLASS(nfs_fscache_page_event,
1217		TP_PROTO(
1218			const struct inode *inode,
1219			struct page *page
1220		),
1221
1222		TP_ARGS(inode, page),
1223
1224		TP_STRUCT__entry(
1225			__field(dev_t, dev)
1226			__field(u32, fhandle)
1227			__field(u64, fileid)
1228			__field(loff_t, offset)
1229		),
1230
1231		TP_fast_assign(
1232			const struct nfs_inode *nfsi = NFS_I(inode);
1233			const struct nfs_fh *fh = &nfsi->fh;
1234
1235			__entry->offset = page_index(page) << PAGE_SHIFT;
1236			__entry->dev = inode->i_sb->s_dev;
1237			__entry->fileid = nfsi->fileid;
1238			__entry->fhandle = nfs_fhandle_hash(fh);
1239		),
1240
1241		TP_printk(
1242			"fileid=%02x:%02x:%llu fhandle=0x%08x "
1243			"offset=%lld",
1244			MAJOR(__entry->dev), MINOR(__entry->dev),
1245			(unsigned long long)__entry->fileid,
1246			__entry->fhandle,
1247			(long long)__entry->offset
1248		)
1249);
1250DECLARE_EVENT_CLASS(nfs_fscache_page_event_done,
1251		TP_PROTO(
1252			const struct inode *inode,
1253			struct page *page,
1254			int error
1255		),
1256
1257		TP_ARGS(inode, page, error),
1258
1259		TP_STRUCT__entry(
1260			__field(int, error)
1261			__field(dev_t, dev)
1262			__field(u32, fhandle)
1263			__field(u64, fileid)
1264			__field(loff_t, offset)
1265		),
1266
1267		TP_fast_assign(
1268			const struct nfs_inode *nfsi = NFS_I(inode);
1269			const struct nfs_fh *fh = &nfsi->fh;
1270
1271			__entry->offset = page_index(page) << PAGE_SHIFT;
1272			__entry->dev = inode->i_sb->s_dev;
1273			__entry->fileid = nfsi->fileid;
1274			__entry->fhandle = nfs_fhandle_hash(fh);
1275			__entry->error = error;
1276		),
1277
1278		TP_printk(
1279			"fileid=%02x:%02x:%llu fhandle=0x%08x "
1280			"offset=%lld error=%d",
1281			MAJOR(__entry->dev), MINOR(__entry->dev),
1282			(unsigned long long)__entry->fileid,
1283			__entry->fhandle,
1284			(long long)__entry->offset, __entry->error
1285		)
1286);
1287#define DEFINE_NFS_FSCACHE_PAGE_EVENT(name) \
1288	DEFINE_EVENT(nfs_fscache_page_event, name, \
1289			TP_PROTO( \
1290				const struct inode *inode, \
1291				struct page *page \
1292			), \
1293			TP_ARGS(inode, page))
1294#define DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(name) \
1295	DEFINE_EVENT(nfs_fscache_page_event_done, name, \
1296			TP_PROTO( \
1297				const struct inode *inode, \
1298				struct page *page, \
1299				int error \
1300			), \
1301			TP_ARGS(inode, page, error))
1302DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_read_page);
1303DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_read_page_exit);
1304DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_write_page);
1305DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_write_page_exit);
1306
1307TRACE_EVENT(nfs_pgio_error,
1308	TP_PROTO(
1309		const struct nfs_pgio_header *hdr,
1310		int error,
1311		loff_t pos
1312	),
1313
1314	TP_ARGS(hdr, error, pos),
1315
1316	TP_STRUCT__entry(
1317		__field(dev_t, dev)
1318		__field(u32, fhandle)
1319		__field(u64, fileid)
1320		__field(loff_t, offset)
1321		__field(u32, arg_count)
1322		__field(u32, res_count)
1323		__field(loff_t, pos)
1324		__field(int, error)
1325	),
1326
1327	TP_fast_assign(
1328		const struct inode *inode = hdr->inode;
1329		const struct nfs_inode *nfsi = NFS_I(inode);
1330		const struct nfs_fh *fh = hdr->args.fh ?
1331					  hdr->args.fh : &nfsi->fh;
1332
1333		__entry->error = error;
1334		__entry->offset = hdr->args.offset;
1335		__entry->arg_count = hdr->args.count;
1336		__entry->res_count = hdr->res.count;
1337		__entry->dev = inode->i_sb->s_dev;
1338		__entry->fileid = nfsi->fileid;
1339		__entry->fhandle = nfs_fhandle_hash(fh);
1340	),
1341
1342	TP_printk("error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1343		  "offset=%lld count=%u res=%u pos=%llu", __entry->error,
1344		MAJOR(__entry->dev), MINOR(__entry->dev),
1345		(unsigned long long)__entry->fileid, __entry->fhandle,
1346		(long long)__entry->offset, __entry->arg_count, __entry->res_count,
1347		__entry->pos
1348	)
1349);
1350
1351TRACE_EVENT(nfs_initiate_write,
1352		TP_PROTO(
1353			const struct nfs_pgio_header *hdr
1354		),
1355
1356		TP_ARGS(hdr),
1357
1358		TP_STRUCT__entry(
1359			__field(dev_t, dev)
1360			__field(u32, fhandle)
1361			__field(u64, fileid)
1362			__field(loff_t, offset)
1363			__field(u32, count)
1364			__field(unsigned long, stable)
1365		),
1366
1367		TP_fast_assign(
1368			const struct inode *inode = hdr->inode;
1369			const struct nfs_inode *nfsi = NFS_I(inode);
1370			const struct nfs_fh *fh = hdr->args.fh ?
1371						  hdr->args.fh : &nfsi->fh;
1372
1373			__entry->offset = hdr->args.offset;
1374			__entry->count = hdr->args.count;
1375			__entry->stable = hdr->args.stable;
1376			__entry->dev = inode->i_sb->s_dev;
1377			__entry->fileid = nfsi->fileid;
1378			__entry->fhandle = nfs_fhandle_hash(fh);
1379		),
1380
1381		TP_printk(
1382			"fileid=%02x:%02x:%llu fhandle=0x%08x "
1383			"offset=%lld count=%u stable=%s",
1384			MAJOR(__entry->dev), MINOR(__entry->dev),
1385			(unsigned long long)__entry->fileid,
1386			__entry->fhandle,
1387			(long long)__entry->offset, __entry->count,
1388			show_nfs_stable_how(__entry->stable)
1389		)
1390);
1391
1392TRACE_EVENT(nfs_writeback_done,
1393		TP_PROTO(
1394			const struct rpc_task *task,
1395			const struct nfs_pgio_header *hdr
1396		),
1397
1398		TP_ARGS(task, hdr),
1399
1400		TP_STRUCT__entry(
1401			__field(dev_t, dev)
1402			__field(u32, fhandle)
1403			__field(u64, fileid)
1404			__field(loff_t, offset)
1405			__field(u32, arg_count)
1406			__field(u32, res_count)
1407			__field(int, error)
1408			__field(unsigned long, stable)
1409			__array(char, verifier, NFS4_VERIFIER_SIZE)
1410		),
1411
1412		TP_fast_assign(
1413			const struct inode *inode = hdr->inode;
1414			const struct nfs_inode *nfsi = NFS_I(inode);
1415			const struct nfs_fh *fh = hdr->args.fh ?
1416						  hdr->args.fh : &nfsi->fh;
1417			const struct nfs_writeverf *verf = hdr->res.verf;
1418
1419			__entry->error = task->tk_status;
1420			__entry->offset = hdr->args.offset;
1421			__entry->arg_count = hdr->args.count;
1422			__entry->res_count = hdr->res.count;
1423			__entry->stable = verf->committed;
1424			memcpy(__entry->verifier,
1425				&verf->verifier,
1426				NFS4_VERIFIER_SIZE);
1427			__entry->dev = inode->i_sb->s_dev;
1428			__entry->fileid = nfsi->fileid;
1429			__entry->fhandle = nfs_fhandle_hash(fh);
1430		),
1431
1432		TP_printk(
1433			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1434			"offset=%lld count=%u res=%u stable=%s "
1435			"verifier=%s", __entry->error,
1436			MAJOR(__entry->dev), MINOR(__entry->dev),
1437			(unsigned long long)__entry->fileid,
1438			__entry->fhandle,
1439			(long long)__entry->offset, __entry->arg_count,
1440			__entry->res_count,
1441			show_nfs_stable_how(__entry->stable),
1442			show_nfs4_verifier(__entry->verifier)
1443		)
1444);
1445
1446DECLARE_EVENT_CLASS(nfs_page_error_class,
1447		TP_PROTO(
1448			const struct inode *inode,
1449			const struct nfs_page *req,
1450			int error
1451		),
1452
1453		TP_ARGS(inode, req, error),
1454
1455		TP_STRUCT__entry(
1456			__field(dev_t, dev)
1457			__field(u32, fhandle)
1458			__field(u64, fileid)
1459			__field(loff_t, offset)
1460			__field(unsigned int, count)
1461			__field(int, error)
1462		),
1463
1464		TP_fast_assign(
1465			const struct nfs_inode *nfsi = NFS_I(inode);
1466			__entry->dev = inode->i_sb->s_dev;
1467			__entry->fileid = nfsi->fileid;
1468			__entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1469			__entry->offset = req_offset(req);
1470			__entry->count = req->wb_bytes;
1471			__entry->error = error;
1472		),
1473
1474		TP_printk(
1475			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1476			"offset=%lld count=%u", __entry->error,
1477			MAJOR(__entry->dev), MINOR(__entry->dev),
1478			(unsigned long long)__entry->fileid,
1479			__entry->fhandle, __entry->offset,
1480			__entry->count
1481		)
1482);
1483
1484#define DEFINE_NFS_PAGEERR_EVENT(name) \
1485	DEFINE_EVENT(nfs_page_error_class, name, \
1486			TP_PROTO( \
1487				const struct inode *inode, \
1488				const struct nfs_page *req, \
1489				int error \
1490			), \
1491			TP_ARGS(inode, req, error))
1492
1493DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
1494DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
1495DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
1496
1497TRACE_EVENT(nfs_initiate_commit,
1498		TP_PROTO(
1499			const struct nfs_commit_data *data
1500		),
1501
1502		TP_ARGS(data),
1503
1504		TP_STRUCT__entry(
1505			__field(dev_t, dev)
1506			__field(u32, fhandle)
1507			__field(u64, fileid)
1508			__field(loff_t, offset)
1509			__field(u32, count)
1510		),
1511
1512		TP_fast_assign(
1513			const struct inode *inode = data->inode;
1514			const struct nfs_inode *nfsi = NFS_I(inode);
1515			const struct nfs_fh *fh = data->args.fh ?
1516						  data->args.fh : &nfsi->fh;
1517
1518			__entry->offset = data->args.offset;
1519			__entry->count = data->args.count;
1520			__entry->dev = inode->i_sb->s_dev;
1521			__entry->fileid = nfsi->fileid;
1522			__entry->fhandle = nfs_fhandle_hash(fh);
1523		),
1524
1525		TP_printk(
1526			"fileid=%02x:%02x:%llu fhandle=0x%08x "
1527			"offset=%lld count=%u",
1528			MAJOR(__entry->dev), MINOR(__entry->dev),
1529			(unsigned long long)__entry->fileid,
1530			__entry->fhandle,
1531			(long long)__entry->offset, __entry->count
1532		)
1533);
1534
1535TRACE_EVENT(nfs_commit_done,
1536		TP_PROTO(
1537			const struct rpc_task *task,
1538			const struct nfs_commit_data *data
1539		),
1540
1541		TP_ARGS(task, data),
1542
1543		TP_STRUCT__entry(
1544			__field(dev_t, dev)
1545			__field(u32, fhandle)
1546			__field(u64, fileid)
1547			__field(loff_t, offset)
1548			__field(int, error)
1549			__field(unsigned long, stable)
1550			__array(char, verifier, NFS4_VERIFIER_SIZE)
1551		),
1552
1553		TP_fast_assign(
1554			const struct inode *inode = data->inode;
1555			const struct nfs_inode *nfsi = NFS_I(inode);
1556			const struct nfs_fh *fh = data->args.fh ?
1557						  data->args.fh : &nfsi->fh;
1558			const struct nfs_writeverf *verf = data->res.verf;
1559
1560			__entry->error = task->tk_status;
1561			__entry->offset = data->args.offset;
1562			__entry->stable = verf->committed;
1563			memcpy(__entry->verifier,
1564				&verf->verifier,
1565				NFS4_VERIFIER_SIZE);
1566			__entry->dev = inode->i_sb->s_dev;
1567			__entry->fileid = nfsi->fileid;
1568			__entry->fhandle = nfs_fhandle_hash(fh);
1569		),
1570
1571		TP_printk(
1572			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1573			"offset=%lld stable=%s verifier=%s", __entry->error,
1574			MAJOR(__entry->dev), MINOR(__entry->dev),
1575			(unsigned long long)__entry->fileid,
1576			__entry->fhandle,
1577			(long long)__entry->offset,
1578			show_nfs_stable_how(__entry->stable),
1579			show_nfs4_verifier(__entry->verifier)
1580		)
1581);
1582
1583#define nfs_show_direct_req_flags(v) \
1584	__print_flags(v, "|", \
1585			{ NFS_ODIRECT_DO_COMMIT, "DO_COMMIT" }, \
1586			{ NFS_ODIRECT_RESCHED_WRITES, "RESCHED_WRITES" }, \
1587			{ NFS_ODIRECT_SHOULD_DIRTY, "SHOULD DIRTY" }, \
1588			{ NFS_ODIRECT_DONE, "DONE" } )
1589
1590DECLARE_EVENT_CLASS(nfs_direct_req_class,
1591		TP_PROTO(
1592			const struct nfs_direct_req *dreq
1593		),
1594
1595		TP_ARGS(dreq),
1596
1597		TP_STRUCT__entry(
1598			__field(dev_t, dev)
1599			__field(u64, fileid)
1600			__field(u32, fhandle)
1601			__field(loff_t, offset)
1602			__field(ssize_t, count)
1603			__field(ssize_t, bytes_left)
1604			__field(ssize_t, error)
1605			__field(int, flags)
1606		),
1607
1608		TP_fast_assign(
1609			const struct inode *inode = dreq->inode;
1610			const struct nfs_inode *nfsi = NFS_I(inode);
1611			const struct nfs_fh *fh = &nfsi->fh;
1612
1613			__entry->dev = inode->i_sb->s_dev;
1614			__entry->fileid = nfsi->fileid;
1615			__entry->fhandle = nfs_fhandle_hash(fh);
1616			__entry->offset = dreq->io_start;
1617			__entry->count = dreq->count;
1618			__entry->bytes_left = dreq->bytes_left;
1619			__entry->error = dreq->error;
1620			__entry->flags = dreq->flags;
1621		),
1622
1623		TP_printk(
1624			"error=%zd fileid=%02x:%02x:%llu fhandle=0x%08x "
1625			"offset=%lld count=%zd bytes_left=%zd flags=%s",
1626			__entry->error, MAJOR(__entry->dev),
1627			MINOR(__entry->dev),
1628			(unsigned long long)__entry->fileid,
1629			__entry->fhandle, __entry->offset,
1630			__entry->count, __entry->bytes_left,
1631			nfs_show_direct_req_flags(__entry->flags)
1632		)
1633);
1634
1635#define DEFINE_NFS_DIRECT_REQ_EVENT(name) \
1636	DEFINE_EVENT(nfs_direct_req_class, name, \
1637			TP_PROTO( \
1638				const struct nfs_direct_req *dreq \
1639			), \
1640			TP_ARGS(dreq))
1641
1642DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_commit_complete);
1643DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_resched_write);
1644DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_complete);
1645DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_completion);
1646DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_schedule_iovec);
1647DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_reschedule_io);
1648
1649TRACE_EVENT(nfs_fh_to_dentry,
1650		TP_PROTO(
1651			const struct super_block *sb,
1652			const struct nfs_fh *fh,
1653			u64 fileid,
1654			int error
1655		),
1656
1657		TP_ARGS(sb, fh, fileid, error),
1658
1659		TP_STRUCT__entry(
1660			__field(int, error)
1661			__field(dev_t, dev)
1662			__field(u32, fhandle)
1663			__field(u64, fileid)
1664		),
1665
1666		TP_fast_assign(
1667			__entry->error = error;
1668			__entry->dev = sb->s_dev;
1669			__entry->fileid = fileid;
1670			__entry->fhandle = nfs_fhandle_hash(fh);
1671		),
1672
1673		TP_printk(
1674			"error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
1675			__entry->error,
1676			MAJOR(__entry->dev), MINOR(__entry->dev),
1677			(unsigned long long)__entry->fileid,
1678			__entry->fhandle
1679		)
1680);
1681
1682TRACE_EVENT(nfs_mount_assign,
1683	TP_PROTO(
1684		const char *option,
1685		const char *value
1686	),
1687
1688	TP_ARGS(option, value),
1689
1690	TP_STRUCT__entry(
1691		__string(option, option)
1692		__string(value, value)
1693	),
1694
1695	TP_fast_assign(
1696		__assign_str(option, option);
1697		__assign_str(value, value);
1698	),
1699
1700	TP_printk("option %s=%s",
1701		__get_str(option), __get_str(value)
1702	)
1703);
1704
1705TRACE_EVENT(nfs_mount_option,
1706	TP_PROTO(
1707		const struct fs_parameter *param
1708	),
1709
1710	TP_ARGS(param),
1711
1712	TP_STRUCT__entry(
1713		__string(option, param->key)
1714	),
1715
1716	TP_fast_assign(
1717		__assign_str(option, param->key);
1718	),
1719
1720	TP_printk("option %s", __get_str(option))
1721);
1722
1723TRACE_EVENT(nfs_mount_path,
1724	TP_PROTO(
1725		const char *path
1726	),
1727
1728	TP_ARGS(path),
1729
1730	TP_STRUCT__entry(
1731		__string(path, path)
1732	),
1733
1734	TP_fast_assign(
1735		__assign_str(path, path);
1736	),
1737
1738	TP_printk("path='%s'", __get_str(path))
1739);
1740
1741DECLARE_EVENT_CLASS(nfs_xdr_event,
1742		TP_PROTO(
1743			const struct xdr_stream *xdr,
1744			int error
1745		),
1746
1747		TP_ARGS(xdr, error),
1748
1749		TP_STRUCT__entry(
1750			__field(unsigned int, task_id)
1751			__field(unsigned int, client_id)
1752			__field(u32, xid)
1753			__field(int, version)
1754			__field(unsigned long, error)
1755			__string(program,
1756				 xdr->rqst->rq_task->tk_client->cl_program->name)
1757			__string(procedure,
1758				 xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
1759		),
1760
1761		TP_fast_assign(
1762			const struct rpc_rqst *rqstp = xdr->rqst;
1763			const struct rpc_task *task = rqstp->rq_task;
1764
1765			__entry->task_id = task->tk_pid;
1766			__entry->client_id = task->tk_client->cl_clid;
1767			__entry->xid = be32_to_cpu(rqstp->rq_xid);
1768			__entry->version = task->tk_client->cl_vers;
1769			__entry->error = error;
1770			__assign_str(program,
1771				     task->tk_client->cl_program->name);
1772			__assign_str(procedure, task->tk_msg.rpc_proc->p_name);
1773		),
1774
1775		TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
1776			  " xid=0x%08x %sv%d %s error=%ld (%s)",
1777			__entry->task_id, __entry->client_id, __entry->xid,
1778			__get_str(program), __entry->version,
1779			__get_str(procedure), -__entry->error,
1780			show_nfs_status(__entry->error)
1781		)
1782);
1783#define DEFINE_NFS_XDR_EVENT(name) \
1784	DEFINE_EVENT(nfs_xdr_event, name, \
1785			TP_PROTO( \
1786				const struct xdr_stream *xdr, \
1787				int error \
1788			), \
1789			TP_ARGS(xdr, error))
1790DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
1791DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
1792
1793#endif /* _TRACE_NFS_H */
1794
1795#undef TRACE_INCLUDE_PATH
1796#define TRACE_INCLUDE_PATH .
1797#define TRACE_INCLUDE_FILE nfstrace
1798/* This part must be outside protection */
1799#include <trace/define_trace.h>