nfstrace.h 37 KB

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