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