Linux Audio

Check our new training course

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