NFSv4: Catch and trace server filehandle encoding errors
[linux-2.6-block.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 TRACE_DEFINE_ENUM(NFS_INO_DATA_INVAL_DEFER);
49 TRACE_DEFINE_ENUM(NFS_INO_INVALID_BLOCKS);
50 TRACE_DEFINE_ENUM(NFS_INO_INVALID_XATTR);
51 TRACE_DEFINE_ENUM(NFS_INO_INVALID_NLINK);
52 TRACE_DEFINE_ENUM(NFS_INO_INVALID_MODE);
53
54 #define nfs_show_cache_validity(v) \
55         __print_flags(v, "|", \
56                         { NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
57                         { NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
58                         { NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
59                         { NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
60                         { NFS_INO_REVAL_PAGECACHE, "REVAL_PAGECACHE" }, \
61                         { NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
62                         { NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
63                         { NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
64                         { NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
65                         { NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
66                         { NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
67                         { NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
68                         { NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
69                         { NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
70                         { NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
71                         { NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
72                         { NFS_INO_INVALID_MODE, "INVALID_MODE" })
73
74 TRACE_DEFINE_ENUM(NFS_INO_ADVISE_RDPLUS);
75 TRACE_DEFINE_ENUM(NFS_INO_STALE);
76 TRACE_DEFINE_ENUM(NFS_INO_ACL_LRU_SET);
77 TRACE_DEFINE_ENUM(NFS_INO_INVALIDATING);
78 TRACE_DEFINE_ENUM(NFS_INO_FSCACHE);
79 TRACE_DEFINE_ENUM(NFS_INO_FSCACHE_LOCK);
80 TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMIT);
81 TRACE_DEFINE_ENUM(NFS_INO_LAYOUTCOMMITTING);
82 TRACE_DEFINE_ENUM(NFS_INO_LAYOUTSTATS);
83 TRACE_DEFINE_ENUM(NFS_INO_ODIRECT);
84
85 #define nfs_show_nfsi_flags(v) \
86         __print_flags(v, "|", \
87                         { BIT(NFS_INO_ADVISE_RDPLUS), "ADVISE_RDPLUS" }, \
88                         { BIT(NFS_INO_STALE), "STALE" }, \
89                         { BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
90                         { BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
91                         { BIT(NFS_INO_FSCACHE), "FSCACHE" }, \
92                         { BIT(NFS_INO_FSCACHE_LOCK), "FSCACHE_LOCK" }, \
93                         { BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
94                         { BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
95                         { BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
96                         { BIT(NFS_INO_ODIRECT), "ODIRECT" })
97
98 DECLARE_EVENT_CLASS(nfs_inode_event,
99                 TP_PROTO(
100                         const struct inode *inode
101                 ),
102
103                 TP_ARGS(inode),
104
105                 TP_STRUCT__entry(
106                         __field(dev_t, dev)
107                         __field(u32, fhandle)
108                         __field(u64, fileid)
109                         __field(u64, version)
110                 ),
111
112                 TP_fast_assign(
113                         const struct nfs_inode *nfsi = NFS_I(inode);
114                         __entry->dev = inode->i_sb->s_dev;
115                         __entry->fileid = nfsi->fileid;
116                         __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
117                         __entry->version = inode_peek_iversion_raw(inode);
118                 ),
119
120                 TP_printk(
121                         "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
122                         MAJOR(__entry->dev), MINOR(__entry->dev),
123                         (unsigned long long)__entry->fileid,
124                         __entry->fhandle,
125                         (unsigned long long)__entry->version
126                 )
127 );
128
129 DECLARE_EVENT_CLASS(nfs_inode_event_done,
130                 TP_PROTO(
131                         const struct inode *inode,
132                         int error
133                 ),
134
135                 TP_ARGS(inode, error),
136
137                 TP_STRUCT__entry(
138                         __field(unsigned long, error)
139                         __field(dev_t, dev)
140                         __field(u32, fhandle)
141                         __field(unsigned char, type)
142                         __field(u64, fileid)
143                         __field(u64, version)
144                         __field(loff_t, size)
145                         __field(unsigned long, nfsi_flags)
146                         __field(unsigned long, cache_validity)
147                 ),
148
149                 TP_fast_assign(
150                         const struct nfs_inode *nfsi = NFS_I(inode);
151                         __entry->error = error < 0 ? -error : 0;
152                         __entry->dev = inode->i_sb->s_dev;
153                         __entry->fileid = nfsi->fileid;
154                         __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
155                         __entry->type = nfs_umode_to_dtype(inode->i_mode);
156                         __entry->version = inode_peek_iversion_raw(inode);
157                         __entry->size = i_size_read(inode);
158                         __entry->nfsi_flags = nfsi->flags;
159                         __entry->cache_validity = nfsi->cache_validity;
160                 ),
161
162                 TP_printk(
163                         "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
164                         "type=%u (%s) version=%llu size=%lld "
165                         "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
166                         -__entry->error, nfs_show_status(__entry->error),
167                         MAJOR(__entry->dev), MINOR(__entry->dev),
168                         (unsigned long long)__entry->fileid,
169                         __entry->fhandle,
170                         __entry->type,
171                         nfs_show_file_type(__entry->type),
172                         (unsigned long long)__entry->version,
173                         (long long)__entry->size,
174                         __entry->cache_validity,
175                         nfs_show_cache_validity(__entry->cache_validity),
176                         __entry->nfsi_flags,
177                         nfs_show_nfsi_flags(__entry->nfsi_flags)
178                 )
179 );
180
181 #define DEFINE_NFS_INODE_EVENT(name) \
182         DEFINE_EVENT(nfs_inode_event, name, \
183                         TP_PROTO( \
184                                 const struct inode *inode \
185                         ), \
186                         TP_ARGS(inode))
187 #define DEFINE_NFS_INODE_EVENT_DONE(name) \
188         DEFINE_EVENT(nfs_inode_event_done, name, \
189                         TP_PROTO( \
190                                 const struct inode *inode, \
191                                 int error \
192                         ), \
193                         TP_ARGS(inode, error))
194 DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
195 DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
196 DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
197 DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
198 DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
199 DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
200 DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
201 DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
202 DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
203 DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
204 DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
205 DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
206 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
207 DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
208 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
209 DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
210 DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
211 DEFINE_NFS_INODE_EVENT(nfs_access_enter);
212
213 TRACE_EVENT(nfs_access_exit,
214                 TP_PROTO(
215                         const struct inode *inode,
216                         unsigned int mask,
217                         unsigned int permitted,
218                         int error
219                 ),
220
221                 TP_ARGS(inode, mask, permitted, error),
222
223                 TP_STRUCT__entry(
224                         __field(unsigned long, error)
225                         __field(dev_t, dev)
226                         __field(u32, fhandle)
227                         __field(unsigned char, type)
228                         __field(u64, fileid)
229                         __field(u64, version)
230                         __field(loff_t, size)
231                         __field(unsigned long, nfsi_flags)
232                         __field(unsigned long, cache_validity)
233                         __field(unsigned int, mask)
234                         __field(unsigned int, permitted)
235                 ),
236
237                 TP_fast_assign(
238                         const struct nfs_inode *nfsi = NFS_I(inode);
239                         __entry->error = error < 0 ? -error : 0;
240                         __entry->dev = inode->i_sb->s_dev;
241                         __entry->fileid = nfsi->fileid;
242                         __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
243                         __entry->type = nfs_umode_to_dtype(inode->i_mode);
244                         __entry->version = inode_peek_iversion_raw(inode);
245                         __entry->size = i_size_read(inode);
246                         __entry->nfsi_flags = nfsi->flags;
247                         __entry->cache_validity = nfsi->cache_validity;
248                         __entry->mask = mask;
249                         __entry->permitted = permitted;
250                 ),
251
252                 TP_printk(
253                         "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
254                         "type=%u (%s) version=%llu size=%lld "
255                         "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
256                         "mask=0x%x permitted=0x%x",
257                         -__entry->error, nfs_show_status(__entry->error),
258                         MAJOR(__entry->dev), MINOR(__entry->dev),
259                         (unsigned long long)__entry->fileid,
260                         __entry->fhandle,
261                         __entry->type,
262                         nfs_show_file_type(__entry->type),
263                         (unsigned long long)__entry->version,
264                         (long long)__entry->size,
265                         __entry->cache_validity,
266                         nfs_show_cache_validity(__entry->cache_validity),
267                         __entry->nfsi_flags,
268                         nfs_show_nfsi_flags(__entry->nfsi_flags),
269                         __entry->mask, __entry->permitted
270                 )
271 );
272
273 TRACE_DEFINE_ENUM(LOOKUP_FOLLOW);
274 TRACE_DEFINE_ENUM(LOOKUP_DIRECTORY);
275 TRACE_DEFINE_ENUM(LOOKUP_AUTOMOUNT);
276 TRACE_DEFINE_ENUM(LOOKUP_PARENT);
277 TRACE_DEFINE_ENUM(LOOKUP_REVAL);
278 TRACE_DEFINE_ENUM(LOOKUP_RCU);
279 TRACE_DEFINE_ENUM(LOOKUP_OPEN);
280 TRACE_DEFINE_ENUM(LOOKUP_CREATE);
281 TRACE_DEFINE_ENUM(LOOKUP_EXCL);
282 TRACE_DEFINE_ENUM(LOOKUP_RENAME_TARGET);
283 TRACE_DEFINE_ENUM(LOOKUP_JUMPED);
284 TRACE_DEFINE_ENUM(LOOKUP_ROOT);
285 TRACE_DEFINE_ENUM(LOOKUP_EMPTY);
286 TRACE_DEFINE_ENUM(LOOKUP_DOWN);
287
288 #define show_lookup_flags(flags) \
289         __print_flags(flags, "|", \
290                         { LOOKUP_FOLLOW, "FOLLOW" }, \
291                         { LOOKUP_DIRECTORY, "DIRECTORY" }, \
292                         { LOOKUP_AUTOMOUNT, "AUTOMOUNT" }, \
293                         { LOOKUP_PARENT, "PARENT" }, \
294                         { LOOKUP_REVAL, "REVAL" }, \
295                         { LOOKUP_RCU, "RCU" }, \
296                         { LOOKUP_OPEN, "OPEN" }, \
297                         { LOOKUP_CREATE, "CREATE" }, \
298                         { LOOKUP_EXCL, "EXCL" }, \
299                         { LOOKUP_RENAME_TARGET, "RENAME_TARGET" }, \
300                         { LOOKUP_JUMPED, "JUMPED" }, \
301                         { LOOKUP_ROOT, "ROOT" }, \
302                         { LOOKUP_EMPTY, "EMPTY" }, \
303                         { LOOKUP_DOWN, "DOWN" })
304
305 DECLARE_EVENT_CLASS(nfs_lookup_event,
306                 TP_PROTO(
307                         const struct inode *dir,
308                         const struct dentry *dentry,
309                         unsigned int flags
310                 ),
311
312                 TP_ARGS(dir, dentry, flags),
313
314                 TP_STRUCT__entry(
315                         __field(unsigned long, flags)
316                         __field(dev_t, dev)
317                         __field(u64, dir)
318                         __string(name, dentry->d_name.name)
319                 ),
320
321                 TP_fast_assign(
322                         __entry->dev = dir->i_sb->s_dev;
323                         __entry->dir = NFS_FILEID(dir);
324                         __entry->flags = flags;
325                         __assign_str(name, dentry->d_name.name);
326                 ),
327
328                 TP_printk(
329                         "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
330                         __entry->flags,
331                         show_lookup_flags(__entry->flags),
332                         MAJOR(__entry->dev), MINOR(__entry->dev),
333                         (unsigned long long)__entry->dir,
334                         __get_str(name)
335                 )
336 );
337
338 #define DEFINE_NFS_LOOKUP_EVENT(name) \
339         DEFINE_EVENT(nfs_lookup_event, name, \
340                         TP_PROTO( \
341                                 const struct inode *dir, \
342                                 const struct dentry *dentry, \
343                                 unsigned int flags \
344                         ), \
345                         TP_ARGS(dir, dentry, flags))
346
347 DECLARE_EVENT_CLASS(nfs_lookup_event_done,
348                 TP_PROTO(
349                         const struct inode *dir,
350                         const struct dentry *dentry,
351                         unsigned int flags,
352                         int error
353                 ),
354
355                 TP_ARGS(dir, dentry, flags, error),
356
357                 TP_STRUCT__entry(
358                         __field(unsigned long, error)
359                         __field(unsigned long, flags)
360                         __field(dev_t, dev)
361                         __field(u64, dir)
362                         __string(name, dentry->d_name.name)
363                 ),
364
365                 TP_fast_assign(
366                         __entry->dev = dir->i_sb->s_dev;
367                         __entry->dir = NFS_FILEID(dir);
368                         __entry->error = error < 0 ? -error : 0;
369                         __entry->flags = flags;
370                         __assign_str(name, dentry->d_name.name);
371                 ),
372
373                 TP_printk(
374                         "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
375                         -__entry->error, nfs_show_status(__entry->error),
376                         __entry->flags,
377                         show_lookup_flags(__entry->flags),
378                         MAJOR(__entry->dev), MINOR(__entry->dev),
379                         (unsigned long long)__entry->dir,
380                         __get_str(name)
381                 )
382 );
383
384 #define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
385         DEFINE_EVENT(nfs_lookup_event_done, name, \
386                         TP_PROTO( \
387                                 const struct inode *dir, \
388                                 const struct dentry *dentry, \
389                                 unsigned int flags, \
390                                 int error \
391                         ), \
392                         TP_ARGS(dir, dentry, flags, error))
393
394 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
395 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
396 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
397 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
398
399 TRACE_DEFINE_ENUM(O_WRONLY);
400 TRACE_DEFINE_ENUM(O_RDWR);
401 TRACE_DEFINE_ENUM(O_CREAT);
402 TRACE_DEFINE_ENUM(O_EXCL);
403 TRACE_DEFINE_ENUM(O_NOCTTY);
404 TRACE_DEFINE_ENUM(O_TRUNC);
405 TRACE_DEFINE_ENUM(O_APPEND);
406 TRACE_DEFINE_ENUM(O_NONBLOCK);
407 TRACE_DEFINE_ENUM(O_DSYNC);
408 TRACE_DEFINE_ENUM(O_DIRECT);
409 TRACE_DEFINE_ENUM(O_LARGEFILE);
410 TRACE_DEFINE_ENUM(O_DIRECTORY);
411 TRACE_DEFINE_ENUM(O_NOFOLLOW);
412 TRACE_DEFINE_ENUM(O_NOATIME);
413 TRACE_DEFINE_ENUM(O_CLOEXEC);
414
415 #define show_open_flags(flags) \
416         __print_flags(flags, "|", \
417                 { O_WRONLY, "O_WRONLY" }, \
418                 { O_RDWR, "O_RDWR" }, \
419                 { O_CREAT, "O_CREAT" }, \
420                 { O_EXCL, "O_EXCL" }, \
421                 { O_NOCTTY, "O_NOCTTY" }, \
422                 { O_TRUNC, "O_TRUNC" }, \
423                 { O_APPEND, "O_APPEND" }, \
424                 { O_NONBLOCK, "O_NONBLOCK" }, \
425                 { O_DSYNC, "O_DSYNC" }, \
426                 { O_DIRECT, "O_DIRECT" }, \
427                 { O_LARGEFILE, "O_LARGEFILE" }, \
428                 { O_DIRECTORY, "O_DIRECTORY" }, \
429                 { O_NOFOLLOW, "O_NOFOLLOW" }, \
430                 { O_NOATIME, "O_NOATIME" }, \
431                 { O_CLOEXEC, "O_CLOEXEC" })
432
433 TRACE_DEFINE_ENUM(FMODE_READ);
434 TRACE_DEFINE_ENUM(FMODE_WRITE);
435 TRACE_DEFINE_ENUM(FMODE_EXEC);
436
437 #define show_fmode_flags(mode) \
438         __print_flags(mode, "|", \
439                 { ((__force unsigned long)FMODE_READ), "READ" }, \
440                 { ((__force unsigned long)FMODE_WRITE), "WRITE" }, \
441                 { ((__force unsigned long)FMODE_EXEC), "EXEC" })
442
443 TRACE_EVENT(nfs_atomic_open_enter,
444                 TP_PROTO(
445                         const struct inode *dir,
446                         const struct nfs_open_context *ctx,
447                         unsigned int flags
448                 ),
449
450                 TP_ARGS(dir, ctx, flags),
451
452                 TP_STRUCT__entry(
453                         __field(unsigned long, flags)
454                         __field(unsigned int, fmode)
455                         __field(dev_t, dev)
456                         __field(u64, dir)
457                         __string(name, ctx->dentry->d_name.name)
458                 ),
459
460                 TP_fast_assign(
461                         __entry->dev = dir->i_sb->s_dev;
462                         __entry->dir = NFS_FILEID(dir);
463                         __entry->flags = flags;
464                         __entry->fmode = (__force unsigned int)ctx->mode;
465                         __assign_str(name, ctx->dentry->d_name.name);
466                 ),
467
468                 TP_printk(
469                         "flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
470                         __entry->flags,
471                         show_open_flags(__entry->flags),
472                         show_fmode_flags(__entry->fmode),
473                         MAJOR(__entry->dev), MINOR(__entry->dev),
474                         (unsigned long long)__entry->dir,
475                         __get_str(name)
476                 )
477 );
478
479 TRACE_EVENT(nfs_atomic_open_exit,
480                 TP_PROTO(
481                         const struct inode *dir,
482                         const struct nfs_open_context *ctx,
483                         unsigned int flags,
484                         int error
485                 ),
486
487                 TP_ARGS(dir, ctx, flags, error),
488
489                 TP_STRUCT__entry(
490                         __field(unsigned long, error)
491                         __field(unsigned long, flags)
492                         __field(unsigned int, fmode)
493                         __field(dev_t, dev)
494                         __field(u64, dir)
495                         __string(name, ctx->dentry->d_name.name)
496                 ),
497
498                 TP_fast_assign(
499                         __entry->error = -error;
500                         __entry->dev = dir->i_sb->s_dev;
501                         __entry->dir = NFS_FILEID(dir);
502                         __entry->flags = flags;
503                         __entry->fmode = (__force unsigned int)ctx->mode;
504                         __assign_str(name, ctx->dentry->d_name.name);
505                 ),
506
507                 TP_printk(
508                         "error=%ld (%s) flags=0x%lx (%s) fmode=%s "
509                         "name=%02x:%02x:%llu/%s",
510                         -__entry->error, nfs_show_status(__entry->error),
511                         __entry->flags,
512                         show_open_flags(__entry->flags),
513                         show_fmode_flags(__entry->fmode),
514                         MAJOR(__entry->dev), MINOR(__entry->dev),
515                         (unsigned long long)__entry->dir,
516                         __get_str(name)
517                 )
518 );
519
520 TRACE_EVENT(nfs_create_enter,
521                 TP_PROTO(
522                         const struct inode *dir,
523                         const struct dentry *dentry,
524                         unsigned int flags
525                 ),
526
527                 TP_ARGS(dir, dentry, flags),
528
529                 TP_STRUCT__entry(
530                         __field(unsigned long, flags)
531                         __field(dev_t, dev)
532                         __field(u64, dir)
533                         __string(name, dentry->d_name.name)
534                 ),
535
536                 TP_fast_assign(
537                         __entry->dev = dir->i_sb->s_dev;
538                         __entry->dir = NFS_FILEID(dir);
539                         __entry->flags = flags;
540                         __assign_str(name, dentry->d_name.name);
541                 ),
542
543                 TP_printk(
544                         "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
545                         __entry->flags,
546                         show_open_flags(__entry->flags),
547                         MAJOR(__entry->dev), MINOR(__entry->dev),
548                         (unsigned long long)__entry->dir,
549                         __get_str(name)
550                 )
551 );
552
553 TRACE_EVENT(nfs_create_exit,
554                 TP_PROTO(
555                         const struct inode *dir,
556                         const struct dentry *dentry,
557                         unsigned int flags,
558                         int error
559                 ),
560
561                 TP_ARGS(dir, dentry, flags, error),
562
563                 TP_STRUCT__entry(
564                         __field(unsigned long, error)
565                         __field(unsigned long, flags)
566                         __field(dev_t, dev)
567                         __field(u64, dir)
568                         __string(name, dentry->d_name.name)
569                 ),
570
571                 TP_fast_assign(
572                         __entry->error = -error;
573                         __entry->dev = dir->i_sb->s_dev;
574                         __entry->dir = NFS_FILEID(dir);
575                         __entry->flags = flags;
576                         __assign_str(name, dentry->d_name.name);
577                 ),
578
579                 TP_printk(
580                         "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
581                         -__entry->error, nfs_show_status(__entry->error),
582                         __entry->flags,
583                         show_open_flags(__entry->flags),
584                         MAJOR(__entry->dev), MINOR(__entry->dev),
585                         (unsigned long long)__entry->dir,
586                         __get_str(name)
587                 )
588 );
589
590 DECLARE_EVENT_CLASS(nfs_directory_event,
591                 TP_PROTO(
592                         const struct inode *dir,
593                         const struct dentry *dentry
594                 ),
595
596                 TP_ARGS(dir, dentry),
597
598                 TP_STRUCT__entry(
599                         __field(dev_t, dev)
600                         __field(u64, dir)
601                         __string(name, dentry->d_name.name)
602                 ),
603
604                 TP_fast_assign(
605                         __entry->dev = dir->i_sb->s_dev;
606                         __entry->dir = NFS_FILEID(dir);
607                         __assign_str(name, dentry->d_name.name);
608                 ),
609
610                 TP_printk(
611                         "name=%02x:%02x:%llu/%s",
612                         MAJOR(__entry->dev), MINOR(__entry->dev),
613                         (unsigned long long)__entry->dir,
614                         __get_str(name)
615                 )
616 );
617
618 #define DEFINE_NFS_DIRECTORY_EVENT(name) \
619         DEFINE_EVENT(nfs_directory_event, name, \
620                         TP_PROTO( \
621                                 const struct inode *dir, \
622                                 const struct dentry *dentry \
623                         ), \
624                         TP_ARGS(dir, dentry))
625
626 DECLARE_EVENT_CLASS(nfs_directory_event_done,
627                 TP_PROTO(
628                         const struct inode *dir,
629                         const struct dentry *dentry,
630                         int error
631                 ),
632
633                 TP_ARGS(dir, dentry, error),
634
635                 TP_STRUCT__entry(
636                         __field(unsigned long, error)
637                         __field(dev_t, dev)
638                         __field(u64, dir)
639                         __string(name, dentry->d_name.name)
640                 ),
641
642                 TP_fast_assign(
643                         __entry->dev = dir->i_sb->s_dev;
644                         __entry->dir = NFS_FILEID(dir);
645                         __entry->error = error < 0 ? -error : 0;
646                         __assign_str(name, dentry->d_name.name);
647                 ),
648
649                 TP_printk(
650                         "error=%ld (%s) name=%02x:%02x:%llu/%s",
651                         -__entry->error, nfs_show_status(__entry->error),
652                         MAJOR(__entry->dev), MINOR(__entry->dev),
653                         (unsigned long long)__entry->dir,
654                         __get_str(name)
655                 )
656 );
657
658 #define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
659         DEFINE_EVENT(nfs_directory_event_done, name, \
660                         TP_PROTO( \
661                                 const struct inode *dir, \
662                                 const struct dentry *dentry, \
663                                 int error \
664                         ), \
665                         TP_ARGS(dir, dentry, error))
666
667 DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
668 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
669 DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
670 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
671 DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
672 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
673 DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
674 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
675 DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
676 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
677 DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
678 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
679
680 TRACE_EVENT(nfs_link_enter,
681                 TP_PROTO(
682                         const struct inode *inode,
683                         const struct inode *dir,
684                         const struct dentry *dentry
685                 ),
686
687                 TP_ARGS(inode, dir, dentry),
688
689                 TP_STRUCT__entry(
690                         __field(dev_t, dev)
691                         __field(u64, fileid)
692                         __field(u64, dir)
693                         __string(name, dentry->d_name.name)
694                 ),
695
696                 TP_fast_assign(
697                         __entry->dev = inode->i_sb->s_dev;
698                         __entry->fileid = NFS_FILEID(inode);
699                         __entry->dir = NFS_FILEID(dir);
700                         __assign_str(name, dentry->d_name.name);
701                 ),
702
703                 TP_printk(
704                         "fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
705                         MAJOR(__entry->dev), MINOR(__entry->dev),
706                         __entry->fileid,
707                         MAJOR(__entry->dev), MINOR(__entry->dev),
708                         (unsigned long long)__entry->dir,
709                         __get_str(name)
710                 )
711 );
712
713 TRACE_EVENT(nfs_link_exit,
714                 TP_PROTO(
715                         const struct inode *inode,
716                         const struct inode *dir,
717                         const struct dentry *dentry,
718                         int error
719                 ),
720
721                 TP_ARGS(inode, dir, dentry, error),
722
723                 TP_STRUCT__entry(
724                         __field(unsigned long, error)
725                         __field(dev_t, dev)
726                         __field(u64, fileid)
727                         __field(u64, dir)
728                         __string(name, dentry->d_name.name)
729                 ),
730
731                 TP_fast_assign(
732                         __entry->dev = inode->i_sb->s_dev;
733                         __entry->fileid = NFS_FILEID(inode);
734                         __entry->dir = NFS_FILEID(dir);
735                         __entry->error = error < 0 ? -error : 0;
736                         __assign_str(name, dentry->d_name.name);
737                 ),
738
739                 TP_printk(
740                         "error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
741                         -__entry->error, nfs_show_status(__entry->error),
742                         MAJOR(__entry->dev), MINOR(__entry->dev),
743                         __entry->fileid,
744                         MAJOR(__entry->dev), MINOR(__entry->dev),
745                         (unsigned long long)__entry->dir,
746                         __get_str(name)
747                 )
748 );
749
750 DECLARE_EVENT_CLASS(nfs_rename_event,
751                 TP_PROTO(
752                         const struct inode *old_dir,
753                         const struct dentry *old_dentry,
754                         const struct inode *new_dir,
755                         const struct dentry *new_dentry
756                 ),
757
758                 TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
759
760                 TP_STRUCT__entry(
761                         __field(dev_t, dev)
762                         __field(u64, old_dir)
763                         __field(u64, new_dir)
764                         __string(old_name, old_dentry->d_name.name)
765                         __string(new_name, new_dentry->d_name.name)
766                 ),
767
768                 TP_fast_assign(
769                         __entry->dev = old_dir->i_sb->s_dev;
770                         __entry->old_dir = NFS_FILEID(old_dir);
771                         __entry->new_dir = NFS_FILEID(new_dir);
772                         __assign_str(old_name, old_dentry->d_name.name);
773                         __assign_str(new_name, new_dentry->d_name.name);
774                 ),
775
776                 TP_printk(
777                         "old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
778                         MAJOR(__entry->dev), MINOR(__entry->dev),
779                         (unsigned long long)__entry->old_dir,
780                         __get_str(old_name),
781                         MAJOR(__entry->dev), MINOR(__entry->dev),
782                         (unsigned long long)__entry->new_dir,
783                         __get_str(new_name)
784                 )
785 );
786 #define DEFINE_NFS_RENAME_EVENT(name) \
787         DEFINE_EVENT(nfs_rename_event, name, \
788                         TP_PROTO( \
789                                 const struct inode *old_dir, \
790                                 const struct dentry *old_dentry, \
791                                 const struct inode *new_dir, \
792                                 const struct dentry *new_dentry \
793                         ), \
794                         TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
795
796 DECLARE_EVENT_CLASS(nfs_rename_event_done,
797                 TP_PROTO(
798                         const struct inode *old_dir,
799                         const struct dentry *old_dentry,
800                         const struct inode *new_dir,
801                         const struct dentry *new_dentry,
802                         int error
803                 ),
804
805                 TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
806
807                 TP_STRUCT__entry(
808                         __field(dev_t, dev)
809                         __field(unsigned long, error)
810                         __field(u64, old_dir)
811                         __string(old_name, old_dentry->d_name.name)
812                         __field(u64, new_dir)
813                         __string(new_name, new_dentry->d_name.name)
814                 ),
815
816                 TP_fast_assign(
817                         __entry->dev = old_dir->i_sb->s_dev;
818                         __entry->error = -error;
819                         __entry->old_dir = NFS_FILEID(old_dir);
820                         __entry->new_dir = NFS_FILEID(new_dir);
821                         __assign_str(old_name, old_dentry->d_name.name);
822                         __assign_str(new_name, new_dentry->d_name.name);
823                 ),
824
825                 TP_printk(
826                         "error=%ld (%s) old_name=%02x:%02x:%llu/%s "
827                         "new_name=%02x:%02x:%llu/%s",
828                         -__entry->error, nfs_show_status(__entry->error),
829                         MAJOR(__entry->dev), MINOR(__entry->dev),
830                         (unsigned long long)__entry->old_dir,
831                         __get_str(old_name),
832                         MAJOR(__entry->dev), MINOR(__entry->dev),
833                         (unsigned long long)__entry->new_dir,
834                         __get_str(new_name)
835                 )
836 );
837 #define DEFINE_NFS_RENAME_EVENT_DONE(name) \
838         DEFINE_EVENT(nfs_rename_event_done, name, \
839                         TP_PROTO( \
840                                 const struct inode *old_dir, \
841                                 const struct dentry *old_dentry, \
842                                 const struct inode *new_dir, \
843                                 const struct dentry *new_dentry, \
844                                 int error \
845                         ), \
846                         TP_ARGS(old_dir, old_dentry, new_dir, \
847                                 new_dentry, error))
848
849 DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
850 DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
851
852 DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
853
854 TRACE_EVENT(nfs_sillyrename_unlink,
855                 TP_PROTO(
856                         const struct nfs_unlinkdata *data,
857                         int error
858                 ),
859
860                 TP_ARGS(data, error),
861
862                 TP_STRUCT__entry(
863                         __field(dev_t, dev)
864                         __field(unsigned long, error)
865                         __field(u64, dir)
866                         __dynamic_array(char, name, data->args.name.len + 1)
867                 ),
868
869                 TP_fast_assign(
870                         struct inode *dir = d_inode(data->dentry->d_parent);
871                         size_t len = data->args.name.len;
872                         __entry->dev = dir->i_sb->s_dev;
873                         __entry->dir = NFS_FILEID(dir);
874                         __entry->error = -error;
875                         memcpy(__get_str(name),
876                                 data->args.name.name, len);
877                         __get_str(name)[len] = 0;
878                 ),
879
880                 TP_printk(
881                         "error=%ld (%s) name=%02x:%02x:%llu/%s",
882                         -__entry->error, nfs_show_status(__entry->error),
883                         MAJOR(__entry->dev), MINOR(__entry->dev),
884                         (unsigned long long)__entry->dir,
885                         __get_str(name)
886                 )
887 );
888
889 TRACE_EVENT(nfs_initiate_read,
890                 TP_PROTO(
891                         const struct nfs_pgio_header *hdr
892                 ),
893
894                 TP_ARGS(hdr),
895
896                 TP_STRUCT__entry(
897                         __field(dev_t, dev)
898                         __field(u32, fhandle)
899                         __field(u64, fileid)
900                         __field(loff_t, offset)
901                         __field(u32, count)
902                 ),
903
904                 TP_fast_assign(
905                         const struct inode *inode = hdr->inode;
906                         const struct nfs_inode *nfsi = NFS_I(inode);
907                         const struct nfs_fh *fh = hdr->args.fh ?
908                                                   hdr->args.fh : &nfsi->fh;
909
910                         __entry->offset = hdr->args.offset;
911                         __entry->count = hdr->args.count;
912                         __entry->dev = inode->i_sb->s_dev;
913                         __entry->fileid = nfsi->fileid;
914                         __entry->fhandle = nfs_fhandle_hash(fh);
915                 ),
916
917                 TP_printk(
918                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
919                         "offset=%lld count=%u",
920                         MAJOR(__entry->dev), MINOR(__entry->dev),
921                         (unsigned long long)__entry->fileid,
922                         __entry->fhandle,
923                         (long long)__entry->offset, __entry->count
924                 )
925 );
926
927 TRACE_EVENT(nfs_readpage_done,
928                 TP_PROTO(
929                         const struct rpc_task *task,
930                         const struct nfs_pgio_header *hdr
931                 ),
932
933                 TP_ARGS(task, hdr),
934
935                 TP_STRUCT__entry(
936                         __field(dev_t, dev)
937                         __field(u32, fhandle)
938                         __field(u64, fileid)
939                         __field(loff_t, offset)
940                         __field(u32, arg_count)
941                         __field(u32, res_count)
942                         __field(bool, eof)
943                         __field(int, status)
944                 ),
945
946                 TP_fast_assign(
947                         const struct inode *inode = hdr->inode;
948                         const struct nfs_inode *nfsi = NFS_I(inode);
949                         const struct nfs_fh *fh = hdr->args.fh ?
950                                                   hdr->args.fh : &nfsi->fh;
951
952                         __entry->status = task->tk_status;
953                         __entry->offset = hdr->args.offset;
954                         __entry->arg_count = hdr->args.count;
955                         __entry->res_count = hdr->res.count;
956                         __entry->eof = hdr->res.eof;
957                         __entry->dev = inode->i_sb->s_dev;
958                         __entry->fileid = nfsi->fileid;
959                         __entry->fhandle = nfs_fhandle_hash(fh);
960                 ),
961
962                 TP_printk(
963                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
964                         "offset=%lld count=%u res=%u status=%d%s",
965                         MAJOR(__entry->dev), MINOR(__entry->dev),
966                         (unsigned long long)__entry->fileid,
967                         __entry->fhandle,
968                         (long long)__entry->offset, __entry->arg_count,
969                         __entry->res_count, __entry->status,
970                         __entry->eof ? " eof" : ""
971                 )
972 );
973
974 TRACE_EVENT(nfs_readpage_short,
975                 TP_PROTO(
976                         const struct rpc_task *task,
977                         const struct nfs_pgio_header *hdr
978                 ),
979
980                 TP_ARGS(task, hdr),
981
982                 TP_STRUCT__entry(
983                         __field(dev_t, dev)
984                         __field(u32, fhandle)
985                         __field(u64, fileid)
986                         __field(loff_t, offset)
987                         __field(u32, arg_count)
988                         __field(u32, res_count)
989                         __field(bool, eof)
990                         __field(int, status)
991                 ),
992
993                 TP_fast_assign(
994                         const struct inode *inode = hdr->inode;
995                         const struct nfs_inode *nfsi = NFS_I(inode);
996                         const struct nfs_fh *fh = hdr->args.fh ?
997                                                   hdr->args.fh : &nfsi->fh;
998
999                         __entry->status = task->tk_status;
1000                         __entry->offset = hdr->args.offset;
1001                         __entry->arg_count = hdr->args.count;
1002                         __entry->res_count = hdr->res.count;
1003                         __entry->eof = hdr->res.eof;
1004                         __entry->dev = inode->i_sb->s_dev;
1005                         __entry->fileid = nfsi->fileid;
1006                         __entry->fhandle = nfs_fhandle_hash(fh);
1007                 ),
1008
1009                 TP_printk(
1010                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
1011                         "offset=%lld count=%u res=%u status=%d%s",
1012                         MAJOR(__entry->dev), MINOR(__entry->dev),
1013                         (unsigned long long)__entry->fileid,
1014                         __entry->fhandle,
1015                         (long long)__entry->offset, __entry->arg_count,
1016                         __entry->res_count, __entry->status,
1017                         __entry->eof ? " eof" : ""
1018                 )
1019 );
1020
1021 TRACE_EVENT(nfs_pgio_error,
1022         TP_PROTO(
1023                 const struct nfs_pgio_header *hdr,
1024                 int error,
1025                 loff_t pos
1026         ),
1027
1028         TP_ARGS(hdr, error, pos),
1029
1030         TP_STRUCT__entry(
1031                 __field(dev_t, dev)
1032                 __field(u32, fhandle)
1033                 __field(u64, fileid)
1034                 __field(loff_t, offset)
1035                 __field(u32, arg_count)
1036                 __field(u32, res_count)
1037                 __field(loff_t, pos)
1038                 __field(int, status)
1039         ),
1040
1041         TP_fast_assign(
1042                 const struct inode *inode = hdr->inode;
1043                 const struct nfs_inode *nfsi = NFS_I(inode);
1044                 const struct nfs_fh *fh = hdr->args.fh ?
1045                                           hdr->args.fh : &nfsi->fh;
1046
1047                 __entry->status = error;
1048                 __entry->offset = hdr->args.offset;
1049                 __entry->arg_count = hdr->args.count;
1050                 __entry->res_count = hdr->res.count;
1051                 __entry->dev = inode->i_sb->s_dev;
1052                 __entry->fileid = nfsi->fileid;
1053                 __entry->fhandle = nfs_fhandle_hash(fh);
1054         ),
1055
1056         TP_printk("fileid=%02x:%02x:%llu fhandle=0x%08x "
1057                   "offset=%lld count=%u res=%u pos=%llu status=%d",
1058                 MAJOR(__entry->dev), MINOR(__entry->dev),
1059                 (unsigned long long)__entry->fileid, __entry->fhandle,
1060                 (long long)__entry->offset, __entry->arg_count, __entry->res_count,
1061                 __entry->pos, __entry->status
1062         )
1063 );
1064
1065 TRACE_DEFINE_ENUM(NFS_UNSTABLE);
1066 TRACE_DEFINE_ENUM(NFS_DATA_SYNC);
1067 TRACE_DEFINE_ENUM(NFS_FILE_SYNC);
1068
1069 #define nfs_show_stable(stable) \
1070         __print_symbolic(stable, \
1071                         { NFS_UNSTABLE, "UNSTABLE" }, \
1072                         { NFS_DATA_SYNC, "DATA_SYNC" }, \
1073                         { NFS_FILE_SYNC, "FILE_SYNC" })
1074
1075 TRACE_EVENT(nfs_initiate_write,
1076                 TP_PROTO(
1077                         const struct nfs_pgio_header *hdr
1078                 ),
1079
1080                 TP_ARGS(hdr),
1081
1082                 TP_STRUCT__entry(
1083                         __field(dev_t, dev)
1084                         __field(u32, fhandle)
1085                         __field(u64, fileid)
1086                         __field(loff_t, offset)
1087                         __field(u32, count)
1088                         __field(enum nfs3_stable_how, stable)
1089                 ),
1090
1091                 TP_fast_assign(
1092                         const struct inode *inode = hdr->inode;
1093                         const struct nfs_inode *nfsi = NFS_I(inode);
1094                         const struct nfs_fh *fh = hdr->args.fh ?
1095                                                   hdr->args.fh : &nfsi->fh;
1096
1097                         __entry->offset = hdr->args.offset;
1098                         __entry->count = hdr->args.count;
1099                         __entry->stable = hdr->args.stable;
1100                         __entry->dev = inode->i_sb->s_dev;
1101                         __entry->fileid = nfsi->fileid;
1102                         __entry->fhandle = nfs_fhandle_hash(fh);
1103                 ),
1104
1105                 TP_printk(
1106                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
1107                         "offset=%lld count=%u stable=%s",
1108                         MAJOR(__entry->dev), MINOR(__entry->dev),
1109                         (unsigned long long)__entry->fileid,
1110                         __entry->fhandle,
1111                         (long long)__entry->offset, __entry->count,
1112                         nfs_show_stable(__entry->stable)
1113                 )
1114 );
1115
1116 TRACE_EVENT(nfs_writeback_done,
1117                 TP_PROTO(
1118                         const struct rpc_task *task,
1119                         const struct nfs_pgio_header *hdr
1120                 ),
1121
1122                 TP_ARGS(task, hdr),
1123
1124                 TP_STRUCT__entry(
1125                         __field(dev_t, dev)
1126                         __field(u32, fhandle)
1127                         __field(u64, fileid)
1128                         __field(loff_t, offset)
1129                         __field(u32, arg_count)
1130                         __field(u32, res_count)
1131                         __field(int, status)
1132                         __field(enum nfs3_stable_how, stable)
1133                         __array(char, verifier, NFS4_VERIFIER_SIZE)
1134                 ),
1135
1136                 TP_fast_assign(
1137                         const struct inode *inode = hdr->inode;
1138                         const struct nfs_inode *nfsi = NFS_I(inode);
1139                         const struct nfs_fh *fh = hdr->args.fh ?
1140                                                   hdr->args.fh : &nfsi->fh;
1141                         const struct nfs_writeverf *verf = hdr->res.verf;
1142
1143                         __entry->status = task->tk_status;
1144                         __entry->offset = hdr->args.offset;
1145                         __entry->arg_count = hdr->args.count;
1146                         __entry->res_count = hdr->res.count;
1147                         __entry->stable = verf->committed;
1148                         memcpy(__entry->verifier,
1149                                 &verf->verifier,
1150                                 NFS4_VERIFIER_SIZE);
1151                         __entry->dev = inode->i_sb->s_dev;
1152                         __entry->fileid = nfsi->fileid;
1153                         __entry->fhandle = nfs_fhandle_hash(fh);
1154                 ),
1155
1156                 TP_printk(
1157                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
1158                         "offset=%lld count=%u res=%u status=%d stable=%s "
1159                         "verifier=%s",
1160                         MAJOR(__entry->dev), MINOR(__entry->dev),
1161                         (unsigned long long)__entry->fileid,
1162                         __entry->fhandle,
1163                         (long long)__entry->offset, __entry->arg_count,
1164                         __entry->res_count, __entry->status,
1165                         nfs_show_stable(__entry->stable),
1166                         __print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
1167                 )
1168 );
1169
1170 DECLARE_EVENT_CLASS(nfs_page_error_class,
1171                 TP_PROTO(
1172                         const struct nfs_page *req,
1173                         int error
1174                 ),
1175
1176                 TP_ARGS(req, error),
1177
1178                 TP_STRUCT__entry(
1179                         __field(const void *, req)
1180                         __field(pgoff_t, index)
1181                         __field(unsigned int, offset)
1182                         __field(unsigned int, pgbase)
1183                         __field(unsigned int, bytes)
1184                         __field(int, error)
1185                 ),
1186
1187                 TP_fast_assign(
1188                         __entry->req = req;
1189                         __entry->index = req->wb_index;
1190                         __entry->offset = req->wb_offset;
1191                         __entry->pgbase = req->wb_pgbase;
1192                         __entry->bytes = req->wb_bytes;
1193                         __entry->error = error;
1194                 ),
1195
1196                 TP_printk(
1197                         "req=%p index=%lu offset=%u pgbase=%u bytes=%u error=%d",
1198                         __entry->req, __entry->index, __entry->offset,
1199                         __entry->pgbase, __entry->bytes, __entry->error
1200                 )
1201 );
1202
1203 #define DEFINE_NFS_PAGEERR_EVENT(name) \
1204         DEFINE_EVENT(nfs_page_error_class, name, \
1205                         TP_PROTO( \
1206                                 const struct nfs_page *req, \
1207                                 int error \
1208                         ), \
1209                         TP_ARGS(req, error))
1210
1211 DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
1212 DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
1213 DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
1214
1215 TRACE_EVENT(nfs_initiate_commit,
1216                 TP_PROTO(
1217                         const struct nfs_commit_data *data
1218                 ),
1219
1220                 TP_ARGS(data),
1221
1222                 TP_STRUCT__entry(
1223                         __field(dev_t, dev)
1224                         __field(u32, fhandle)
1225                         __field(u64, fileid)
1226                         __field(loff_t, offset)
1227                         __field(u32, count)
1228                 ),
1229
1230                 TP_fast_assign(
1231                         const struct inode *inode = data->inode;
1232                         const struct nfs_inode *nfsi = NFS_I(inode);
1233                         const struct nfs_fh *fh = data->args.fh ?
1234                                                   data->args.fh : &nfsi->fh;
1235
1236                         __entry->offset = data->args.offset;
1237                         __entry->count = data->args.count;
1238                         __entry->dev = inode->i_sb->s_dev;
1239                         __entry->fileid = nfsi->fileid;
1240                         __entry->fhandle = nfs_fhandle_hash(fh);
1241                 ),
1242
1243                 TP_printk(
1244                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
1245                         "offset=%lld count=%u",
1246                         MAJOR(__entry->dev), MINOR(__entry->dev),
1247                         (unsigned long long)__entry->fileid,
1248                         __entry->fhandle,
1249                         (long long)__entry->offset, __entry->count
1250                 )
1251 );
1252
1253 TRACE_EVENT(nfs_commit_done,
1254                 TP_PROTO(
1255                         const struct rpc_task *task,
1256                         const struct nfs_commit_data *data
1257                 ),
1258
1259                 TP_ARGS(task, data),
1260
1261                 TP_STRUCT__entry(
1262                         __field(dev_t, dev)
1263                         __field(u32, fhandle)
1264                         __field(u64, fileid)
1265                         __field(loff_t, offset)
1266                         __field(int, status)
1267                         __field(enum nfs3_stable_how, stable)
1268                         __array(char, verifier, NFS4_VERIFIER_SIZE)
1269                 ),
1270
1271                 TP_fast_assign(
1272                         const struct inode *inode = data->inode;
1273                         const struct nfs_inode *nfsi = NFS_I(inode);
1274                         const struct nfs_fh *fh = data->args.fh ?
1275                                                   data->args.fh : &nfsi->fh;
1276                         const struct nfs_writeverf *verf = data->res.verf;
1277
1278                         __entry->status = task->tk_status;
1279                         __entry->offset = data->args.offset;
1280                         __entry->stable = verf->committed;
1281                         memcpy(__entry->verifier,
1282                                 &verf->verifier,
1283                                 NFS4_VERIFIER_SIZE);
1284                         __entry->dev = inode->i_sb->s_dev;
1285                         __entry->fileid = nfsi->fileid;
1286                         __entry->fhandle = nfs_fhandle_hash(fh);
1287                 ),
1288
1289                 TP_printk(
1290                         "fileid=%02x:%02x:%llu fhandle=0x%08x "
1291                         "offset=%lld status=%d stable=%s verifier=%s",
1292                         MAJOR(__entry->dev), MINOR(__entry->dev),
1293                         (unsigned long long)__entry->fileid,
1294                         __entry->fhandle,
1295                         (long long)__entry->offset, __entry->status,
1296                         nfs_show_stable(__entry->stable),
1297                         __print_hex_str(__entry->verifier, NFS4_VERIFIER_SIZE)
1298                 )
1299 );
1300
1301 TRACE_EVENT(nfs_fh_to_dentry,
1302                 TP_PROTO(
1303                         const struct super_block *sb,
1304                         const struct nfs_fh *fh,
1305                         u64 fileid,
1306                         int error
1307                 ),
1308
1309                 TP_ARGS(sb, fh, fileid, error),
1310
1311                 TP_STRUCT__entry(
1312                         __field(int, error)
1313                         __field(dev_t, dev)
1314                         __field(u32, fhandle)
1315                         __field(u64, fileid)
1316                 ),
1317
1318                 TP_fast_assign(
1319                         __entry->error = error;
1320                         __entry->dev = sb->s_dev;
1321                         __entry->fileid = fileid;
1322                         __entry->fhandle = nfs_fhandle_hash(fh);
1323                 ),
1324
1325                 TP_printk(
1326                         "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
1327                         __entry->error,
1328                         MAJOR(__entry->dev), MINOR(__entry->dev),
1329                         (unsigned long long)__entry->fileid,
1330                         __entry->fhandle
1331                 )
1332 );
1333
1334 TRACE_DEFINE_ENUM(NFS_OK);
1335 TRACE_DEFINE_ENUM(NFSERR_PERM);
1336 TRACE_DEFINE_ENUM(NFSERR_NOENT);
1337 TRACE_DEFINE_ENUM(NFSERR_IO);
1338 TRACE_DEFINE_ENUM(NFSERR_NXIO);
1339 TRACE_DEFINE_ENUM(ECHILD);
1340 TRACE_DEFINE_ENUM(NFSERR_EAGAIN);
1341 TRACE_DEFINE_ENUM(NFSERR_ACCES);
1342 TRACE_DEFINE_ENUM(NFSERR_EXIST);
1343 TRACE_DEFINE_ENUM(NFSERR_XDEV);
1344 TRACE_DEFINE_ENUM(NFSERR_NODEV);
1345 TRACE_DEFINE_ENUM(NFSERR_NOTDIR);
1346 TRACE_DEFINE_ENUM(NFSERR_ISDIR);
1347 TRACE_DEFINE_ENUM(NFSERR_INVAL);
1348 TRACE_DEFINE_ENUM(NFSERR_FBIG);
1349 TRACE_DEFINE_ENUM(NFSERR_NOSPC);
1350 TRACE_DEFINE_ENUM(NFSERR_ROFS);
1351 TRACE_DEFINE_ENUM(NFSERR_MLINK);
1352 TRACE_DEFINE_ENUM(NFSERR_OPNOTSUPP);
1353 TRACE_DEFINE_ENUM(NFSERR_NAMETOOLONG);
1354 TRACE_DEFINE_ENUM(NFSERR_NOTEMPTY);
1355 TRACE_DEFINE_ENUM(NFSERR_DQUOT);
1356 TRACE_DEFINE_ENUM(NFSERR_STALE);
1357 TRACE_DEFINE_ENUM(NFSERR_REMOTE);
1358 TRACE_DEFINE_ENUM(NFSERR_WFLUSH);
1359 TRACE_DEFINE_ENUM(NFSERR_BADHANDLE);
1360 TRACE_DEFINE_ENUM(NFSERR_NOT_SYNC);
1361 TRACE_DEFINE_ENUM(NFSERR_BAD_COOKIE);
1362 TRACE_DEFINE_ENUM(NFSERR_NOTSUPP);
1363 TRACE_DEFINE_ENUM(NFSERR_TOOSMALL);
1364 TRACE_DEFINE_ENUM(NFSERR_SERVERFAULT);
1365 TRACE_DEFINE_ENUM(NFSERR_BADTYPE);
1366 TRACE_DEFINE_ENUM(NFSERR_JUKEBOX);
1367
1368 #define nfs_show_status(x) \
1369         __print_symbolic(x, \
1370                         { NFS_OK, "OK" }, \
1371                         { NFSERR_PERM, "PERM" }, \
1372                         { NFSERR_NOENT, "NOENT" }, \
1373                         { NFSERR_IO, "IO" }, \
1374                         { NFSERR_NXIO, "NXIO" }, \
1375                         { ECHILD, "CHILD" }, \
1376                         { NFSERR_EAGAIN, "AGAIN" }, \
1377                         { NFSERR_ACCES, "ACCES" }, \
1378                         { NFSERR_EXIST, "EXIST" }, \
1379                         { NFSERR_XDEV, "XDEV" }, \
1380                         { NFSERR_NODEV, "NODEV" }, \
1381                         { NFSERR_NOTDIR, "NOTDIR" }, \
1382                         { NFSERR_ISDIR, "ISDIR" }, \
1383                         { NFSERR_INVAL, "INVAL" }, \
1384                         { NFSERR_FBIG, "FBIG" }, \
1385                         { NFSERR_NOSPC, "NOSPC" }, \
1386                         { NFSERR_ROFS, "ROFS" }, \
1387                         { NFSERR_MLINK, "MLINK" }, \
1388                         { NFSERR_OPNOTSUPP, "OPNOTSUPP" }, \
1389                         { NFSERR_NAMETOOLONG, "NAMETOOLONG" }, \
1390                         { NFSERR_NOTEMPTY, "NOTEMPTY" }, \
1391                         { NFSERR_DQUOT, "DQUOT" }, \
1392                         { NFSERR_STALE, "STALE" }, \
1393                         { NFSERR_REMOTE, "REMOTE" }, \
1394                         { NFSERR_WFLUSH, "WFLUSH" }, \
1395                         { NFSERR_BADHANDLE, "BADHANDLE" }, \
1396                         { NFSERR_NOT_SYNC, "NOTSYNC" }, \
1397                         { NFSERR_BAD_COOKIE, "BADCOOKIE" }, \
1398                         { NFSERR_NOTSUPP, "NOTSUPP" }, \
1399                         { NFSERR_TOOSMALL, "TOOSMALL" }, \
1400                         { NFSERR_SERVERFAULT, "REMOTEIO" }, \
1401                         { NFSERR_BADTYPE, "BADTYPE" }, \
1402                         { NFSERR_JUKEBOX, "JUKEBOX" })
1403
1404 DECLARE_EVENT_CLASS(nfs_xdr_event,
1405                 TP_PROTO(
1406                         const struct xdr_stream *xdr,
1407                         int error
1408                 ),
1409
1410                 TP_ARGS(xdr, error),
1411
1412                 TP_STRUCT__entry(
1413                         __field(unsigned int, task_id)
1414                         __field(unsigned int, client_id)
1415                         __field(u32, xid)
1416                         __field(int, version)
1417                         __field(unsigned long, error)
1418                         __string(program,
1419                                  xdr->rqst->rq_task->tk_client->cl_program->name)
1420                         __string(procedure,
1421                                  xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
1422                 ),
1423
1424                 TP_fast_assign(
1425                         const struct rpc_rqst *rqstp = xdr->rqst;
1426                         const struct rpc_task *task = rqstp->rq_task;
1427
1428                         __entry->task_id = task->tk_pid;
1429                         __entry->client_id = task->tk_client->cl_clid;
1430                         __entry->xid = be32_to_cpu(rqstp->rq_xid);
1431                         __entry->version = task->tk_client->cl_vers;
1432                         __entry->error = error;
1433                         __assign_str(program,
1434                                      task->tk_client->cl_program->name)
1435                         __assign_str(procedure, task->tk_msg.rpc_proc->p_name)
1436                 ),
1437
1438                 TP_printk(
1439                         "task:%u@%d xid=0x%08x %sv%d %s error=%ld (%s)",
1440                         __entry->task_id, __entry->client_id, __entry->xid,
1441                         __get_str(program), __entry->version,
1442                         __get_str(procedure), -__entry->error,
1443                         nfs_show_status(__entry->error)
1444                 )
1445 );
1446 #define DEFINE_NFS_XDR_EVENT(name) \
1447         DEFINE_EVENT(nfs_xdr_event, name, \
1448                         TP_PROTO( \
1449                                 const struct xdr_stream *xdr, \
1450                                 int error \
1451                         ), \
1452                         TP_ARGS(xdr, error))
1453 DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
1454 DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
1455
1456 #endif /* _TRACE_NFS_H */
1457
1458 #undef TRACE_INCLUDE_PATH
1459 #define TRACE_INCLUDE_PATH .
1460 #define TRACE_INCLUDE_FILE nfstrace
1461 /* This part must be outside protection */
1462 #include <trace/define_trace.h>