1 /* 2 * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com> 3 */ 4 #undef TRACE_SYSTEM 5 #define TRACE_SYSTEM nfs 6 7 #if !defined(_TRACE_NFS_H) || defined(TRACE_HEADER_MULTI_READ) 8 #define _TRACE_NFS_H 9 10 #include <linux/tracepoint.h> 11 12 #define nfs_show_file_type(ftype) \ 13 __print_symbolic(ftype, \ 14 { DT_UNKNOWN, "UNKNOWN" }, \ 15 { DT_FIFO, "FIFO" }, \ 16 { DT_CHR, "CHR" }, \ 17 { DT_DIR, "DIR" }, \ 18 { DT_BLK, "BLK" }, \ 19 { DT_REG, "REG" }, \ 20 { DT_LNK, "LNK" }, \ 21 { DT_SOCK, "SOCK" }, \ 22 { DT_WHT, "WHT" }) 23 24 #define nfs_show_cache_validity(v) \ 25 __print_flags(v, "|", \ 26 { NFS_INO_INVALID_ATTR, "INVALID_ATTR" }, \ 27 { NFS_INO_INVALID_DATA, "INVALID_DATA" }, \ 28 { NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \ 29 { NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \ 30 { NFS_INO_INVALID_ACL, "INVALID_ACL" }, \ 31 { NFS_INO_REVAL_PAGECACHE, "REVAL_PAGECACHE" }, \ 32 { NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \ 33 { NFS_INO_INVALID_LABEL, "INVALID_LABEL" }) 34 35 #define nfs_show_nfsi_flags(v) \ 36 __print_flags(v, "|", \ 37 { 1 << NFS_INO_ADVISE_RDPLUS, "ADVISE_RDPLUS" }, \ 38 { 1 << NFS_INO_STALE, "STALE" }, \ 39 { 1 << NFS_INO_FLUSHING, "FLUSHING" }, \ 40 { 1 << NFS_INO_FSCACHE, "FSCACHE" }, \ 41 { 1 << NFS_INO_COMMIT, "COMMIT" }, \ 42 { 1 << NFS_INO_LAYOUTCOMMIT, "NEED_LAYOUTCOMMIT" }, \ 43 { 1 << NFS_INO_LAYOUTCOMMITTING, "LAYOUTCOMMIT" }) 44 45 DECLARE_EVENT_CLASS(nfs_inode_event, 46 TP_PROTO( 47 const struct inode *inode 48 ), 49 50 TP_ARGS(inode), 51 52 TP_STRUCT__entry( 53 __field(dev_t, dev) 54 __field(u32, fhandle) 55 __field(u64, fileid) 56 __field(u64, version) 57 ), 58 59 TP_fast_assign( 60 const struct nfs_inode *nfsi = NFS_I(inode); 61 __entry->dev = inode->i_sb->s_dev; 62 __entry->fileid = nfsi->fileid; 63 __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); 64 __entry->version = inode->i_version; 65 ), 66 67 TP_printk( 68 "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu ", 69 MAJOR(__entry->dev), MINOR(__entry->dev), 70 (unsigned long long)__entry->fileid, 71 __entry->fhandle, 72 (unsigned long long)__entry->version 73 ) 74 ); 75 76 DECLARE_EVENT_CLASS(nfs_inode_event_done, 77 TP_PROTO( 78 const struct inode *inode, 79 int error 80 ), 81 82 TP_ARGS(inode, error), 83 84 TP_STRUCT__entry( 85 __field(int, error) 86 __field(dev_t, dev) 87 __field(u32, fhandle) 88 __field(unsigned char, type) 89 __field(u64, fileid) 90 __field(u64, version) 91 __field(loff_t, size) 92 __field(unsigned long, nfsi_flags) 93 __field(unsigned long, cache_validity) 94 ), 95 96 TP_fast_assign( 97 const struct nfs_inode *nfsi = NFS_I(inode); 98 __entry->error = error; 99 __entry->dev = inode->i_sb->s_dev; 100 __entry->fileid = nfsi->fileid; 101 __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); 102 __entry->type = nfs_umode_to_dtype(inode->i_mode); 103 __entry->version = inode->i_version; 104 __entry->size = i_size_read(inode); 105 __entry->nfsi_flags = nfsi->flags; 106 __entry->cache_validity = nfsi->cache_validity; 107 ), 108 109 TP_printk( 110 "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x " 111 "type=%u (%s) version=%llu size=%lld " 112 "cache_validity=%lu (%s) nfs_flags=%ld (%s)", 113 __entry->error, 114 MAJOR(__entry->dev), MINOR(__entry->dev), 115 (unsigned long long)__entry->fileid, 116 __entry->fhandle, 117 __entry->type, 118 nfs_show_file_type(__entry->type), 119 (unsigned long long)__entry->version, 120 (long long)__entry->size, 121 __entry->cache_validity, 122 nfs_show_cache_validity(__entry->cache_validity), 123 __entry->nfsi_flags, 124 nfs_show_nfsi_flags(__entry->nfsi_flags) 125 ) 126 ); 127 128 #define DEFINE_NFS_INODE_EVENT(name) \ 129 DEFINE_EVENT(nfs_inode_event, name, \ 130 TP_PROTO( \ 131 const struct inode *inode \ 132 ), \ 133 TP_ARGS(inode)) 134 #define DEFINE_NFS_INODE_EVENT_DONE(name) \ 135 DEFINE_EVENT(nfs_inode_event_done, name, \ 136 TP_PROTO( \ 137 const struct inode *inode, \ 138 int error \ 139 ), \ 140 TP_ARGS(inode, error)) 141 DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter); 142 DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit); 143 DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter); 144 DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit); 145 DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter); 146 DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit); 147 DEFINE_NFS_INODE_EVENT(nfs_getattr_enter); 148 DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit); 149 DEFINE_NFS_INODE_EVENT(nfs_setattr_enter); 150 DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit); 151 DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter); 152 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit); 153 DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter); 154 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit); 155 DEFINE_NFS_INODE_EVENT(nfs_fsync_enter); 156 DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit); 157 DEFINE_NFS_INODE_EVENT(nfs_access_enter); 158 DEFINE_NFS_INODE_EVENT_DONE(nfs_access_exit); 159 160 #define show_lookup_flags(flags) \ 161 __print_flags((unsigned long)flags, "|", \ 162 { LOOKUP_AUTOMOUNT, "AUTOMOUNT" }, \ 163 { LOOKUP_DIRECTORY, "DIRECTORY" }, \ 164 { LOOKUP_OPEN, "OPEN" }, \ 165 { LOOKUP_CREATE, "CREATE" }, \ 166 { LOOKUP_EXCL, "EXCL" }) 167 168 DECLARE_EVENT_CLASS(nfs_lookup_event, 169 TP_PROTO( 170 const struct inode *dir, 171 const struct dentry *dentry, 172 unsigned int flags 173 ), 174 175 TP_ARGS(dir, dentry, flags), 176 177 TP_STRUCT__entry( 178 __field(unsigned int, flags) 179 __field(dev_t, dev) 180 __field(u64, dir) 181 __string(name, dentry->d_name.name) 182 ), 183 184 TP_fast_assign( 185 __entry->dev = dir->i_sb->s_dev; 186 __entry->dir = NFS_FILEID(dir); 187 __entry->flags = flags; 188 __assign_str(name, dentry->d_name.name); 189 ), 190 191 TP_printk( 192 "flags=%u (%s) name=%02x:%02x:%llu/%s", 193 __entry->flags, 194 show_lookup_flags(__entry->flags), 195 MAJOR(__entry->dev), MINOR(__entry->dev), 196 (unsigned long long)__entry->dir, 197 __get_str(name) 198 ) 199 ); 200 201 #define DEFINE_NFS_LOOKUP_EVENT(name) \ 202 DEFINE_EVENT(nfs_lookup_event, name, \ 203 TP_PROTO( \ 204 const struct inode *dir, \ 205 const struct dentry *dentry, \ 206 unsigned int flags \ 207 ), \ 208 TP_ARGS(dir, dentry, flags)) 209 210 DECLARE_EVENT_CLASS(nfs_lookup_event_done, 211 TP_PROTO( 212 const struct inode *dir, 213 const struct dentry *dentry, 214 unsigned int flags, 215 int error 216 ), 217 218 TP_ARGS(dir, dentry, flags, error), 219 220 TP_STRUCT__entry( 221 __field(int, error) 222 __field(unsigned int, flags) 223 __field(dev_t, dev) 224 __field(u64, dir) 225 __string(name, dentry->d_name.name) 226 ), 227 228 TP_fast_assign( 229 __entry->dev = dir->i_sb->s_dev; 230 __entry->dir = NFS_FILEID(dir); 231 __entry->error = error; 232 __entry->flags = flags; 233 __assign_str(name, dentry->d_name.name); 234 ), 235 236 TP_printk( 237 "error=%d flags=%u (%s) name=%02x:%02x:%llu/%s", 238 __entry->error, 239 __entry->flags, 240 show_lookup_flags(__entry->flags), 241 MAJOR(__entry->dev), MINOR(__entry->dev), 242 (unsigned long long)__entry->dir, 243 __get_str(name) 244 ) 245 ); 246 247 #define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \ 248 DEFINE_EVENT(nfs_lookup_event_done, name, \ 249 TP_PROTO( \ 250 const struct inode *dir, \ 251 const struct dentry *dentry, \ 252 unsigned int flags, \ 253 int error \ 254 ), \ 255 TP_ARGS(dir, dentry, flags, error)) 256 257 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter); 258 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit); 259 DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter); 260 DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit); 261 262 #define show_open_flags(flags) \ 263 __print_flags((unsigned long)flags, "|", \ 264 { O_CREAT, "O_CREAT" }, \ 265 { O_EXCL, "O_EXCL" }, \ 266 { O_TRUNC, "O_TRUNC" }, \ 267 { O_APPEND, "O_APPEND" }, \ 268 { O_DSYNC, "O_DSYNC" }, \ 269 { O_DIRECT, "O_DIRECT" }, \ 270 { O_DIRECTORY, "O_DIRECTORY" }) 271 272 #define show_fmode_flags(mode) \ 273 __print_flags(mode, "|", \ 274 { ((__force unsigned long)FMODE_READ), "READ" }, \ 275 { ((__force unsigned long)FMODE_WRITE), "WRITE" }, \ 276 { ((__force unsigned long)FMODE_EXEC), "EXEC" }) 277 278 TRACE_EVENT(nfs_atomic_open_enter, 279 TP_PROTO( 280 const struct inode *dir, 281 const struct nfs_open_context *ctx, 282 unsigned int flags 283 ), 284 285 TP_ARGS(dir, ctx, flags), 286 287 TP_STRUCT__entry( 288 __field(unsigned int, flags) 289 __field(unsigned int, fmode) 290 __field(dev_t, dev) 291 __field(u64, dir) 292 __string(name, ctx->dentry->d_name.name) 293 ), 294 295 TP_fast_assign( 296 __entry->dev = dir->i_sb->s_dev; 297 __entry->dir = NFS_FILEID(dir); 298 __entry->flags = flags; 299 __entry->fmode = (__force unsigned int)ctx->mode; 300 __assign_str(name, ctx->dentry->d_name.name); 301 ), 302 303 TP_printk( 304 "flags=%u (%s) fmode=%s name=%02x:%02x:%llu/%s", 305 __entry->flags, 306 show_open_flags(__entry->flags), 307 show_fmode_flags(__entry->fmode), 308 MAJOR(__entry->dev), MINOR(__entry->dev), 309 (unsigned long long)__entry->dir, 310 __get_str(name) 311 ) 312 ); 313 314 TRACE_EVENT(nfs_atomic_open_exit, 315 TP_PROTO( 316 const struct inode *dir, 317 const struct nfs_open_context *ctx, 318 unsigned int flags, 319 int error 320 ), 321 322 TP_ARGS(dir, ctx, flags, error), 323 324 TP_STRUCT__entry( 325 __field(int, error) 326 __field(unsigned int, flags) 327 __field(unsigned int, fmode) 328 __field(dev_t, dev) 329 __field(u64, dir) 330 __string(name, ctx->dentry->d_name.name) 331 ), 332 333 TP_fast_assign( 334 __entry->error = error; 335 __entry->dev = dir->i_sb->s_dev; 336 __entry->dir = NFS_FILEID(dir); 337 __entry->flags = flags; 338 __entry->fmode = (__force unsigned int)ctx->mode; 339 __assign_str(name, ctx->dentry->d_name.name); 340 ), 341 342 TP_printk( 343 "error=%d flags=%u (%s) fmode=%s " 344 "name=%02x:%02x:%llu/%s", 345 __entry->error, 346 __entry->flags, 347 show_open_flags(__entry->flags), 348 show_fmode_flags(__entry->fmode), 349 MAJOR(__entry->dev), MINOR(__entry->dev), 350 (unsigned long long)__entry->dir, 351 __get_str(name) 352 ) 353 ); 354 355 #endif /* _TRACE_NFS_H */ 356 357 #undef TRACE_INCLUDE_PATH 358 #define TRACE_INCLUDE_PATH . 359 #define TRACE_INCLUDE_FILE nfstrace 360 /* This part must be outside protection */ 361 #include <trace/define_trace.h> 362