Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com>
0004  */
0005 #undef TRACE_SYSTEM
0006 #define TRACE_SYSTEM nfs
0007 
0008 #if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ)
0009 #define _TRACE_NFS_H
0010 
0011 #include <linux/tracepoint.h>
0012 #include <linux/iversion.h>
0013 
0014 #include <trace/events/fs.h>
0015 #include <trace/events/nfs.h>
0016 #include <trace/events/sunrpc_base.h>
0017 
0018 #define nfs_show_cache_validity(v) \
0019     __print_flags(v, "|", \
0020             { NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
0021             { NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
0022             { NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
0023             { NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
0024             { NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
0025             { NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
0026             { NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
0027             { NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
0028             { NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
0029             { NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
0030             { NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
0031             { NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
0032             { NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
0033             { NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
0034             { NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
0035             { NFS_INO_INVALID_MODE, "INVALID_MODE" })
0036 
0037 #define nfs_show_nfsi_flags(v) \
0038     __print_flags(v, "|", \
0039             { BIT(NFS_INO_STALE), "STALE" }, \
0040             { BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
0041             { BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
0042             { BIT(NFS_INO_FSCACHE), "FSCACHE" }, \
0043             { BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
0044             { BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
0045             { BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
0046             { BIT(NFS_INO_ODIRECT), "ODIRECT" })
0047 
0048 DECLARE_EVENT_CLASS(nfs_inode_event,
0049         TP_PROTO(
0050             const struct inode *inode
0051         ),
0052 
0053         TP_ARGS(inode),
0054 
0055         TP_STRUCT__entry(
0056             __field(dev_t, dev)
0057             __field(u32, fhandle)
0058             __field(u64, fileid)
0059             __field(u64, version)
0060         ),
0061 
0062         TP_fast_assign(
0063             const struct nfs_inode *nfsi = NFS_I(inode);
0064             __entry->dev = inode->i_sb->s_dev;
0065             __entry->fileid = nfsi->fileid;
0066             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0067             __entry->version = inode_peek_iversion_raw(inode);
0068         ),
0069 
0070         TP_printk(
0071             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ",
0072             MAJOR(__entry->dev), MINOR(__entry->dev),
0073             (unsigned long long)__entry->fileid,
0074             __entry->fhandle,
0075             (unsigned long long)__entry->version
0076         )
0077 );
0078 
0079 DECLARE_EVENT_CLASS(nfs_inode_event_done,
0080         TP_PROTO(
0081             const struct inode *inode,
0082             int error
0083         ),
0084 
0085         TP_ARGS(inode, error),
0086 
0087         TP_STRUCT__entry(
0088             __field(unsigned long, error)
0089             __field(dev_t, dev)
0090             __field(u32, fhandle)
0091             __field(unsigned char, type)
0092             __field(u64, fileid)
0093             __field(u64, version)
0094             __field(loff_t, size)
0095             __field(unsigned long, nfsi_flags)
0096             __field(unsigned long, cache_validity)
0097         ),
0098 
0099         TP_fast_assign(
0100             const struct nfs_inode *nfsi = NFS_I(inode);
0101             __entry->error = error < 0 ? -error : 0;
0102             __entry->dev = inode->i_sb->s_dev;
0103             __entry->fileid = nfsi->fileid;
0104             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0105             __entry->type = nfs_umode_to_dtype(inode->i_mode);
0106             __entry->version = inode_peek_iversion_raw(inode);
0107             __entry->size = i_size_read(inode);
0108             __entry->nfsi_flags = nfsi->flags;
0109             __entry->cache_validity = nfsi->cache_validity;
0110         ),
0111 
0112         TP_printk(
0113             "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
0114             "type=%u (%s) version=%llu size=%lld "
0115             "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
0116             -__entry->error, show_nfs_status(__entry->error),
0117             MAJOR(__entry->dev), MINOR(__entry->dev),
0118             (unsigned long long)__entry->fileid,
0119             __entry->fhandle,
0120             __entry->type,
0121             show_fs_dirent_type(__entry->type),
0122             (unsigned long long)__entry->version,
0123             (long long)__entry->size,
0124             __entry->cache_validity,
0125             nfs_show_cache_validity(__entry->cache_validity),
0126             __entry->nfsi_flags,
0127             nfs_show_nfsi_flags(__entry->nfsi_flags)
0128         )
0129 );
0130 
0131 #define DEFINE_NFS_INODE_EVENT(name) \
0132     DEFINE_EVENT(nfs_inode_event, name, \
0133             TP_PROTO( \
0134                 const struct inode *inode \
0135             ), \
0136             TP_ARGS(inode))
0137 #define DEFINE_NFS_INODE_EVENT_DONE(name) \
0138     DEFINE_EVENT(nfs_inode_event_done, name, \
0139             TP_PROTO( \
0140                 const struct inode *inode, \
0141                 int error \
0142             ), \
0143             TP_ARGS(inode, error))
0144 DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
0145 DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
0146 DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
0147 DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
0148 DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
0149 DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
0150 DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
0151 DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
0152 DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
0153 DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
0154 DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
0155 DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter);
0156 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit);
0157 DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
0158 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
0159 DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
0160 DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
0161 DEFINE_NFS_INODE_EVENT(nfs_access_enter);
0162 DEFINE_NFS_INODE_EVENT_DONE(nfs_set_cache_invalid);
0163 DEFINE_NFS_INODE_EVENT(nfs_readdir_force_readdirplus);
0164 DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_cache_fill_done);
0165 DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_uncached_done);
0166 
0167 TRACE_EVENT(nfs_access_exit,
0168         TP_PROTO(
0169             const struct inode *inode,
0170             unsigned int mask,
0171             unsigned int permitted,
0172             int error
0173         ),
0174 
0175         TP_ARGS(inode, mask, permitted, error),
0176 
0177         TP_STRUCT__entry(
0178             __field(unsigned long, error)
0179             __field(dev_t, dev)
0180             __field(u32, fhandle)
0181             __field(unsigned char, type)
0182             __field(u64, fileid)
0183             __field(u64, version)
0184             __field(loff_t, size)
0185             __field(unsigned long, nfsi_flags)
0186             __field(unsigned long, cache_validity)
0187             __field(unsigned int, mask)
0188             __field(unsigned int, permitted)
0189         ),
0190 
0191         TP_fast_assign(
0192             const struct nfs_inode *nfsi = NFS_I(inode);
0193             __entry->error = error < 0 ? -error : 0;
0194             __entry->dev = inode->i_sb->s_dev;
0195             __entry->fileid = nfsi->fileid;
0196             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0197             __entry->type = nfs_umode_to_dtype(inode->i_mode);
0198             __entry->version = inode_peek_iversion_raw(inode);
0199             __entry->size = i_size_read(inode);
0200             __entry->nfsi_flags = nfsi->flags;
0201             __entry->cache_validity = nfsi->cache_validity;
0202             __entry->mask = mask;
0203             __entry->permitted = permitted;
0204         ),
0205 
0206         TP_printk(
0207             "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
0208             "type=%u (%s) version=%llu size=%lld "
0209             "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
0210             "mask=0x%x permitted=0x%x",
0211             -__entry->error, show_nfs_status(__entry->error),
0212             MAJOR(__entry->dev), MINOR(__entry->dev),
0213             (unsigned long long)__entry->fileid,
0214             __entry->fhandle,
0215             __entry->type,
0216             show_fs_dirent_type(__entry->type),
0217             (unsigned long long)__entry->version,
0218             (long long)__entry->size,
0219             __entry->cache_validity,
0220             nfs_show_cache_validity(__entry->cache_validity),
0221             __entry->nfsi_flags,
0222             nfs_show_nfsi_flags(__entry->nfsi_flags),
0223             __entry->mask, __entry->permitted
0224         )
0225 );
0226 
0227 DECLARE_EVENT_CLASS(nfs_update_size_class,
0228         TP_PROTO(
0229             const struct inode *inode,
0230             loff_t new_size
0231         ),
0232 
0233         TP_ARGS(inode, new_size),
0234 
0235         TP_STRUCT__entry(
0236             __field(dev_t, dev)
0237             __field(u32, fhandle)
0238             __field(u64, fileid)
0239             __field(u64, version)
0240             __field(loff_t, cur_size)
0241             __field(loff_t, new_size)
0242         ),
0243 
0244         TP_fast_assign(
0245             const struct nfs_inode *nfsi = NFS_I(inode);
0246 
0247             __entry->dev = inode->i_sb->s_dev;
0248             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0249             __entry->fileid = nfsi->fileid;
0250             __entry->version = inode_peek_iversion_raw(inode);
0251             __entry->cur_size = i_size_read(inode);
0252             __entry->new_size = new_size;
0253         ),
0254 
0255         TP_printk(
0256             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cursize=%lld newsize=%lld",
0257             MAJOR(__entry->dev), MINOR(__entry->dev),
0258             (unsigned long long)__entry->fileid,
0259             __entry->fhandle, __entry->version,
0260             __entry->cur_size, __entry->new_size
0261         )
0262 );
0263 
0264 #define DEFINE_NFS_UPDATE_SIZE_EVENT(name) \
0265     DEFINE_EVENT(nfs_update_size_class, nfs_size_##name, \
0266             TP_PROTO( \
0267                 const struct inode *inode, \
0268                 loff_t new_size \
0269             ), \
0270             TP_ARGS(inode, new_size))
0271 
0272 DEFINE_NFS_UPDATE_SIZE_EVENT(truncate);
0273 DEFINE_NFS_UPDATE_SIZE_EVENT(wcc);
0274 DEFINE_NFS_UPDATE_SIZE_EVENT(update);
0275 DEFINE_NFS_UPDATE_SIZE_EVENT(grow);
0276 
0277 DECLARE_EVENT_CLASS(nfs_inode_range_event,
0278         TP_PROTO(
0279             const struct inode *inode,
0280             loff_t range_start,
0281             loff_t range_end
0282         ),
0283 
0284         TP_ARGS(inode, range_start, range_end),
0285 
0286         TP_STRUCT__entry(
0287             __field(dev_t, dev)
0288             __field(u32, fhandle)
0289             __field(u64, fileid)
0290             __field(u64, version)
0291             __field(loff_t, range_start)
0292             __field(loff_t, range_end)
0293         ),
0294 
0295         TP_fast_assign(
0296             const struct nfs_inode *nfsi = NFS_I(inode);
0297 
0298             __entry->dev = inode->i_sb->s_dev;
0299             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0300             __entry->fileid = nfsi->fileid;
0301             __entry->version = inode_peek_iversion_raw(inode);
0302             __entry->range_start = range_start;
0303             __entry->range_end = range_end;
0304         ),
0305 
0306         TP_printk(
0307             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
0308             "range=[%lld, %lld]",
0309             MAJOR(__entry->dev), MINOR(__entry->dev),
0310             (unsigned long long)__entry->fileid,
0311             __entry->fhandle, __entry->version,
0312             __entry->range_start, __entry->range_end
0313         )
0314 );
0315 
0316 #define DEFINE_NFS_INODE_RANGE_EVENT(name) \
0317     DEFINE_EVENT(nfs_inode_range_event, name, \
0318             TP_PROTO( \
0319                 const struct inode *inode, \
0320                 loff_t range_start, \
0321                 loff_t range_end \
0322             ), \
0323             TP_ARGS(inode, range_start, range_end))
0324 
0325 DEFINE_NFS_INODE_RANGE_EVENT(nfs_readdir_invalidate_cache_range);
0326 
0327 DECLARE_EVENT_CLASS(nfs_readdir_event,
0328         TP_PROTO(
0329             const struct file *file,
0330             const __be32 *verifier,
0331             u64 cookie,
0332             pgoff_t page_index,
0333             unsigned int dtsize
0334         ),
0335 
0336         TP_ARGS(file, verifier, cookie, page_index, dtsize),
0337 
0338         TP_STRUCT__entry(
0339             __field(dev_t, dev)
0340             __field(u32, fhandle)
0341             __field(u64, fileid)
0342             __field(u64, version)
0343             __array(char, verifier, NFS4_VERIFIER_SIZE)
0344             __field(u64, cookie)
0345             __field(pgoff_t, index)
0346             __field(unsigned int, dtsize)
0347         ),
0348 
0349         TP_fast_assign(
0350             const struct inode *dir = file_inode(file);
0351             const struct nfs_inode *nfsi = NFS_I(dir);
0352 
0353             __entry->dev = dir->i_sb->s_dev;
0354             __entry->fileid = nfsi->fileid;
0355             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0356             __entry->version = inode_peek_iversion_raw(dir);
0357             if (cookie != 0)
0358                 memcpy(__entry->verifier, verifier,
0359                        NFS4_VERIFIER_SIZE);
0360             else
0361                 memset(__entry->verifier, 0,
0362                        NFS4_VERIFIER_SIZE);
0363             __entry->cookie = cookie;
0364             __entry->index = page_index;
0365             __entry->dtsize = dtsize;
0366         ),
0367 
0368         TP_printk(
0369             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
0370             "cookie=%s:0x%llx cache_index=%lu dtsize=%u",
0371             MAJOR(__entry->dev), MINOR(__entry->dev),
0372             (unsigned long long)__entry->fileid, __entry->fhandle,
0373             __entry->version, show_nfs4_verifier(__entry->verifier),
0374             (unsigned long long)__entry->cookie, __entry->index,
0375             __entry->dtsize
0376         )
0377 );
0378 
0379 #define DEFINE_NFS_READDIR_EVENT(name) \
0380     DEFINE_EVENT(nfs_readdir_event, name, \
0381             TP_PROTO( \
0382                 const struct file *file, \
0383                 const __be32 *verifier, \
0384                 u64 cookie, \
0385                 pgoff_t page_index, \
0386                 unsigned int dtsize \
0387                 ), \
0388             TP_ARGS(file, verifier, cookie, page_index, dtsize))
0389 
0390 DEFINE_NFS_READDIR_EVENT(nfs_readdir_cache_fill);
0391 DEFINE_NFS_READDIR_EVENT(nfs_readdir_uncached);
0392 
0393 DECLARE_EVENT_CLASS(nfs_lookup_event,
0394         TP_PROTO(
0395             const struct inode *dir,
0396             const struct dentry *dentry,
0397             unsigned int flags
0398         ),
0399 
0400         TP_ARGS(dir, dentry, flags),
0401 
0402         TP_STRUCT__entry(
0403             __field(unsigned long, flags)
0404             __field(dev_t, dev)
0405             __field(u64, dir)
0406             __string(name, dentry->d_name.name)
0407         ),
0408 
0409         TP_fast_assign(
0410             __entry->dev = dir->i_sb->s_dev;
0411             __entry->dir = NFS_FILEID(dir);
0412             __entry->flags = flags;
0413             __assign_str(name, dentry->d_name.name);
0414         ),
0415 
0416         TP_printk(
0417             "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
0418             __entry->flags,
0419             show_fs_lookup_flags(__entry->flags),
0420             MAJOR(__entry->dev), MINOR(__entry->dev),
0421             (unsigned long long)__entry->dir,
0422             __get_str(name)
0423         )
0424 );
0425 
0426 #define DEFINE_NFS_LOOKUP_EVENT(name) \
0427     DEFINE_EVENT(nfs_lookup_event, name, \
0428             TP_PROTO( \
0429                 const struct inode *dir, \
0430                 const struct dentry *dentry, \
0431                 unsigned int flags \
0432             ), \
0433             TP_ARGS(dir, dentry, flags))
0434 
0435 DECLARE_EVENT_CLASS(nfs_lookup_event_done,
0436         TP_PROTO(
0437             const struct inode *dir,
0438             const struct dentry *dentry,
0439             unsigned int flags,
0440             int error
0441         ),
0442 
0443         TP_ARGS(dir, dentry, flags, error),
0444 
0445         TP_STRUCT__entry(
0446             __field(unsigned long, error)
0447             __field(unsigned long, flags)
0448             __field(dev_t, dev)
0449             __field(u64, dir)
0450             __string(name, dentry->d_name.name)
0451         ),
0452 
0453         TP_fast_assign(
0454             __entry->dev = dir->i_sb->s_dev;
0455             __entry->dir = NFS_FILEID(dir);
0456             __entry->error = error < 0 ? -error : 0;
0457             __entry->flags = flags;
0458             __assign_str(name, dentry->d_name.name);
0459         ),
0460 
0461         TP_printk(
0462             "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
0463             -__entry->error, show_nfs_status(__entry->error),
0464             __entry->flags,
0465             show_fs_lookup_flags(__entry->flags),
0466             MAJOR(__entry->dev), MINOR(__entry->dev),
0467             (unsigned long long)__entry->dir,
0468             __get_str(name)
0469         )
0470 );
0471 
0472 #define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
0473     DEFINE_EVENT(nfs_lookup_event_done, name, \
0474             TP_PROTO( \
0475                 const struct inode *dir, \
0476                 const struct dentry *dentry, \
0477                 unsigned int flags, \
0478                 int error \
0479             ), \
0480             TP_ARGS(dir, dentry, flags, error))
0481 
0482 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
0483 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
0484 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
0485 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
0486 DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup);
0487 DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup_revalidate_failed);
0488 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_readdir_lookup_revalidate);
0489 
0490 TRACE_EVENT(nfs_atomic_open_enter,
0491         TP_PROTO(
0492             const struct inode *dir,
0493             const struct nfs_open_context *ctx,
0494             unsigned int flags
0495         ),
0496 
0497         TP_ARGS(dir, ctx, flags),
0498 
0499         TP_STRUCT__entry(
0500             __field(unsigned long, flags)
0501             __field(unsigned long, fmode)
0502             __field(dev_t, dev)
0503             __field(u64, dir)
0504             __string(name, ctx->dentry->d_name.name)
0505         ),
0506 
0507         TP_fast_assign(
0508             __entry->dev = dir->i_sb->s_dev;
0509             __entry->dir = NFS_FILEID(dir);
0510             __entry->flags = flags;
0511             __entry->fmode = (__force unsigned long)ctx->mode;
0512             __assign_str(name, ctx->dentry->d_name.name);
0513         ),
0514 
0515         TP_printk(
0516             "flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
0517             __entry->flags,
0518             show_fs_fcntl_open_flags(__entry->flags),
0519             show_fs_fmode_flags(__entry->fmode),
0520             MAJOR(__entry->dev), MINOR(__entry->dev),
0521             (unsigned long long)__entry->dir,
0522             __get_str(name)
0523         )
0524 );
0525 
0526 TRACE_EVENT(nfs_atomic_open_exit,
0527         TP_PROTO(
0528             const struct inode *dir,
0529             const struct nfs_open_context *ctx,
0530             unsigned int flags,
0531             int error
0532         ),
0533 
0534         TP_ARGS(dir, ctx, flags, error),
0535 
0536         TP_STRUCT__entry(
0537             __field(unsigned long, error)
0538             __field(unsigned long, flags)
0539             __field(unsigned long, fmode)
0540             __field(dev_t, dev)
0541             __field(u64, dir)
0542             __string(name, ctx->dentry->d_name.name)
0543         ),
0544 
0545         TP_fast_assign(
0546             __entry->error = -error;
0547             __entry->dev = dir->i_sb->s_dev;
0548             __entry->dir = NFS_FILEID(dir);
0549             __entry->flags = flags;
0550             __entry->fmode = (__force unsigned long)ctx->mode;
0551             __assign_str(name, ctx->dentry->d_name.name);
0552         ),
0553 
0554         TP_printk(
0555             "error=%ld (%s) flags=0x%lx (%s) fmode=%s "
0556             "name=%02x:%02x:%llu/%s",
0557             -__entry->error, show_nfs_status(__entry->error),
0558             __entry->flags,
0559             show_fs_fcntl_open_flags(__entry->flags),
0560             show_fs_fmode_flags(__entry->fmode),
0561             MAJOR(__entry->dev), MINOR(__entry->dev),
0562             (unsigned long long)__entry->dir,
0563             __get_str(name)
0564         )
0565 );
0566 
0567 TRACE_EVENT(nfs_create_enter,
0568         TP_PROTO(
0569             const struct inode *dir,
0570             const struct dentry *dentry,
0571             unsigned int flags
0572         ),
0573 
0574         TP_ARGS(dir, dentry, flags),
0575 
0576         TP_STRUCT__entry(
0577             __field(unsigned long, flags)
0578             __field(dev_t, dev)
0579             __field(u64, dir)
0580             __string(name, dentry->d_name.name)
0581         ),
0582 
0583         TP_fast_assign(
0584             __entry->dev = dir->i_sb->s_dev;
0585             __entry->dir = NFS_FILEID(dir);
0586             __entry->flags = flags;
0587             __assign_str(name, dentry->d_name.name);
0588         ),
0589 
0590         TP_printk(
0591             "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
0592             __entry->flags,
0593             show_fs_fcntl_open_flags(__entry->flags),
0594             MAJOR(__entry->dev), MINOR(__entry->dev),
0595             (unsigned long long)__entry->dir,
0596             __get_str(name)
0597         )
0598 );
0599 
0600 TRACE_EVENT(nfs_create_exit,
0601         TP_PROTO(
0602             const struct inode *dir,
0603             const struct dentry *dentry,
0604             unsigned int flags,
0605             int error
0606         ),
0607 
0608         TP_ARGS(dir, dentry, flags, error),
0609 
0610         TP_STRUCT__entry(
0611             __field(unsigned long, error)
0612             __field(unsigned long, flags)
0613             __field(dev_t, dev)
0614             __field(u64, dir)
0615             __string(name, dentry->d_name.name)
0616         ),
0617 
0618         TP_fast_assign(
0619             __entry->error = -error;
0620             __entry->dev = dir->i_sb->s_dev;
0621             __entry->dir = NFS_FILEID(dir);
0622             __entry->flags = flags;
0623             __assign_str(name, dentry->d_name.name);
0624         ),
0625 
0626         TP_printk(
0627             "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
0628             -__entry->error, show_nfs_status(__entry->error),
0629             __entry->flags,
0630             show_fs_fcntl_open_flags(__entry->flags),
0631             MAJOR(__entry->dev), MINOR(__entry->dev),
0632             (unsigned long long)__entry->dir,
0633             __get_str(name)
0634         )
0635 );
0636 
0637 DECLARE_EVENT_CLASS(nfs_directory_event,
0638         TP_PROTO(
0639             const struct inode *dir,
0640             const struct dentry *dentry
0641         ),
0642 
0643         TP_ARGS(dir, dentry),
0644 
0645         TP_STRUCT__entry(
0646             __field(dev_t, dev)
0647             __field(u64, dir)
0648             __string(name, dentry->d_name.name)
0649         ),
0650 
0651         TP_fast_assign(
0652             __entry->dev = dir->i_sb->s_dev;
0653             __entry->dir = NFS_FILEID(dir);
0654             __assign_str(name, dentry->d_name.name);
0655         ),
0656 
0657         TP_printk(
0658             "name=%02x:%02x:%llu/%s",
0659             MAJOR(__entry->dev), MINOR(__entry->dev),
0660             (unsigned long long)__entry->dir,
0661             __get_str(name)
0662         )
0663 );
0664 
0665 #define DEFINE_NFS_DIRECTORY_EVENT(name) \
0666     DEFINE_EVENT(nfs_directory_event, name, \
0667             TP_PROTO( \
0668                 const struct inode *dir, \
0669                 const struct dentry *dentry \
0670             ), \
0671             TP_ARGS(dir, dentry))
0672 
0673 DECLARE_EVENT_CLASS(nfs_directory_event_done,
0674         TP_PROTO(
0675             const struct inode *dir,
0676             const struct dentry *dentry,
0677             int error
0678         ),
0679 
0680         TP_ARGS(dir, dentry, error),
0681 
0682         TP_STRUCT__entry(
0683             __field(unsigned long, error)
0684             __field(dev_t, dev)
0685             __field(u64, dir)
0686             __string(name, dentry->d_name.name)
0687         ),
0688 
0689         TP_fast_assign(
0690             __entry->dev = dir->i_sb->s_dev;
0691             __entry->dir = NFS_FILEID(dir);
0692             __entry->error = error < 0 ? -error : 0;
0693             __assign_str(name, dentry->d_name.name);
0694         ),
0695 
0696         TP_printk(
0697             "error=%ld (%s) name=%02x:%02x:%llu/%s",
0698             -__entry->error, show_nfs_status(__entry->error),
0699             MAJOR(__entry->dev), MINOR(__entry->dev),
0700             (unsigned long long)__entry->dir,
0701             __get_str(name)
0702         )
0703 );
0704 
0705 #define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
0706     DEFINE_EVENT(nfs_directory_event_done, name, \
0707             TP_PROTO( \
0708                 const struct inode *dir, \
0709                 const struct dentry *dentry, \
0710                 int error \
0711             ), \
0712             TP_ARGS(dir, dentry, error))
0713 
0714 DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
0715 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
0716 DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
0717 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
0718 DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
0719 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
0720 DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
0721 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
0722 DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
0723 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
0724 DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
0725 DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
0726 
0727 TRACE_EVENT(nfs_link_enter,
0728         TP_PROTO(
0729             const struct inode *inode,
0730             const struct inode *dir,
0731             const struct dentry *dentry
0732         ),
0733 
0734         TP_ARGS(inode, dir, dentry),
0735 
0736         TP_STRUCT__entry(
0737             __field(dev_t, dev)
0738             __field(u64, fileid)
0739             __field(u64, dir)
0740             __string(name, dentry->d_name.name)
0741         ),
0742 
0743         TP_fast_assign(
0744             __entry->dev = inode->i_sb->s_dev;
0745             __entry->fileid = NFS_FILEID(inode);
0746             __entry->dir = NFS_FILEID(dir);
0747             __assign_str(name, dentry->d_name.name);
0748         ),
0749 
0750         TP_printk(
0751             "fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
0752             MAJOR(__entry->dev), MINOR(__entry->dev),
0753             __entry->fileid,
0754             MAJOR(__entry->dev), MINOR(__entry->dev),
0755             (unsigned long long)__entry->dir,
0756             __get_str(name)
0757         )
0758 );
0759 
0760 TRACE_EVENT(nfs_link_exit,
0761         TP_PROTO(
0762             const struct inode *inode,
0763             const struct inode *dir,
0764             const struct dentry *dentry,
0765             int error
0766         ),
0767 
0768         TP_ARGS(inode, dir, dentry, error),
0769 
0770         TP_STRUCT__entry(
0771             __field(unsigned long, error)
0772             __field(dev_t, dev)
0773             __field(u64, fileid)
0774             __field(u64, dir)
0775             __string(name, dentry->d_name.name)
0776         ),
0777 
0778         TP_fast_assign(
0779             __entry->dev = inode->i_sb->s_dev;
0780             __entry->fileid = NFS_FILEID(inode);
0781             __entry->dir = NFS_FILEID(dir);
0782             __entry->error = error < 0 ? -error : 0;
0783             __assign_str(name, dentry->d_name.name);
0784         ),
0785 
0786         TP_printk(
0787             "error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
0788             -__entry->error, show_nfs_status(__entry->error),
0789             MAJOR(__entry->dev), MINOR(__entry->dev),
0790             __entry->fileid,
0791             MAJOR(__entry->dev), MINOR(__entry->dev),
0792             (unsigned long long)__entry->dir,
0793             __get_str(name)
0794         )
0795 );
0796 
0797 DECLARE_EVENT_CLASS(nfs_rename_event,
0798         TP_PROTO(
0799             const struct inode *old_dir,
0800             const struct dentry *old_dentry,
0801             const struct inode *new_dir,
0802             const struct dentry *new_dentry
0803         ),
0804 
0805         TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
0806 
0807         TP_STRUCT__entry(
0808             __field(dev_t, dev)
0809             __field(u64, old_dir)
0810             __field(u64, new_dir)
0811             __string(old_name, old_dentry->d_name.name)
0812             __string(new_name, new_dentry->d_name.name)
0813         ),
0814 
0815         TP_fast_assign(
0816             __entry->dev = old_dir->i_sb->s_dev;
0817             __entry->old_dir = NFS_FILEID(old_dir);
0818             __entry->new_dir = NFS_FILEID(new_dir);
0819             __assign_str(old_name, old_dentry->d_name.name);
0820             __assign_str(new_name, new_dentry->d_name.name);
0821         ),
0822 
0823         TP_printk(
0824             "old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
0825             MAJOR(__entry->dev), MINOR(__entry->dev),
0826             (unsigned long long)__entry->old_dir,
0827             __get_str(old_name),
0828             MAJOR(__entry->dev), MINOR(__entry->dev),
0829             (unsigned long long)__entry->new_dir,
0830             __get_str(new_name)
0831         )
0832 );
0833 #define DEFINE_NFS_RENAME_EVENT(name) \
0834     DEFINE_EVENT(nfs_rename_event, name, \
0835             TP_PROTO( \
0836                 const struct inode *old_dir, \
0837                 const struct dentry *old_dentry, \
0838                 const struct inode *new_dir, \
0839                 const struct dentry *new_dentry \
0840             ), \
0841             TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
0842 
0843 DECLARE_EVENT_CLASS(nfs_rename_event_done,
0844         TP_PROTO(
0845             const struct inode *old_dir,
0846             const struct dentry *old_dentry,
0847             const struct inode *new_dir,
0848             const struct dentry *new_dentry,
0849             int error
0850         ),
0851 
0852         TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
0853 
0854         TP_STRUCT__entry(
0855             __field(dev_t, dev)
0856             __field(unsigned long, error)
0857             __field(u64, old_dir)
0858             __string(old_name, old_dentry->d_name.name)
0859             __field(u64, new_dir)
0860             __string(new_name, new_dentry->d_name.name)
0861         ),
0862 
0863         TP_fast_assign(
0864             __entry->dev = old_dir->i_sb->s_dev;
0865             __entry->error = -error;
0866             __entry->old_dir = NFS_FILEID(old_dir);
0867             __entry->new_dir = NFS_FILEID(new_dir);
0868             __assign_str(old_name, old_dentry->d_name.name);
0869             __assign_str(new_name, new_dentry->d_name.name);
0870         ),
0871 
0872         TP_printk(
0873             "error=%ld (%s) old_name=%02x:%02x:%llu/%s "
0874             "new_name=%02x:%02x:%llu/%s",
0875             -__entry->error, show_nfs_status(__entry->error),
0876             MAJOR(__entry->dev), MINOR(__entry->dev),
0877             (unsigned long long)__entry->old_dir,
0878             __get_str(old_name),
0879             MAJOR(__entry->dev), MINOR(__entry->dev),
0880             (unsigned long long)__entry->new_dir,
0881             __get_str(new_name)
0882         )
0883 );
0884 #define DEFINE_NFS_RENAME_EVENT_DONE(name) \
0885     DEFINE_EVENT(nfs_rename_event_done, name, \
0886             TP_PROTO( \
0887                 const struct inode *old_dir, \
0888                 const struct dentry *old_dentry, \
0889                 const struct inode *new_dir, \
0890                 const struct dentry *new_dentry, \
0891                 int error \
0892             ), \
0893             TP_ARGS(old_dir, old_dentry, new_dir, \
0894                 new_dentry, error))
0895 
0896 DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
0897 DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
0898 
0899 DEFINE_NFS_RENAME_EVENT_DONE(nfs_sillyrename_rename);
0900 
0901 TRACE_EVENT(nfs_sillyrename_unlink,
0902         TP_PROTO(
0903             const struct nfs_unlinkdata *data,
0904             int error
0905         ),
0906 
0907         TP_ARGS(data, error),
0908 
0909         TP_STRUCT__entry(
0910             __field(dev_t, dev)
0911             __field(unsigned long, error)
0912             __field(u64, dir)
0913             __dynamic_array(char, name, data->args.name.len + 1)
0914         ),
0915 
0916         TP_fast_assign(
0917             struct inode *dir = d_inode(data->dentry->d_parent);
0918             size_t len = data->args.name.len;
0919             __entry->dev = dir->i_sb->s_dev;
0920             __entry->dir = NFS_FILEID(dir);
0921             __entry->error = -error;
0922             memcpy(__get_str(name),
0923                 data->args.name.name, len);
0924             __get_str(name)[len] = 0;
0925         ),
0926 
0927         TP_printk(
0928             "error=%ld (%s) name=%02x:%02x:%llu/%s",
0929             -__entry->error, show_nfs_status(__entry->error),
0930             MAJOR(__entry->dev), MINOR(__entry->dev),
0931             (unsigned long long)__entry->dir,
0932             __get_str(name)
0933         )
0934 );
0935 
0936 TRACE_EVENT(nfs_aop_readpage,
0937         TP_PROTO(
0938             const struct inode *inode,
0939             struct page *page
0940         ),
0941 
0942         TP_ARGS(inode, page),
0943 
0944         TP_STRUCT__entry(
0945             __field(dev_t, dev)
0946             __field(u32, fhandle)
0947             __field(u64, fileid)
0948             __field(u64, version)
0949             __field(loff_t, offset)
0950         ),
0951 
0952         TP_fast_assign(
0953             const struct nfs_inode *nfsi = NFS_I(inode);
0954 
0955             __entry->dev = inode->i_sb->s_dev;
0956             __entry->fileid = nfsi->fileid;
0957             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0958             __entry->version = inode_peek_iversion_raw(inode);
0959             __entry->offset = page_index(page) << PAGE_SHIFT;
0960         ),
0961 
0962         TP_printk(
0963             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld",
0964             MAJOR(__entry->dev), MINOR(__entry->dev),
0965             (unsigned long long)__entry->fileid,
0966             __entry->fhandle, __entry->version,
0967             __entry->offset
0968         )
0969 );
0970 
0971 TRACE_EVENT(nfs_aop_readpage_done,
0972         TP_PROTO(
0973             const struct inode *inode,
0974             struct page *page,
0975             int ret
0976         ),
0977 
0978         TP_ARGS(inode, page, ret),
0979 
0980         TP_STRUCT__entry(
0981             __field(dev_t, dev)
0982             __field(u32, fhandle)
0983             __field(int, ret)
0984             __field(u64, fileid)
0985             __field(u64, version)
0986             __field(loff_t, offset)
0987         ),
0988 
0989         TP_fast_assign(
0990             const struct nfs_inode *nfsi = NFS_I(inode);
0991 
0992             __entry->dev = inode->i_sb->s_dev;
0993             __entry->fileid = nfsi->fileid;
0994             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
0995             __entry->version = inode_peek_iversion_raw(inode);
0996             __entry->offset = page_index(page) << PAGE_SHIFT;
0997             __entry->ret = ret;
0998         ),
0999 
1000         TP_printk(
1001             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld ret=%d",
1002             MAJOR(__entry->dev), MINOR(__entry->dev),
1003             (unsigned long long)__entry->fileid,
1004             __entry->fhandle, __entry->version,
1005             __entry->offset, __entry->ret
1006         )
1007 );
1008 
1009 TRACE_EVENT(nfs_aop_readahead,
1010         TP_PROTO(
1011             const struct inode *inode,
1012             loff_t pos,
1013             unsigned int nr_pages
1014         ),
1015 
1016         TP_ARGS(inode, pos, nr_pages),
1017 
1018         TP_STRUCT__entry(
1019             __field(dev_t, dev)
1020             __field(u32, fhandle)
1021             __field(u64, fileid)
1022             __field(u64, version)
1023             __field(loff_t, offset)
1024             __field(unsigned int, nr_pages)
1025         ),
1026 
1027         TP_fast_assign(
1028             const struct nfs_inode *nfsi = NFS_I(inode);
1029 
1030             __entry->dev = inode->i_sb->s_dev;
1031             __entry->fileid = nfsi->fileid;
1032             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1033             __entry->version = inode_peek_iversion_raw(inode);
1034             __entry->offset = pos;
1035             __entry->nr_pages = nr_pages;
1036         ),
1037 
1038         TP_printk(
1039             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld nr_pages=%u",
1040             MAJOR(__entry->dev), MINOR(__entry->dev),
1041             (unsigned long long)__entry->fileid,
1042             __entry->fhandle, __entry->version,
1043             __entry->offset, __entry->nr_pages
1044         )
1045 );
1046 
1047 TRACE_EVENT(nfs_aop_readahead_done,
1048         TP_PROTO(
1049             const struct inode *inode,
1050             unsigned int nr_pages,
1051             int ret
1052         ),
1053 
1054         TP_ARGS(inode, nr_pages, ret),
1055 
1056         TP_STRUCT__entry(
1057             __field(dev_t, dev)
1058             __field(u32, fhandle)
1059             __field(int, ret)
1060             __field(u64, fileid)
1061             __field(u64, version)
1062             __field(loff_t, offset)
1063             __field(unsigned int, nr_pages)
1064         ),
1065 
1066         TP_fast_assign(
1067             const struct nfs_inode *nfsi = NFS_I(inode);
1068 
1069             __entry->dev = inode->i_sb->s_dev;
1070             __entry->fileid = nfsi->fileid;
1071             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1072             __entry->version = inode_peek_iversion_raw(inode);
1073             __entry->nr_pages = nr_pages;
1074             __entry->ret = ret;
1075         ),
1076 
1077         TP_printk(
1078             "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu nr_pages=%u ret=%d",
1079             MAJOR(__entry->dev), MINOR(__entry->dev),
1080             (unsigned long long)__entry->fileid,
1081             __entry->fhandle, __entry->version,
1082             __entry->nr_pages, __entry->ret
1083         )
1084 );
1085 
1086 TRACE_EVENT(nfs_initiate_read,
1087         TP_PROTO(
1088             const struct nfs_pgio_header *hdr
1089         ),
1090 
1091         TP_ARGS(hdr),
1092 
1093         TP_STRUCT__entry(
1094             __field(dev_t, dev)
1095             __field(u32, fhandle)
1096             __field(u64, fileid)
1097             __field(loff_t, offset)
1098             __field(u32, count)
1099         ),
1100 
1101         TP_fast_assign(
1102             const struct inode *inode = hdr->inode;
1103             const struct nfs_inode *nfsi = NFS_I(inode);
1104             const struct nfs_fh *fh = hdr->args.fh ?
1105                           hdr->args.fh : &nfsi->fh;
1106 
1107             __entry->offset = hdr->args.offset;
1108             __entry->count = hdr->args.count;
1109             __entry->dev = inode->i_sb->s_dev;
1110             __entry->fileid = nfsi->fileid;
1111             __entry->fhandle = nfs_fhandle_hash(fh);
1112         ),
1113 
1114         TP_printk(
1115             "fileid=%02x:%02x:%llu fhandle=0x%08x "
1116             "offset=%lld count=%u",
1117             MAJOR(__entry->dev), MINOR(__entry->dev),
1118             (unsigned long long)__entry->fileid,
1119             __entry->fhandle,
1120             (long long)__entry->offset, __entry->count
1121         )
1122 );
1123 
1124 TRACE_EVENT(nfs_readpage_done,
1125         TP_PROTO(
1126             const struct rpc_task *task,
1127             const struct nfs_pgio_header *hdr
1128         ),
1129 
1130         TP_ARGS(task, hdr),
1131 
1132         TP_STRUCT__entry(
1133             __field(dev_t, dev)
1134             __field(u32, fhandle)
1135             __field(u64, fileid)
1136             __field(loff_t, offset)
1137             __field(u32, arg_count)
1138             __field(u32, res_count)
1139             __field(bool, eof)
1140             __field(int, error)
1141         ),
1142 
1143         TP_fast_assign(
1144             const struct inode *inode = hdr->inode;
1145             const struct nfs_inode *nfsi = NFS_I(inode);
1146             const struct nfs_fh *fh = hdr->args.fh ?
1147                           hdr->args.fh : &nfsi->fh;
1148 
1149             __entry->error = task->tk_status;
1150             __entry->offset = hdr->args.offset;
1151             __entry->arg_count = hdr->args.count;
1152             __entry->res_count = hdr->res.count;
1153             __entry->eof = hdr->res.eof;
1154             __entry->dev = inode->i_sb->s_dev;
1155             __entry->fileid = nfsi->fileid;
1156             __entry->fhandle = nfs_fhandle_hash(fh);
1157         ),
1158 
1159         TP_printk(
1160             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1161             "offset=%lld count=%u res=%u%s", __entry->error,
1162             MAJOR(__entry->dev), MINOR(__entry->dev),
1163             (unsigned long long)__entry->fileid,
1164             __entry->fhandle,
1165             (long long)__entry->offset, __entry->arg_count,
1166             __entry->res_count, __entry->eof ? " eof" : ""
1167         )
1168 );
1169 
1170 TRACE_EVENT(nfs_readpage_short,
1171         TP_PROTO(
1172             const struct rpc_task *task,
1173             const struct nfs_pgio_header *hdr
1174         ),
1175 
1176         TP_ARGS(task, hdr),
1177 
1178         TP_STRUCT__entry(
1179             __field(dev_t, dev)
1180             __field(u32, fhandle)
1181             __field(u64, fileid)
1182             __field(loff_t, offset)
1183             __field(u32, arg_count)
1184             __field(u32, res_count)
1185             __field(bool, eof)
1186             __field(int, error)
1187         ),
1188 
1189         TP_fast_assign(
1190             const struct inode *inode = hdr->inode;
1191             const struct nfs_inode *nfsi = NFS_I(inode);
1192             const struct nfs_fh *fh = hdr->args.fh ?
1193                           hdr->args.fh : &nfsi->fh;
1194 
1195             __entry->error = task->tk_status;
1196             __entry->offset = hdr->args.offset;
1197             __entry->arg_count = hdr->args.count;
1198             __entry->res_count = hdr->res.count;
1199             __entry->eof = hdr->res.eof;
1200             __entry->dev = inode->i_sb->s_dev;
1201             __entry->fileid = nfsi->fileid;
1202             __entry->fhandle = nfs_fhandle_hash(fh);
1203         ),
1204 
1205         TP_printk(
1206             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1207             "offset=%lld count=%u res=%u%s", __entry->error,
1208             MAJOR(__entry->dev), MINOR(__entry->dev),
1209             (unsigned long long)__entry->fileid,
1210             __entry->fhandle,
1211             (long long)__entry->offset, __entry->arg_count,
1212             __entry->res_count, __entry->eof ? " eof" : ""
1213         )
1214 );
1215 
1216 DECLARE_EVENT_CLASS(nfs_fscache_page_event,
1217         TP_PROTO(
1218             const struct inode *inode,
1219             struct page *page
1220         ),
1221 
1222         TP_ARGS(inode, page),
1223 
1224         TP_STRUCT__entry(
1225             __field(dev_t, dev)
1226             __field(u32, fhandle)
1227             __field(u64, fileid)
1228             __field(loff_t, offset)
1229         ),
1230 
1231         TP_fast_assign(
1232             const struct nfs_inode *nfsi = NFS_I(inode);
1233             const struct nfs_fh *fh = &nfsi->fh;
1234 
1235             __entry->offset = page_index(page) << PAGE_SHIFT;
1236             __entry->dev = inode->i_sb->s_dev;
1237             __entry->fileid = nfsi->fileid;
1238             __entry->fhandle = nfs_fhandle_hash(fh);
1239         ),
1240 
1241         TP_printk(
1242             "fileid=%02x:%02x:%llu fhandle=0x%08x "
1243             "offset=%lld",
1244             MAJOR(__entry->dev), MINOR(__entry->dev),
1245             (unsigned long long)__entry->fileid,
1246             __entry->fhandle,
1247             (long long)__entry->offset
1248         )
1249 );
1250 DECLARE_EVENT_CLASS(nfs_fscache_page_event_done,
1251         TP_PROTO(
1252             const struct inode *inode,
1253             struct page *page,
1254             int error
1255         ),
1256 
1257         TP_ARGS(inode, page, error),
1258 
1259         TP_STRUCT__entry(
1260             __field(int, error)
1261             __field(dev_t, dev)
1262             __field(u32, fhandle)
1263             __field(u64, fileid)
1264             __field(loff_t, offset)
1265         ),
1266 
1267         TP_fast_assign(
1268             const struct nfs_inode *nfsi = NFS_I(inode);
1269             const struct nfs_fh *fh = &nfsi->fh;
1270 
1271             __entry->offset = page_index(page) << PAGE_SHIFT;
1272             __entry->dev = inode->i_sb->s_dev;
1273             __entry->fileid = nfsi->fileid;
1274             __entry->fhandle = nfs_fhandle_hash(fh);
1275             __entry->error = error;
1276         ),
1277 
1278         TP_printk(
1279             "fileid=%02x:%02x:%llu fhandle=0x%08x "
1280             "offset=%lld error=%d",
1281             MAJOR(__entry->dev), MINOR(__entry->dev),
1282             (unsigned long long)__entry->fileid,
1283             __entry->fhandle,
1284             (long long)__entry->offset, __entry->error
1285         )
1286 );
1287 #define DEFINE_NFS_FSCACHE_PAGE_EVENT(name) \
1288     DEFINE_EVENT(nfs_fscache_page_event, name, \
1289             TP_PROTO( \
1290                 const struct inode *inode, \
1291                 struct page *page \
1292             ), \
1293             TP_ARGS(inode, page))
1294 #define DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(name) \
1295     DEFINE_EVENT(nfs_fscache_page_event_done, name, \
1296             TP_PROTO( \
1297                 const struct inode *inode, \
1298                 struct page *page, \
1299                 int error \
1300             ), \
1301             TP_ARGS(inode, page, error))
1302 DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_read_page);
1303 DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_read_page_exit);
1304 DEFINE_NFS_FSCACHE_PAGE_EVENT(nfs_fscache_write_page);
1305 DEFINE_NFS_FSCACHE_PAGE_EVENT_DONE(nfs_fscache_write_page_exit);
1306 
1307 TRACE_EVENT(nfs_pgio_error,
1308     TP_PROTO(
1309         const struct nfs_pgio_header *hdr,
1310         int error,
1311         loff_t pos
1312     ),
1313 
1314     TP_ARGS(hdr, error, pos),
1315 
1316     TP_STRUCT__entry(
1317         __field(dev_t, dev)
1318         __field(u32, fhandle)
1319         __field(u64, fileid)
1320         __field(loff_t, offset)
1321         __field(u32, arg_count)
1322         __field(u32, res_count)
1323         __field(loff_t, pos)
1324         __field(int, error)
1325     ),
1326 
1327     TP_fast_assign(
1328         const struct inode *inode = hdr->inode;
1329         const struct nfs_inode *nfsi = NFS_I(inode);
1330         const struct nfs_fh *fh = hdr->args.fh ?
1331                       hdr->args.fh : &nfsi->fh;
1332 
1333         __entry->error = error;
1334         __entry->offset = hdr->args.offset;
1335         __entry->arg_count = hdr->args.count;
1336         __entry->res_count = hdr->res.count;
1337         __entry->dev = inode->i_sb->s_dev;
1338         __entry->fileid = nfsi->fileid;
1339         __entry->fhandle = nfs_fhandle_hash(fh);
1340     ),
1341 
1342     TP_printk("error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1343           "offset=%lld count=%u res=%u pos=%llu", __entry->error,
1344         MAJOR(__entry->dev), MINOR(__entry->dev),
1345         (unsigned long long)__entry->fileid, __entry->fhandle,
1346         (long long)__entry->offset, __entry->arg_count, __entry->res_count,
1347         __entry->pos
1348     )
1349 );
1350 
1351 TRACE_EVENT(nfs_initiate_write,
1352         TP_PROTO(
1353             const struct nfs_pgio_header *hdr
1354         ),
1355 
1356         TP_ARGS(hdr),
1357 
1358         TP_STRUCT__entry(
1359             __field(dev_t, dev)
1360             __field(u32, fhandle)
1361             __field(u64, fileid)
1362             __field(loff_t, offset)
1363             __field(u32, count)
1364             __field(unsigned long, stable)
1365         ),
1366 
1367         TP_fast_assign(
1368             const struct inode *inode = hdr->inode;
1369             const struct nfs_inode *nfsi = NFS_I(inode);
1370             const struct nfs_fh *fh = hdr->args.fh ?
1371                           hdr->args.fh : &nfsi->fh;
1372 
1373             __entry->offset = hdr->args.offset;
1374             __entry->count = hdr->args.count;
1375             __entry->stable = hdr->args.stable;
1376             __entry->dev = inode->i_sb->s_dev;
1377             __entry->fileid = nfsi->fileid;
1378             __entry->fhandle = nfs_fhandle_hash(fh);
1379         ),
1380 
1381         TP_printk(
1382             "fileid=%02x:%02x:%llu fhandle=0x%08x "
1383             "offset=%lld count=%u stable=%s",
1384             MAJOR(__entry->dev), MINOR(__entry->dev),
1385             (unsigned long long)__entry->fileid,
1386             __entry->fhandle,
1387             (long long)__entry->offset, __entry->count,
1388             show_nfs_stable_how(__entry->stable)
1389         )
1390 );
1391 
1392 TRACE_EVENT(nfs_writeback_done,
1393         TP_PROTO(
1394             const struct rpc_task *task,
1395             const struct nfs_pgio_header *hdr
1396         ),
1397 
1398         TP_ARGS(task, hdr),
1399 
1400         TP_STRUCT__entry(
1401             __field(dev_t, dev)
1402             __field(u32, fhandle)
1403             __field(u64, fileid)
1404             __field(loff_t, offset)
1405             __field(u32, arg_count)
1406             __field(u32, res_count)
1407             __field(int, error)
1408             __field(unsigned long, stable)
1409             __array(char, verifier, NFS4_VERIFIER_SIZE)
1410         ),
1411 
1412         TP_fast_assign(
1413             const struct inode *inode = hdr->inode;
1414             const struct nfs_inode *nfsi = NFS_I(inode);
1415             const struct nfs_fh *fh = hdr->args.fh ?
1416                           hdr->args.fh : &nfsi->fh;
1417             const struct nfs_writeverf *verf = hdr->res.verf;
1418 
1419             __entry->error = task->tk_status;
1420             __entry->offset = hdr->args.offset;
1421             __entry->arg_count = hdr->args.count;
1422             __entry->res_count = hdr->res.count;
1423             __entry->stable = verf->committed;
1424             memcpy(__entry->verifier,
1425                 &verf->verifier,
1426                 NFS4_VERIFIER_SIZE);
1427             __entry->dev = inode->i_sb->s_dev;
1428             __entry->fileid = nfsi->fileid;
1429             __entry->fhandle = nfs_fhandle_hash(fh);
1430         ),
1431 
1432         TP_printk(
1433             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1434             "offset=%lld count=%u res=%u stable=%s "
1435             "verifier=%s", __entry->error,
1436             MAJOR(__entry->dev), MINOR(__entry->dev),
1437             (unsigned long long)__entry->fileid,
1438             __entry->fhandle,
1439             (long long)__entry->offset, __entry->arg_count,
1440             __entry->res_count,
1441             show_nfs_stable_how(__entry->stable),
1442             show_nfs4_verifier(__entry->verifier)
1443         )
1444 );
1445 
1446 DECLARE_EVENT_CLASS(nfs_page_error_class,
1447         TP_PROTO(
1448             const struct inode *inode,
1449             const struct nfs_page *req,
1450             int error
1451         ),
1452 
1453         TP_ARGS(inode, req, error),
1454 
1455         TP_STRUCT__entry(
1456             __field(dev_t, dev)
1457             __field(u32, fhandle)
1458             __field(u64, fileid)
1459             __field(loff_t, offset)
1460             __field(unsigned int, count)
1461             __field(int, error)
1462         ),
1463 
1464         TP_fast_assign(
1465             const struct nfs_inode *nfsi = NFS_I(inode);
1466             __entry->dev = inode->i_sb->s_dev;
1467             __entry->fileid = nfsi->fileid;
1468             __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
1469             __entry->offset = req_offset(req);
1470             __entry->count = req->wb_bytes;
1471             __entry->error = error;
1472         ),
1473 
1474         TP_printk(
1475             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1476             "offset=%lld count=%u", __entry->error,
1477             MAJOR(__entry->dev), MINOR(__entry->dev),
1478             (unsigned long long)__entry->fileid,
1479             __entry->fhandle, __entry->offset,
1480             __entry->count
1481         )
1482 );
1483 
1484 #define DEFINE_NFS_PAGEERR_EVENT(name) \
1485     DEFINE_EVENT(nfs_page_error_class, name, \
1486             TP_PROTO( \
1487                 const struct inode *inode, \
1488                 const struct nfs_page *req, \
1489                 int error \
1490             ), \
1491             TP_ARGS(inode, req, error))
1492 
1493 DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
1494 DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
1495 DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
1496 
1497 TRACE_EVENT(nfs_initiate_commit,
1498         TP_PROTO(
1499             const struct nfs_commit_data *data
1500         ),
1501 
1502         TP_ARGS(data),
1503 
1504         TP_STRUCT__entry(
1505             __field(dev_t, dev)
1506             __field(u32, fhandle)
1507             __field(u64, fileid)
1508             __field(loff_t, offset)
1509             __field(u32, count)
1510         ),
1511 
1512         TP_fast_assign(
1513             const struct inode *inode = data->inode;
1514             const struct nfs_inode *nfsi = NFS_I(inode);
1515             const struct nfs_fh *fh = data->args.fh ?
1516                           data->args.fh : &nfsi->fh;
1517 
1518             __entry->offset = data->args.offset;
1519             __entry->count = data->args.count;
1520             __entry->dev = inode->i_sb->s_dev;
1521             __entry->fileid = nfsi->fileid;
1522             __entry->fhandle = nfs_fhandle_hash(fh);
1523         ),
1524 
1525         TP_printk(
1526             "fileid=%02x:%02x:%llu fhandle=0x%08x "
1527             "offset=%lld count=%u",
1528             MAJOR(__entry->dev), MINOR(__entry->dev),
1529             (unsigned long long)__entry->fileid,
1530             __entry->fhandle,
1531             (long long)__entry->offset, __entry->count
1532         )
1533 );
1534 
1535 TRACE_EVENT(nfs_commit_done,
1536         TP_PROTO(
1537             const struct rpc_task *task,
1538             const struct nfs_commit_data *data
1539         ),
1540 
1541         TP_ARGS(task, data),
1542 
1543         TP_STRUCT__entry(
1544             __field(dev_t, dev)
1545             __field(u32, fhandle)
1546             __field(u64, fileid)
1547             __field(loff_t, offset)
1548             __field(int, error)
1549             __field(unsigned long, stable)
1550             __array(char, verifier, NFS4_VERIFIER_SIZE)
1551         ),
1552 
1553         TP_fast_assign(
1554             const struct inode *inode = data->inode;
1555             const struct nfs_inode *nfsi = NFS_I(inode);
1556             const struct nfs_fh *fh = data->args.fh ?
1557                           data->args.fh : &nfsi->fh;
1558             const struct nfs_writeverf *verf = data->res.verf;
1559 
1560             __entry->error = task->tk_status;
1561             __entry->offset = data->args.offset;
1562             __entry->stable = verf->committed;
1563             memcpy(__entry->verifier,
1564                 &verf->verifier,
1565                 NFS4_VERIFIER_SIZE);
1566             __entry->dev = inode->i_sb->s_dev;
1567             __entry->fileid = nfsi->fileid;
1568             __entry->fhandle = nfs_fhandle_hash(fh);
1569         ),
1570 
1571         TP_printk(
1572             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
1573             "offset=%lld stable=%s verifier=%s", __entry->error,
1574             MAJOR(__entry->dev), MINOR(__entry->dev),
1575             (unsigned long long)__entry->fileid,
1576             __entry->fhandle,
1577             (long long)__entry->offset,
1578             show_nfs_stable_how(__entry->stable),
1579             show_nfs4_verifier(__entry->verifier)
1580         )
1581 );
1582 
1583 #define nfs_show_direct_req_flags(v) \
1584     __print_flags(v, "|", \
1585             { NFS_ODIRECT_DO_COMMIT, "DO_COMMIT" }, \
1586             { NFS_ODIRECT_RESCHED_WRITES, "RESCHED_WRITES" }, \
1587             { NFS_ODIRECT_SHOULD_DIRTY, "SHOULD DIRTY" }, \
1588             { NFS_ODIRECT_DONE, "DONE" } )
1589 
1590 DECLARE_EVENT_CLASS(nfs_direct_req_class,
1591         TP_PROTO(
1592             const struct nfs_direct_req *dreq
1593         ),
1594 
1595         TP_ARGS(dreq),
1596 
1597         TP_STRUCT__entry(
1598             __field(dev_t, dev)
1599             __field(u64, fileid)
1600             __field(u32, fhandle)
1601             __field(loff_t, offset)
1602             __field(ssize_t, count)
1603             __field(ssize_t, bytes_left)
1604             __field(ssize_t, error)
1605             __field(int, flags)
1606         ),
1607 
1608         TP_fast_assign(
1609             const struct inode *inode = dreq->inode;
1610             const struct nfs_inode *nfsi = NFS_I(inode);
1611             const struct nfs_fh *fh = &nfsi->fh;
1612 
1613             __entry->dev = inode->i_sb->s_dev;
1614             __entry->fileid = nfsi->fileid;
1615             __entry->fhandle = nfs_fhandle_hash(fh);
1616             __entry->offset = dreq->io_start;
1617             __entry->count = dreq->count;
1618             __entry->bytes_left = dreq->bytes_left;
1619             __entry->error = dreq->error;
1620             __entry->flags = dreq->flags;
1621         ),
1622 
1623         TP_printk(
1624             "error=%zd fileid=%02x:%02x:%llu fhandle=0x%08x "
1625             "offset=%lld count=%zd bytes_left=%zd flags=%s",
1626             __entry->error, MAJOR(__entry->dev),
1627             MINOR(__entry->dev),
1628             (unsigned long long)__entry->fileid,
1629             __entry->fhandle, __entry->offset,
1630             __entry->count, __entry->bytes_left,
1631             nfs_show_direct_req_flags(__entry->flags)
1632         )
1633 );
1634 
1635 #define DEFINE_NFS_DIRECT_REQ_EVENT(name) \
1636     DEFINE_EVENT(nfs_direct_req_class, name, \
1637             TP_PROTO( \
1638                 const struct nfs_direct_req *dreq \
1639             ), \
1640             TP_ARGS(dreq))
1641 
1642 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_commit_complete);
1643 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_resched_write);
1644 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_complete);
1645 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_completion);
1646 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_schedule_iovec);
1647 DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_reschedule_io);
1648 
1649 TRACE_EVENT(nfs_fh_to_dentry,
1650         TP_PROTO(
1651             const struct super_block *sb,
1652             const struct nfs_fh *fh,
1653             u64 fileid,
1654             int error
1655         ),
1656 
1657         TP_ARGS(sb, fh, fileid, error),
1658 
1659         TP_STRUCT__entry(
1660             __field(int, error)
1661             __field(dev_t, dev)
1662             __field(u32, fhandle)
1663             __field(u64, fileid)
1664         ),
1665 
1666         TP_fast_assign(
1667             __entry->error = error;
1668             __entry->dev = sb->s_dev;
1669             __entry->fileid = fileid;
1670             __entry->fhandle = nfs_fhandle_hash(fh);
1671         ),
1672 
1673         TP_printk(
1674             "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
1675             __entry->error,
1676             MAJOR(__entry->dev), MINOR(__entry->dev),
1677             (unsigned long long)__entry->fileid,
1678             __entry->fhandle
1679         )
1680 );
1681 
1682 TRACE_EVENT(nfs_mount_assign,
1683     TP_PROTO(
1684         const char *option,
1685         const char *value
1686     ),
1687 
1688     TP_ARGS(option, value),
1689 
1690     TP_STRUCT__entry(
1691         __string(option, option)
1692         __string(value, value)
1693     ),
1694 
1695     TP_fast_assign(
1696         __assign_str(option, option);
1697         __assign_str(value, value);
1698     ),
1699 
1700     TP_printk("option %s=%s",
1701         __get_str(option), __get_str(value)
1702     )
1703 );
1704 
1705 TRACE_EVENT(nfs_mount_option,
1706     TP_PROTO(
1707         const struct fs_parameter *param
1708     ),
1709 
1710     TP_ARGS(param),
1711 
1712     TP_STRUCT__entry(
1713         __string(option, param->key)
1714     ),
1715 
1716     TP_fast_assign(
1717         __assign_str(option, param->key);
1718     ),
1719 
1720     TP_printk("option %s", __get_str(option))
1721 );
1722 
1723 TRACE_EVENT(nfs_mount_path,
1724     TP_PROTO(
1725         const char *path
1726     ),
1727 
1728     TP_ARGS(path),
1729 
1730     TP_STRUCT__entry(
1731         __string(path, path)
1732     ),
1733 
1734     TP_fast_assign(
1735         __assign_str(path, path);
1736     ),
1737 
1738     TP_printk("path='%s'", __get_str(path))
1739 );
1740 
1741 DECLARE_EVENT_CLASS(nfs_xdr_event,
1742         TP_PROTO(
1743             const struct xdr_stream *xdr,
1744             int error
1745         ),
1746 
1747         TP_ARGS(xdr, error),
1748 
1749         TP_STRUCT__entry(
1750             __field(unsigned int, task_id)
1751             __field(unsigned int, client_id)
1752             __field(u32, xid)
1753             __field(int, version)
1754             __field(unsigned long, error)
1755             __string(program,
1756                  xdr->rqst->rq_task->tk_client->cl_program->name)
1757             __string(procedure,
1758                  xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
1759         ),
1760 
1761         TP_fast_assign(
1762             const struct rpc_rqst *rqstp = xdr->rqst;
1763             const struct rpc_task *task = rqstp->rq_task;
1764 
1765             __entry->task_id = task->tk_pid;
1766             __entry->client_id = task->tk_client->cl_clid;
1767             __entry->xid = be32_to_cpu(rqstp->rq_xid);
1768             __entry->version = task->tk_client->cl_vers;
1769             __entry->error = error;
1770             __assign_str(program,
1771                      task->tk_client->cl_program->name);
1772             __assign_str(procedure, task->tk_msg.rpc_proc->p_name);
1773         ),
1774 
1775         TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
1776               " xid=0x%08x %sv%d %s error=%ld (%s)",
1777             __entry->task_id, __entry->client_id, __entry->xid,
1778             __get_str(program), __entry->version,
1779             __get_str(procedure), -__entry->error,
1780             show_nfs_status(__entry->error)
1781         )
1782 );
1783 #define DEFINE_NFS_XDR_EVENT(name) \
1784     DEFINE_EVENT(nfs_xdr_event, name, \
1785             TP_PROTO( \
1786                 const struct xdr_stream *xdr, \
1787                 int error \
1788             ), \
1789             TP_ARGS(xdr, error))
1790 DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
1791 DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
1792 
1793 #endif /* _TRACE_NFS_H */
1794 
1795 #undef TRACE_INCLUDE_PATH
1796 #define TRACE_INCLUDE_PATH .
1797 #define TRACE_INCLUDE_FILE nfstrace
1798 /* This part must be outside protection */
1799 #include <trace/define_trace.h>