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