nfstrace.h 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986
  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. #include <trace/misc/fs.h>
  12. #include <trace/misc/nfs.h>
  13. #include <trace/misc/sunrpc.h>
  14. #define nfs_show_cache_validity(v) \
  15. __print_flags(v, "|", \
  16. { NFS_INO_INVALID_DATA, "INVALID_DATA" }, \
  17. { NFS_INO_INVALID_ATIME, "INVALID_ATIME" }, \
  18. { NFS_INO_INVALID_ACCESS, "INVALID_ACCESS" }, \
  19. { NFS_INO_INVALID_ACL, "INVALID_ACL" }, \
  20. { NFS_INO_REVAL_FORCED, "REVAL_FORCED" }, \
  21. { NFS_INO_INVALID_LABEL, "INVALID_LABEL" }, \
  22. { NFS_INO_INVALID_CHANGE, "INVALID_CHANGE" }, \
  23. { NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
  24. { NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
  25. { NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
  26. { NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
  27. { NFS_INO_DATA_INVAL_DEFER, "DATA_INVAL_DEFER" }, \
  28. { NFS_INO_INVALID_BLOCKS, "INVALID_BLOCKS" }, \
  29. { NFS_INO_INVALID_XATTR, "INVALID_XATTR" }, \
  30. { NFS_INO_INVALID_NLINK, "INVALID_NLINK" }, \
  31. { NFS_INO_INVALID_MODE, "INVALID_MODE" }, \
  32. { NFS_INO_INVALID_BTIME, "INVALID_BTIME" })
  33. #define nfs_show_nfsi_flags(v) \
  34. __print_flags(v, "|", \
  35. { BIT(NFS_INO_STALE), "STALE" }, \
  36. { BIT(NFS_INO_ACL_LRU_SET), "ACL_LRU_SET" }, \
  37. { BIT(NFS_INO_INVALIDATING), "INVALIDATING" }, \
  38. { BIT(NFS_INO_LAYOUTCOMMIT), "NEED_LAYOUTCOMMIT" }, \
  39. { BIT(NFS_INO_LAYOUTCOMMITTING), "LAYOUTCOMMIT" }, \
  40. { BIT(NFS_INO_LAYOUTSTATS), "LAYOUTSTATS" }, \
  41. { BIT(NFS_INO_ODIRECT), "ODIRECT" })
  42. #define nfs_show_wb_flags(v) \
  43. __print_flags(v, "|", \
  44. { BIT(PG_BUSY), "BUSY" }, \
  45. { BIT(PG_MAPPED), "MAPPED" }, \
  46. { BIT(PG_FOLIO), "FOLIO" }, \
  47. { BIT(PG_CLEAN), "CLEAN" }, \
  48. { BIT(PG_COMMIT_TO_DS), "COMMIT_TO_DS" }, \
  49. { BIT(PG_INODE_REF), "INODE_REF" }, \
  50. { BIT(PG_HEADLOCK), "HEADLOCK" }, \
  51. { BIT(PG_TEARDOWN), "TEARDOWN" }, \
  52. { BIT(PG_UNLOCKPAGE), "UNLOCKPAGE" }, \
  53. { BIT(PG_UPTODATE), "UPTODATE" }, \
  54. { BIT(PG_WB_END), "WB_END" }, \
  55. { BIT(PG_REMOVE), "REMOVE" }, \
  56. { BIT(PG_CONTENDED1), "CONTENDED1" }, \
  57. { BIT(PG_CONTENDED2), "CONTENDED2" })
  58. DECLARE_EVENT_CLASS(nfs_inode_event,
  59. TP_PROTO(
  60. const struct inode *inode
  61. ),
  62. TP_ARGS(inode),
  63. TP_STRUCT__entry(
  64. __field(dev_t, dev)
  65. __field(u32, fhandle)
  66. __field(u64, fileid)
  67. __field(u64, version)
  68. __field(unsigned long, cache_validity)
  69. ),
  70. TP_fast_assign(
  71. const struct nfs_inode *nfsi = NFS_I(inode);
  72. __entry->dev = inode->i_sb->s_dev;
  73. __entry->fileid = nfsi->fileid;
  74. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  75. __entry->version = inode_peek_iversion_raw(inode);
  76. __entry->cache_validity = nfsi->cache_validity;
  77. ),
  78. TP_printk(
  79. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cache_validity=0x%lx (%s)",
  80. MAJOR(__entry->dev), MINOR(__entry->dev),
  81. (unsigned long long)__entry->fileid,
  82. __entry->fhandle,
  83. (unsigned long long)__entry->version,
  84. __entry->cache_validity,
  85. nfs_show_cache_validity(__entry->cache_validity)
  86. )
  87. );
  88. DECLARE_EVENT_CLASS(nfs_inode_event_done,
  89. TP_PROTO(
  90. const struct inode *inode,
  91. int error
  92. ),
  93. TP_ARGS(inode, error),
  94. TP_STRUCT__entry(
  95. __field(unsigned long, error)
  96. __field(dev_t, dev)
  97. __field(u32, fhandle)
  98. __field(unsigned char, type)
  99. __field(u64, fileid)
  100. __field(u64, version)
  101. __field(loff_t, size)
  102. __field(unsigned long, nfsi_flags)
  103. __field(unsigned long, cache_validity)
  104. ),
  105. TP_fast_assign(
  106. const struct nfs_inode *nfsi = NFS_I(inode);
  107. __entry->error = error < 0 ? -error : 0;
  108. __entry->dev = inode->i_sb->s_dev;
  109. __entry->fileid = nfsi->fileid;
  110. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  111. __entry->type = nfs_umode_to_dtype(inode->i_mode);
  112. __entry->version = inode_peek_iversion_raw(inode);
  113. __entry->size = i_size_read(inode);
  114. __entry->nfsi_flags = nfsi->flags;
  115. __entry->cache_validity = nfsi->cache_validity;
  116. ),
  117. TP_printk(
  118. "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
  119. "type=%u (%s) version=%llu size=%lld "
  120. "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s)",
  121. -__entry->error, show_nfs_status(__entry->error),
  122. MAJOR(__entry->dev), MINOR(__entry->dev),
  123. (unsigned long long)__entry->fileid,
  124. __entry->fhandle,
  125. __entry->type,
  126. show_fs_dirent_type(__entry->type),
  127. (unsigned long long)__entry->version,
  128. (long long)__entry->size,
  129. __entry->cache_validity,
  130. nfs_show_cache_validity(__entry->cache_validity),
  131. __entry->nfsi_flags,
  132. nfs_show_nfsi_flags(__entry->nfsi_flags)
  133. )
  134. );
  135. #define DEFINE_NFS_INODE_EVENT(name) \
  136. DEFINE_EVENT(nfs_inode_event, name, \
  137. TP_PROTO( \
  138. const struct inode *inode \
  139. ), \
  140. TP_ARGS(inode))
  141. #define DEFINE_NFS_INODE_EVENT_DONE(name) \
  142. DEFINE_EVENT(nfs_inode_event_done, name, \
  143. TP_PROTO( \
  144. const struct inode *inode, \
  145. int error \
  146. ), \
  147. TP_ARGS(inode, error))
  148. DEFINE_NFS_INODE_EVENT(nfs_set_inode_stale);
  149. DEFINE_NFS_INODE_EVENT(nfs_refresh_inode_enter);
  150. DEFINE_NFS_INODE_EVENT_DONE(nfs_refresh_inode_exit);
  151. DEFINE_NFS_INODE_EVENT(nfs_revalidate_inode_enter);
  152. DEFINE_NFS_INODE_EVENT_DONE(nfs_revalidate_inode_exit);
  153. DEFINE_NFS_INODE_EVENT(nfs_invalidate_mapping_enter);
  154. DEFINE_NFS_INODE_EVENT_DONE(nfs_invalidate_mapping_exit);
  155. DEFINE_NFS_INODE_EVENT(nfs_getattr_enter);
  156. DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit);
  157. DEFINE_NFS_INODE_EVENT(nfs_setattr_enter);
  158. DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit);
  159. DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter);
  160. DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit);
  161. DEFINE_NFS_INODE_EVENT(nfs_fsync_enter);
  162. DEFINE_NFS_INODE_EVENT_DONE(nfs_fsync_exit);
  163. DEFINE_NFS_INODE_EVENT(nfs_access_enter);
  164. DEFINE_NFS_INODE_EVENT_DONE(nfs_set_cache_invalid);
  165. DEFINE_NFS_INODE_EVENT(nfs_readdir_force_readdirplus);
  166. DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_cache_fill_done);
  167. DEFINE_NFS_INODE_EVENT_DONE(nfs_readdir_uncached_done);
  168. TRACE_EVENT(nfs_access_exit,
  169. TP_PROTO(
  170. const struct inode *inode,
  171. unsigned int mask,
  172. unsigned int permitted,
  173. int error
  174. ),
  175. TP_ARGS(inode, mask, permitted, error),
  176. TP_STRUCT__entry(
  177. __field(unsigned long, error)
  178. __field(dev_t, dev)
  179. __field(u32, fhandle)
  180. __field(unsigned char, type)
  181. __field(u64, fileid)
  182. __field(u64, version)
  183. __field(loff_t, size)
  184. __field(unsigned long, nfsi_flags)
  185. __field(unsigned long, cache_validity)
  186. __field(unsigned int, mask)
  187. __field(unsigned int, permitted)
  188. ),
  189. TP_fast_assign(
  190. const struct nfs_inode *nfsi = NFS_I(inode);
  191. __entry->error = error < 0 ? -error : 0;
  192. __entry->dev = inode->i_sb->s_dev;
  193. __entry->fileid = nfsi->fileid;
  194. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  195. __entry->type = nfs_umode_to_dtype(inode->i_mode);
  196. __entry->version = inode_peek_iversion_raw(inode);
  197. __entry->size = i_size_read(inode);
  198. __entry->nfsi_flags = nfsi->flags;
  199. __entry->cache_validity = nfsi->cache_validity;
  200. __entry->mask = mask;
  201. __entry->permitted = permitted;
  202. ),
  203. TP_printk(
  204. "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
  205. "type=%u (%s) version=%llu size=%lld "
  206. "cache_validity=0x%lx (%s) nfs_flags=0x%lx (%s) "
  207. "mask=0x%x permitted=0x%x",
  208. -__entry->error, show_nfs_status(__entry->error),
  209. MAJOR(__entry->dev), MINOR(__entry->dev),
  210. (unsigned long long)__entry->fileid,
  211. __entry->fhandle,
  212. __entry->type,
  213. show_fs_dirent_type(__entry->type),
  214. (unsigned long long)__entry->version,
  215. (long long)__entry->size,
  216. __entry->cache_validity,
  217. nfs_show_cache_validity(__entry->cache_validity),
  218. __entry->nfsi_flags,
  219. nfs_show_nfsi_flags(__entry->nfsi_flags),
  220. __entry->mask, __entry->permitted
  221. )
  222. );
  223. DECLARE_EVENT_CLASS(nfs_update_size_class,
  224. TP_PROTO(
  225. const struct inode *inode,
  226. loff_t new_size
  227. ),
  228. TP_ARGS(inode, new_size),
  229. TP_STRUCT__entry(
  230. __field(dev_t, dev)
  231. __field(u32, fhandle)
  232. __field(u64, fileid)
  233. __field(u64, version)
  234. __field(loff_t, cur_size)
  235. __field(loff_t, new_size)
  236. ),
  237. TP_fast_assign(
  238. const struct nfs_inode *nfsi = NFS_I(inode);
  239. __entry->dev = inode->i_sb->s_dev;
  240. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  241. __entry->fileid = nfsi->fileid;
  242. __entry->version = inode_peek_iversion_raw(inode);
  243. __entry->cur_size = i_size_read(inode);
  244. __entry->new_size = new_size;
  245. ),
  246. TP_printk(
  247. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu cursize=%lld newsize=%lld",
  248. MAJOR(__entry->dev), MINOR(__entry->dev),
  249. (unsigned long long)__entry->fileid,
  250. __entry->fhandle, __entry->version,
  251. __entry->cur_size, __entry->new_size
  252. )
  253. );
  254. #define DEFINE_NFS_UPDATE_SIZE_EVENT(name) \
  255. DEFINE_EVENT(nfs_update_size_class, nfs_size_##name, \
  256. TP_PROTO( \
  257. const struct inode *inode, \
  258. loff_t new_size \
  259. ), \
  260. TP_ARGS(inode, new_size))
  261. DEFINE_NFS_UPDATE_SIZE_EVENT(truncate);
  262. DEFINE_NFS_UPDATE_SIZE_EVENT(truncate_folio);
  263. DEFINE_NFS_UPDATE_SIZE_EVENT(wcc);
  264. DEFINE_NFS_UPDATE_SIZE_EVENT(update);
  265. DEFINE_NFS_UPDATE_SIZE_EVENT(grow);
  266. DECLARE_EVENT_CLASS(nfs_inode_range_event,
  267. TP_PROTO(
  268. const struct inode *inode,
  269. loff_t range_start,
  270. loff_t range_end
  271. ),
  272. TP_ARGS(inode, range_start, range_end),
  273. TP_STRUCT__entry(
  274. __field(dev_t, dev)
  275. __field(u32, fhandle)
  276. __field(u64, fileid)
  277. __field(u64, version)
  278. __field(loff_t, range_start)
  279. __field(loff_t, range_end)
  280. ),
  281. TP_fast_assign(
  282. const struct nfs_inode *nfsi = NFS_I(inode);
  283. __entry->dev = inode->i_sb->s_dev;
  284. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  285. __entry->fileid = nfsi->fileid;
  286. __entry->version = inode_peek_iversion_raw(inode);
  287. __entry->range_start = range_start;
  288. __entry->range_end = range_end;
  289. ),
  290. TP_printk(
  291. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
  292. "range=[%lld, %lld]",
  293. MAJOR(__entry->dev), MINOR(__entry->dev),
  294. (unsigned long long)__entry->fileid,
  295. __entry->fhandle, __entry->version,
  296. __entry->range_start, __entry->range_end
  297. )
  298. );
  299. #define DEFINE_NFS_INODE_RANGE_EVENT(name) \
  300. DEFINE_EVENT(nfs_inode_range_event, name, \
  301. TP_PROTO( \
  302. const struct inode *inode, \
  303. loff_t range_start, \
  304. loff_t range_end \
  305. ), \
  306. TP_ARGS(inode, range_start, range_end))
  307. DEFINE_NFS_INODE_RANGE_EVENT(nfs_readdir_invalidate_cache_range);
  308. DECLARE_EVENT_CLASS(nfs_readdir_event,
  309. TP_PROTO(
  310. const struct file *file,
  311. const __be32 *verifier,
  312. u64 cookie,
  313. pgoff_t page_index,
  314. unsigned int dtsize
  315. ),
  316. TP_ARGS(file, verifier, cookie, page_index, dtsize),
  317. TP_STRUCT__entry(
  318. __field(dev_t, dev)
  319. __field(u32, fhandle)
  320. __field(u64, fileid)
  321. __field(u64, version)
  322. __array(char, verifier, NFS4_VERIFIER_SIZE)
  323. __field(u64, cookie)
  324. __field(pgoff_t, index)
  325. __field(unsigned int, dtsize)
  326. ),
  327. TP_fast_assign(
  328. const struct inode *dir = file_inode(file);
  329. const struct nfs_inode *nfsi = NFS_I(dir);
  330. __entry->dev = dir->i_sb->s_dev;
  331. __entry->fileid = nfsi->fileid;
  332. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  333. __entry->version = inode_peek_iversion_raw(dir);
  334. if (cookie != 0)
  335. memcpy(__entry->verifier, verifier,
  336. NFS4_VERIFIER_SIZE);
  337. else
  338. memset(__entry->verifier, 0,
  339. NFS4_VERIFIER_SIZE);
  340. __entry->cookie = cookie;
  341. __entry->index = page_index;
  342. __entry->dtsize = dtsize;
  343. ),
  344. TP_printk(
  345. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
  346. "cookie=%s:0x%llx cache_index=%lu dtsize=%u",
  347. MAJOR(__entry->dev), MINOR(__entry->dev),
  348. (unsigned long long)__entry->fileid, __entry->fhandle,
  349. __entry->version, show_nfs4_verifier(__entry->verifier),
  350. (unsigned long long)__entry->cookie, __entry->index,
  351. __entry->dtsize
  352. )
  353. );
  354. #define DEFINE_NFS_READDIR_EVENT(name) \
  355. DEFINE_EVENT(nfs_readdir_event, name, \
  356. TP_PROTO( \
  357. const struct file *file, \
  358. const __be32 *verifier, \
  359. u64 cookie, \
  360. pgoff_t page_index, \
  361. unsigned int dtsize \
  362. ), \
  363. TP_ARGS(file, verifier, cookie, page_index, dtsize))
  364. DEFINE_NFS_READDIR_EVENT(nfs_readdir_cache_fill);
  365. DEFINE_NFS_READDIR_EVENT(nfs_readdir_uncached);
  366. DECLARE_EVENT_CLASS(nfs_lookup_event,
  367. TP_PROTO(
  368. const struct inode *dir,
  369. const struct dentry *dentry,
  370. unsigned int flags
  371. ),
  372. TP_ARGS(dir, dentry, flags),
  373. TP_STRUCT__entry(
  374. __field(unsigned long, flags)
  375. __field(dev_t, dev)
  376. __field(u64, dir)
  377. __field(u64, fileid)
  378. __string(name, dentry->d_name.name)
  379. ),
  380. TP_fast_assign(
  381. __entry->dev = dir->i_sb->s_dev;
  382. __entry->dir = NFS_FILEID(dir);
  383. __entry->flags = flags;
  384. __entry->fileid = d_is_negative(dentry) ? 0 : NFS_FILEID(d_inode(dentry));
  385. __assign_str(name);
  386. ),
  387. TP_printk(
  388. "flags=0x%lx (%s) name=%02x:%02x:%llu/%s fileid=%llu",
  389. __entry->flags,
  390. show_fs_lookup_flags(__entry->flags),
  391. MAJOR(__entry->dev), MINOR(__entry->dev),
  392. (unsigned long long)__entry->dir,
  393. __get_str(name),
  394. __entry->fileid
  395. )
  396. );
  397. #define DEFINE_NFS_LOOKUP_EVENT(name) \
  398. DEFINE_EVENT(nfs_lookup_event, name, \
  399. TP_PROTO( \
  400. const struct inode *dir, \
  401. const struct dentry *dentry, \
  402. unsigned int flags \
  403. ), \
  404. TP_ARGS(dir, dentry, flags))
  405. DECLARE_EVENT_CLASS(nfs_lookup_event_done,
  406. TP_PROTO(
  407. const struct inode *dir,
  408. const struct dentry *dentry,
  409. unsigned int flags,
  410. int error
  411. ),
  412. TP_ARGS(dir, dentry, flags, error),
  413. TP_STRUCT__entry(
  414. __field(unsigned long, error)
  415. __field(unsigned long, flags)
  416. __field(dev_t, dev)
  417. __field(u64, dir)
  418. __field(u64, fileid)
  419. __string(name, dentry->d_name.name)
  420. ),
  421. TP_fast_assign(
  422. __entry->dev = dir->i_sb->s_dev;
  423. __entry->dir = NFS_FILEID(dir);
  424. __entry->error = error < 0 ? -error : 0;
  425. __entry->flags = flags;
  426. __entry->fileid = d_is_negative(dentry) ? 0 : NFS_FILEID(d_inode(dentry));
  427. __assign_str(name);
  428. ),
  429. TP_printk(
  430. "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s fileid=%llu",
  431. -__entry->error, show_nfs_status(__entry->error),
  432. __entry->flags,
  433. show_fs_lookup_flags(__entry->flags),
  434. MAJOR(__entry->dev), MINOR(__entry->dev),
  435. (unsigned long long)__entry->dir,
  436. __get_str(name),
  437. __entry->fileid
  438. )
  439. );
  440. #define DEFINE_NFS_LOOKUP_EVENT_DONE(name) \
  441. DEFINE_EVENT(nfs_lookup_event_done, name, \
  442. TP_PROTO( \
  443. const struct inode *dir, \
  444. const struct dentry *dentry, \
  445. unsigned int flags, \
  446. int error \
  447. ), \
  448. TP_ARGS(dir, dentry, flags, error))
  449. DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_enter);
  450. DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_exit);
  451. DEFINE_NFS_LOOKUP_EVENT(nfs_lookup_revalidate_enter);
  452. DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_lookup_revalidate_exit);
  453. DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup);
  454. DEFINE_NFS_LOOKUP_EVENT(nfs_readdir_lookup_revalidate_failed);
  455. DEFINE_NFS_LOOKUP_EVENT_DONE(nfs_readdir_lookup_revalidate);
  456. TRACE_EVENT(nfs_atomic_open_enter,
  457. TP_PROTO(
  458. const struct inode *dir,
  459. const struct nfs_open_context *ctx,
  460. unsigned int flags
  461. ),
  462. TP_ARGS(dir, ctx, flags),
  463. TP_STRUCT__entry(
  464. __field(unsigned long, flags)
  465. __field(unsigned long, fmode)
  466. __field(dev_t, dev)
  467. __field(u64, dir)
  468. __string(name, ctx->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. __entry->fmode = (__force unsigned long)ctx->mode;
  475. __assign_str(name);
  476. ),
  477. TP_printk(
  478. "flags=0x%lx (%s) fmode=%s name=%02x:%02x:%llu/%s",
  479. __entry->flags,
  480. show_fs_fcntl_open_flags(__entry->flags),
  481. show_fs_fmode_flags(__entry->fmode),
  482. MAJOR(__entry->dev), MINOR(__entry->dev),
  483. (unsigned long long)__entry->dir,
  484. __get_str(name)
  485. )
  486. );
  487. TRACE_EVENT(nfs_atomic_open_exit,
  488. TP_PROTO(
  489. const struct inode *dir,
  490. const struct nfs_open_context *ctx,
  491. unsigned int flags,
  492. int error
  493. ),
  494. TP_ARGS(dir, ctx, flags, error),
  495. TP_STRUCT__entry(
  496. __field(unsigned long, error)
  497. __field(unsigned long, flags)
  498. __field(unsigned long, fmode)
  499. __field(dev_t, dev)
  500. __field(u64, dir)
  501. __string(name, ctx->dentry->d_name.name)
  502. ),
  503. TP_fast_assign(
  504. __entry->error = -error;
  505. __entry->dev = dir->i_sb->s_dev;
  506. __entry->dir = NFS_FILEID(dir);
  507. __entry->flags = flags;
  508. __entry->fmode = (__force unsigned long)ctx->mode;
  509. __assign_str(name);
  510. ),
  511. TP_printk(
  512. "error=%ld (%s) flags=0x%lx (%s) fmode=%s "
  513. "name=%02x:%02x:%llu/%s",
  514. -__entry->error, show_nfs_status(__entry->error),
  515. __entry->flags,
  516. show_fs_fcntl_open_flags(__entry->flags),
  517. show_fs_fmode_flags(__entry->fmode),
  518. MAJOR(__entry->dev), MINOR(__entry->dev),
  519. (unsigned long long)__entry->dir,
  520. __get_str(name)
  521. )
  522. );
  523. TRACE_EVENT(nfs_create_enter,
  524. TP_PROTO(
  525. const struct inode *dir,
  526. const struct dentry *dentry,
  527. unsigned int flags
  528. ),
  529. TP_ARGS(dir, dentry, flags),
  530. TP_STRUCT__entry(
  531. __field(unsigned long, flags)
  532. __field(dev_t, dev)
  533. __field(u64, dir)
  534. __string(name, dentry->d_name.name)
  535. ),
  536. TP_fast_assign(
  537. __entry->dev = dir->i_sb->s_dev;
  538. __entry->dir = NFS_FILEID(dir);
  539. __entry->flags = flags;
  540. __assign_str(name);
  541. ),
  542. TP_printk(
  543. "flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
  544. __entry->flags,
  545. show_fs_fcntl_open_flags(__entry->flags),
  546. MAJOR(__entry->dev), MINOR(__entry->dev),
  547. (unsigned long long)__entry->dir,
  548. __get_str(name)
  549. )
  550. );
  551. TRACE_EVENT(nfs_create_exit,
  552. TP_PROTO(
  553. const struct inode *dir,
  554. const struct dentry *dentry,
  555. unsigned int flags,
  556. int error
  557. ),
  558. TP_ARGS(dir, dentry, flags, error),
  559. TP_STRUCT__entry(
  560. __field(unsigned long, error)
  561. __field(unsigned long, flags)
  562. __field(dev_t, dev)
  563. __field(u64, dir)
  564. __string(name, dentry->d_name.name)
  565. ),
  566. TP_fast_assign(
  567. __entry->error = -error;
  568. __entry->dev = dir->i_sb->s_dev;
  569. __entry->dir = NFS_FILEID(dir);
  570. __entry->flags = flags;
  571. __assign_str(name);
  572. ),
  573. TP_printk(
  574. "error=%ld (%s) flags=0x%lx (%s) name=%02x:%02x:%llu/%s",
  575. -__entry->error, show_nfs_status(__entry->error),
  576. __entry->flags,
  577. show_fs_fcntl_open_flags(__entry->flags),
  578. MAJOR(__entry->dev), MINOR(__entry->dev),
  579. (unsigned long long)__entry->dir,
  580. __get_str(name)
  581. )
  582. );
  583. DECLARE_EVENT_CLASS(nfs_directory_event,
  584. TP_PROTO(
  585. const struct inode *dir,
  586. const struct dentry *dentry
  587. ),
  588. TP_ARGS(dir, dentry),
  589. TP_STRUCT__entry(
  590. __field(dev_t, dev)
  591. __field(u64, dir)
  592. __string(name, dentry->d_name.name)
  593. ),
  594. TP_fast_assign(
  595. __entry->dev = dir->i_sb->s_dev;
  596. __entry->dir = NFS_FILEID(dir);
  597. __assign_str(name);
  598. ),
  599. TP_printk(
  600. "name=%02x:%02x:%llu/%s",
  601. MAJOR(__entry->dev), MINOR(__entry->dev),
  602. (unsigned long long)__entry->dir,
  603. __get_str(name)
  604. )
  605. );
  606. #define DEFINE_NFS_DIRECTORY_EVENT(name) \
  607. DEFINE_EVENT(nfs_directory_event, name, \
  608. TP_PROTO( \
  609. const struct inode *dir, \
  610. const struct dentry *dentry \
  611. ), \
  612. TP_ARGS(dir, dentry))
  613. DECLARE_EVENT_CLASS(nfs_directory_event_done,
  614. TP_PROTO(
  615. const struct inode *dir,
  616. const struct dentry *dentry,
  617. int error
  618. ),
  619. TP_ARGS(dir, dentry, error),
  620. TP_STRUCT__entry(
  621. __field(unsigned long, error)
  622. __field(dev_t, dev)
  623. __field(u64, dir)
  624. __string(name, dentry->d_name.name)
  625. ),
  626. TP_fast_assign(
  627. __entry->dev = dir->i_sb->s_dev;
  628. __entry->dir = NFS_FILEID(dir);
  629. __entry->error = error < 0 ? -error : 0;
  630. __assign_str(name);
  631. ),
  632. TP_printk(
  633. "error=%ld (%s) name=%02x:%02x:%llu/%s",
  634. -__entry->error, show_nfs_status(__entry->error),
  635. MAJOR(__entry->dev), MINOR(__entry->dev),
  636. (unsigned long long)__entry->dir,
  637. __get_str(name)
  638. )
  639. );
  640. #define DEFINE_NFS_DIRECTORY_EVENT_DONE(name) \
  641. DEFINE_EVENT(nfs_directory_event_done, name, \
  642. TP_PROTO( \
  643. const struct inode *dir, \
  644. const struct dentry *dentry, \
  645. int error \
  646. ), \
  647. TP_ARGS(dir, dentry, error))
  648. DEFINE_NFS_DIRECTORY_EVENT(nfs_mknod_enter);
  649. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mknod_exit);
  650. DEFINE_NFS_DIRECTORY_EVENT(nfs_mkdir_enter);
  651. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_mkdir_exit);
  652. DEFINE_NFS_DIRECTORY_EVENT(nfs_rmdir_enter);
  653. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_rmdir_exit);
  654. DEFINE_NFS_DIRECTORY_EVENT(nfs_remove_enter);
  655. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_remove_exit);
  656. DEFINE_NFS_DIRECTORY_EVENT(nfs_unlink_enter);
  657. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_unlink_exit);
  658. DEFINE_NFS_DIRECTORY_EVENT(nfs_symlink_enter);
  659. DEFINE_NFS_DIRECTORY_EVENT_DONE(nfs_symlink_exit);
  660. TRACE_EVENT(nfs_link_enter,
  661. TP_PROTO(
  662. const struct inode *inode,
  663. const struct inode *dir,
  664. const struct dentry *dentry
  665. ),
  666. TP_ARGS(inode, dir, dentry),
  667. TP_STRUCT__entry(
  668. __field(dev_t, dev)
  669. __field(u64, fileid)
  670. __field(u64, dir)
  671. __string(name, dentry->d_name.name)
  672. ),
  673. TP_fast_assign(
  674. __entry->dev = inode->i_sb->s_dev;
  675. __entry->fileid = NFS_FILEID(inode);
  676. __entry->dir = NFS_FILEID(dir);
  677. __assign_str(name);
  678. ),
  679. TP_printk(
  680. "fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
  681. MAJOR(__entry->dev), MINOR(__entry->dev),
  682. __entry->fileid,
  683. MAJOR(__entry->dev), MINOR(__entry->dev),
  684. (unsigned long long)__entry->dir,
  685. __get_str(name)
  686. )
  687. );
  688. TRACE_EVENT(nfs_link_exit,
  689. TP_PROTO(
  690. const struct inode *inode,
  691. const struct inode *dir,
  692. const struct dentry *dentry,
  693. int error
  694. ),
  695. TP_ARGS(inode, dir, dentry, error),
  696. TP_STRUCT__entry(
  697. __field(unsigned long, error)
  698. __field(dev_t, dev)
  699. __field(u64, fileid)
  700. __field(u64, dir)
  701. __string(name, dentry->d_name.name)
  702. ),
  703. TP_fast_assign(
  704. __entry->dev = inode->i_sb->s_dev;
  705. __entry->fileid = NFS_FILEID(inode);
  706. __entry->dir = NFS_FILEID(dir);
  707. __entry->error = error < 0 ? -error : 0;
  708. __assign_str(name);
  709. ),
  710. TP_printk(
  711. "error=%ld (%s) fileid=%02x:%02x:%llu name=%02x:%02x:%llu/%s",
  712. -__entry->error, show_nfs_status(__entry->error),
  713. MAJOR(__entry->dev), MINOR(__entry->dev),
  714. __entry->fileid,
  715. MAJOR(__entry->dev), MINOR(__entry->dev),
  716. (unsigned long long)__entry->dir,
  717. __get_str(name)
  718. )
  719. );
  720. DECLARE_EVENT_CLASS(nfs_rename_event,
  721. TP_PROTO(
  722. const struct inode *old_dir,
  723. const struct dentry *old_dentry,
  724. const struct inode *new_dir,
  725. const struct dentry *new_dentry
  726. ),
  727. TP_ARGS(old_dir, old_dentry, new_dir, new_dentry),
  728. TP_STRUCT__entry(
  729. __field(dev_t, dev)
  730. __field(u64, old_dir)
  731. __field(u64, new_dir)
  732. __string(old_name, old_dentry->d_name.name)
  733. __string(new_name, new_dentry->d_name.name)
  734. ),
  735. TP_fast_assign(
  736. __entry->dev = old_dir->i_sb->s_dev;
  737. __entry->old_dir = NFS_FILEID(old_dir);
  738. __entry->new_dir = NFS_FILEID(new_dir);
  739. __assign_str(old_name);
  740. __assign_str(new_name);
  741. ),
  742. TP_printk(
  743. "old_name=%02x:%02x:%llu/%s new_name=%02x:%02x:%llu/%s",
  744. MAJOR(__entry->dev), MINOR(__entry->dev),
  745. (unsigned long long)__entry->old_dir,
  746. __get_str(old_name),
  747. MAJOR(__entry->dev), MINOR(__entry->dev),
  748. (unsigned long long)__entry->new_dir,
  749. __get_str(new_name)
  750. )
  751. );
  752. #define DEFINE_NFS_RENAME_EVENT(name) \
  753. DEFINE_EVENT(nfs_rename_event, name, \
  754. TP_PROTO( \
  755. const struct inode *old_dir, \
  756. const struct dentry *old_dentry, \
  757. const struct inode *new_dir, \
  758. const struct dentry *new_dentry \
  759. ), \
  760. TP_ARGS(old_dir, old_dentry, new_dir, new_dentry))
  761. DECLARE_EVENT_CLASS(nfs_rename_event_done,
  762. TP_PROTO(
  763. const struct inode *old_dir,
  764. const struct dentry *old_dentry,
  765. const struct inode *new_dir,
  766. const struct dentry *new_dentry,
  767. int error
  768. ),
  769. TP_ARGS(old_dir, old_dentry, new_dir, new_dentry, error),
  770. TP_STRUCT__entry(
  771. __field(dev_t, dev)
  772. __field(unsigned long, error)
  773. __field(u64, old_dir)
  774. __string(old_name, old_dentry->d_name.name)
  775. __field(u64, new_dir)
  776. __string(new_name, new_dentry->d_name.name)
  777. ),
  778. TP_fast_assign(
  779. __entry->dev = old_dir->i_sb->s_dev;
  780. __entry->error = -error;
  781. __entry->old_dir = NFS_FILEID(old_dir);
  782. __entry->new_dir = NFS_FILEID(new_dir);
  783. __assign_str(old_name);
  784. __assign_str(new_name);
  785. ),
  786. TP_printk(
  787. "error=%ld (%s) old_name=%02x:%02x:%llu/%s "
  788. "new_name=%02x:%02x:%llu/%s",
  789. -__entry->error, show_nfs_status(__entry->error),
  790. MAJOR(__entry->dev), MINOR(__entry->dev),
  791. (unsigned long long)__entry->old_dir,
  792. __get_str(old_name),
  793. MAJOR(__entry->dev), MINOR(__entry->dev),
  794. (unsigned long long)__entry->new_dir,
  795. __get_str(new_name)
  796. )
  797. );
  798. #define DEFINE_NFS_RENAME_EVENT_DONE(name) \
  799. DEFINE_EVENT(nfs_rename_event_done, name, \
  800. TP_PROTO( \
  801. const struct inode *old_dir, \
  802. const struct dentry *old_dentry, \
  803. const struct inode *new_dir, \
  804. const struct dentry *new_dentry, \
  805. int error \
  806. ), \
  807. TP_ARGS(old_dir, old_dentry, new_dir, \
  808. new_dentry, error))
  809. DEFINE_NFS_RENAME_EVENT(nfs_rename_enter);
  810. DEFINE_NFS_RENAME_EVENT_DONE(nfs_rename_exit);
  811. DEFINE_NFS_RENAME_EVENT_DONE(nfs_async_rename_done);
  812. TRACE_EVENT(nfs_sillyrename_unlink,
  813. TP_PROTO(
  814. const struct nfs_unlinkdata *data,
  815. int error
  816. ),
  817. TP_ARGS(data, error),
  818. TP_STRUCT__entry(
  819. __field(dev_t, dev)
  820. __field(unsigned long, error)
  821. __field(u64, dir)
  822. __dynamic_array(char, name, data->args.name.len + 1)
  823. ),
  824. TP_fast_assign(
  825. struct inode *dir = d_inode(data->dentry->d_parent);
  826. size_t len = data->args.name.len;
  827. __entry->dev = dir->i_sb->s_dev;
  828. __entry->dir = NFS_FILEID(dir);
  829. __entry->error = -error;
  830. memcpy(__get_str(name),
  831. data->args.name.name, len);
  832. __get_str(name)[len] = 0;
  833. ),
  834. TP_printk(
  835. "error=%ld (%s) name=%02x:%02x:%llu/%s",
  836. -__entry->error, show_nfs_status(__entry->error),
  837. MAJOR(__entry->dev), MINOR(__entry->dev),
  838. (unsigned long long)__entry->dir,
  839. __get_str(name)
  840. )
  841. );
  842. DECLARE_EVENT_CLASS(nfs_folio_event,
  843. TP_PROTO(
  844. const struct inode *inode,
  845. loff_t offset,
  846. size_t count
  847. ),
  848. TP_ARGS(inode, offset, count),
  849. TP_STRUCT__entry(
  850. __field(dev_t, dev)
  851. __field(u32, fhandle)
  852. __field(u64, fileid)
  853. __field(u64, version)
  854. __field(loff_t, offset)
  855. __field(size_t, count)
  856. ),
  857. TP_fast_assign(
  858. const struct nfs_inode *nfsi = NFS_I(inode);
  859. __entry->dev = inode->i_sb->s_dev;
  860. __entry->fileid = nfsi->fileid;
  861. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  862. __entry->version = inode_peek_iversion_raw(inode);
  863. __entry->offset = offset;
  864. __entry->count = count;
  865. ),
  866. TP_printk(
  867. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
  868. "offset=%lld count=%zu",
  869. MAJOR(__entry->dev), MINOR(__entry->dev),
  870. (unsigned long long)__entry->fileid,
  871. __entry->fhandle, __entry->version,
  872. __entry->offset, __entry->count
  873. )
  874. );
  875. #define DEFINE_NFS_FOLIO_EVENT(name) \
  876. DEFINE_EVENT(nfs_folio_event, name, \
  877. TP_PROTO( \
  878. const struct inode *inode, \
  879. loff_t offset, \
  880. size_t count \
  881. ), \
  882. TP_ARGS(inode, offset, count))
  883. DECLARE_EVENT_CLASS(nfs_folio_event_done,
  884. TP_PROTO(
  885. const struct inode *inode,
  886. loff_t offset,
  887. size_t count,
  888. int ret
  889. ),
  890. TP_ARGS(inode, offset, count, ret),
  891. TP_STRUCT__entry(
  892. __field(dev_t, dev)
  893. __field(u32, fhandle)
  894. __field(int, ret)
  895. __field(u64, fileid)
  896. __field(u64, version)
  897. __field(loff_t, offset)
  898. __field(size_t, count)
  899. ),
  900. TP_fast_assign(
  901. const struct nfs_inode *nfsi = NFS_I(inode);
  902. __entry->dev = inode->i_sb->s_dev;
  903. __entry->fileid = nfsi->fileid;
  904. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  905. __entry->version = inode_peek_iversion_raw(inode);
  906. __entry->offset = offset;
  907. __entry->count = count;
  908. __entry->ret = ret;
  909. ),
  910. TP_printk(
  911. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu "
  912. "offset=%lld count=%zu ret=%d",
  913. MAJOR(__entry->dev), MINOR(__entry->dev),
  914. (unsigned long long)__entry->fileid,
  915. __entry->fhandle, __entry->version,
  916. __entry->offset, __entry->count, __entry->ret
  917. )
  918. );
  919. #define DEFINE_NFS_FOLIO_EVENT_DONE(name) \
  920. DEFINE_EVENT(nfs_folio_event_done, name, \
  921. TP_PROTO( \
  922. const struct inode *inode, \
  923. loff_t offset, \
  924. size_t count, \
  925. int ret \
  926. ), \
  927. TP_ARGS(inode, offset, count, ret))
  928. DEFINE_NFS_FOLIO_EVENT(nfs_aop_readpage);
  929. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_aop_readpage_done);
  930. DEFINE_NFS_FOLIO_EVENT(nfs_writeback_folio_reclaim);
  931. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_writeback_folio_reclaim_done);
  932. DEFINE_NFS_FOLIO_EVENT(nfs_writeback_folio);
  933. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_writeback_folio_done);
  934. DEFINE_NFS_FOLIO_EVENT(nfs_invalidate_folio);
  935. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_launder_folio_done);
  936. DEFINE_NFS_FOLIO_EVENT(nfs_try_to_update_request);
  937. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_try_to_update_request_done);
  938. DEFINE_NFS_FOLIO_EVENT(nfs_update_folio);
  939. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_update_folio_done);
  940. DEFINE_NFS_FOLIO_EVENT(nfs_write_begin);
  941. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_write_begin_done);
  942. DEFINE_NFS_FOLIO_EVENT(nfs_write_end);
  943. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_write_end_done);
  944. DEFINE_NFS_FOLIO_EVENT(nfs_writepages);
  945. DEFINE_NFS_FOLIO_EVENT_DONE(nfs_writepages_done);
  946. DECLARE_EVENT_CLASS(nfs_kiocb_event,
  947. TP_PROTO(
  948. const struct kiocb *iocb,
  949. const struct iov_iter *iter
  950. ),
  951. TP_ARGS(iocb, iter),
  952. TP_STRUCT__entry(
  953. __field(dev_t, dev)
  954. __field(u32, fhandle)
  955. __field(u64, fileid)
  956. __field(u64, version)
  957. __field(loff_t, offset)
  958. __field(size_t, count)
  959. __field(int, flags)
  960. ),
  961. TP_fast_assign(
  962. const struct inode *inode = file_inode(iocb->ki_filp);
  963. const struct nfs_inode *nfsi = NFS_I(inode);
  964. __entry->dev = inode->i_sb->s_dev;
  965. __entry->fileid = nfsi->fileid;
  966. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  967. __entry->version = inode_peek_iversion_raw(inode);
  968. __entry->offset = iocb->ki_pos;
  969. __entry->count = iov_iter_count(iter);
  970. __entry->flags = iocb->ki_flags;
  971. ),
  972. TP_printk(
  973. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld count=%zu ki_flags=%s",
  974. MAJOR(__entry->dev), MINOR(__entry->dev),
  975. (unsigned long long)__entry->fileid,
  976. __entry->fhandle, __entry->version,
  977. __entry->offset, __entry->count,
  978. __print_flags(__entry->flags, "|", TRACE_IOCB_STRINGS)
  979. )
  980. );
  981. #define DEFINE_NFS_KIOCB_EVENT(name) \
  982. DEFINE_EVENT(nfs_kiocb_event, name, \
  983. TP_PROTO( \
  984. const struct kiocb *iocb, \
  985. const struct iov_iter *iter \
  986. ), \
  987. TP_ARGS(iocb, iter))
  988. DEFINE_NFS_KIOCB_EVENT(nfs_file_read);
  989. DEFINE_NFS_KIOCB_EVENT(nfs_file_write);
  990. TRACE_EVENT(nfs_aop_readahead,
  991. TP_PROTO(
  992. const struct inode *inode,
  993. loff_t pos,
  994. unsigned int nr_pages
  995. ),
  996. TP_ARGS(inode, pos, nr_pages),
  997. TP_STRUCT__entry(
  998. __field(dev_t, dev)
  999. __field(u32, fhandle)
  1000. __field(u64, fileid)
  1001. __field(u64, version)
  1002. __field(loff_t, offset)
  1003. __field(unsigned int, nr_pages)
  1004. ),
  1005. TP_fast_assign(
  1006. const struct nfs_inode *nfsi = NFS_I(inode);
  1007. __entry->dev = inode->i_sb->s_dev;
  1008. __entry->fileid = nfsi->fileid;
  1009. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  1010. __entry->version = inode_peek_iversion_raw(inode);
  1011. __entry->offset = pos;
  1012. __entry->nr_pages = nr_pages;
  1013. ),
  1014. TP_printk(
  1015. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld nr_pages=%u",
  1016. MAJOR(__entry->dev), MINOR(__entry->dev),
  1017. (unsigned long long)__entry->fileid,
  1018. __entry->fhandle, __entry->version,
  1019. __entry->offset, __entry->nr_pages
  1020. )
  1021. );
  1022. TRACE_EVENT(nfs_aop_readahead_done,
  1023. TP_PROTO(
  1024. const struct inode *inode,
  1025. unsigned int nr_pages,
  1026. int ret
  1027. ),
  1028. TP_ARGS(inode, nr_pages, ret),
  1029. TP_STRUCT__entry(
  1030. __field(dev_t, dev)
  1031. __field(u32, fhandle)
  1032. __field(int, ret)
  1033. __field(u64, fileid)
  1034. __field(u64, version)
  1035. __field(loff_t, offset)
  1036. __field(unsigned int, nr_pages)
  1037. ),
  1038. TP_fast_assign(
  1039. const struct nfs_inode *nfsi = NFS_I(inode);
  1040. __entry->dev = inode->i_sb->s_dev;
  1041. __entry->fileid = nfsi->fileid;
  1042. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  1043. __entry->version = inode_peek_iversion_raw(inode);
  1044. __entry->nr_pages = nr_pages;
  1045. __entry->ret = ret;
  1046. ),
  1047. TP_printk(
  1048. "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu nr_pages=%u ret=%d",
  1049. MAJOR(__entry->dev), MINOR(__entry->dev),
  1050. (unsigned long long)__entry->fileid,
  1051. __entry->fhandle, __entry->version,
  1052. __entry->nr_pages, __entry->ret
  1053. )
  1054. );
  1055. TRACE_EVENT(nfs_initiate_read,
  1056. TP_PROTO(
  1057. const struct nfs_pgio_header *hdr
  1058. ),
  1059. TP_ARGS(hdr),
  1060. TP_STRUCT__entry(
  1061. __field(dev_t, dev)
  1062. __field(u32, fhandle)
  1063. __field(u64, fileid)
  1064. __field(loff_t, offset)
  1065. __field(u32, count)
  1066. ),
  1067. TP_fast_assign(
  1068. const struct inode *inode = hdr->inode;
  1069. const struct nfs_inode *nfsi = NFS_I(inode);
  1070. const struct nfs_fh *fh = hdr->args.fh ?
  1071. hdr->args.fh : &nfsi->fh;
  1072. __entry->offset = hdr->args.offset;
  1073. __entry->count = hdr->args.count;
  1074. __entry->dev = inode->i_sb->s_dev;
  1075. __entry->fileid = nfsi->fileid;
  1076. __entry->fhandle = nfs_fhandle_hash(fh);
  1077. ),
  1078. TP_printk(
  1079. "fileid=%02x:%02x:%llu fhandle=0x%08x "
  1080. "offset=%lld count=%u",
  1081. MAJOR(__entry->dev), MINOR(__entry->dev),
  1082. (unsigned long long)__entry->fileid,
  1083. __entry->fhandle,
  1084. (long long)__entry->offset, __entry->count
  1085. )
  1086. );
  1087. TRACE_EVENT(nfs_readpage_done,
  1088. TP_PROTO(
  1089. const struct rpc_task *task,
  1090. const struct nfs_pgio_header *hdr
  1091. ),
  1092. TP_ARGS(task, hdr),
  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, arg_count)
  1099. __field(u32, res_count)
  1100. __field(bool, eof)
  1101. __field(int, error)
  1102. ),
  1103. TP_fast_assign(
  1104. const struct inode *inode = hdr->inode;
  1105. const struct nfs_inode *nfsi = NFS_I(inode);
  1106. const struct nfs_fh *fh = hdr->args.fh ?
  1107. hdr->args.fh : &nfsi->fh;
  1108. __entry->error = task->tk_status;
  1109. __entry->offset = hdr->args.offset;
  1110. __entry->arg_count = hdr->args.count;
  1111. __entry->res_count = hdr->res.count;
  1112. __entry->eof = hdr->res.eof;
  1113. __entry->dev = inode->i_sb->s_dev;
  1114. __entry->fileid = nfsi->fileid;
  1115. __entry->fhandle = nfs_fhandle_hash(fh);
  1116. ),
  1117. TP_printk(
  1118. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1119. "offset=%lld count=%u res=%u%s", __entry->error,
  1120. MAJOR(__entry->dev), MINOR(__entry->dev),
  1121. (unsigned long long)__entry->fileid,
  1122. __entry->fhandle,
  1123. (long long)__entry->offset, __entry->arg_count,
  1124. __entry->res_count, __entry->eof ? " eof" : ""
  1125. )
  1126. );
  1127. TRACE_EVENT(nfs_readpage_short,
  1128. TP_PROTO(
  1129. const struct rpc_task *task,
  1130. const struct nfs_pgio_header *hdr
  1131. ),
  1132. TP_ARGS(task, hdr),
  1133. TP_STRUCT__entry(
  1134. __field(dev_t, dev)
  1135. __field(u32, fhandle)
  1136. __field(u64, fileid)
  1137. __field(loff_t, offset)
  1138. __field(u32, arg_count)
  1139. __field(u32, res_count)
  1140. __field(bool, eof)
  1141. __field(int, error)
  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. __entry->error = task->tk_status;
  1149. __entry->offset = hdr->args.offset;
  1150. __entry->arg_count = hdr->args.count;
  1151. __entry->res_count = hdr->res.count;
  1152. __entry->eof = hdr->res.eof;
  1153. __entry->dev = inode->i_sb->s_dev;
  1154. __entry->fileid = nfsi->fileid;
  1155. __entry->fhandle = nfs_fhandle_hash(fh);
  1156. ),
  1157. TP_printk(
  1158. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1159. "offset=%lld count=%u res=%u%s", __entry->error,
  1160. MAJOR(__entry->dev), MINOR(__entry->dev),
  1161. (unsigned long long)__entry->fileid,
  1162. __entry->fhandle,
  1163. (long long)__entry->offset, __entry->arg_count,
  1164. __entry->res_count, __entry->eof ? " eof" : ""
  1165. )
  1166. );
  1167. TRACE_EVENT(nfs_pgio_error,
  1168. TP_PROTO(
  1169. const struct nfs_pgio_header *hdr,
  1170. int error,
  1171. loff_t pos
  1172. ),
  1173. TP_ARGS(hdr, error, pos),
  1174. TP_STRUCT__entry(
  1175. __field(dev_t, dev)
  1176. __field(u32, fhandle)
  1177. __field(u64, fileid)
  1178. __field(loff_t, offset)
  1179. __field(u32, arg_count)
  1180. __field(u32, res_count)
  1181. __field(loff_t, pos)
  1182. __field(int, error)
  1183. ),
  1184. TP_fast_assign(
  1185. const struct inode *inode = hdr->inode;
  1186. const struct nfs_inode *nfsi = NFS_I(inode);
  1187. const struct nfs_fh *fh = hdr->args.fh ?
  1188. hdr->args.fh : &nfsi->fh;
  1189. __entry->error = error;
  1190. __entry->offset = hdr->args.offset;
  1191. __entry->arg_count = hdr->args.count;
  1192. __entry->res_count = hdr->res.count;
  1193. __entry->dev = inode->i_sb->s_dev;
  1194. __entry->fileid = nfsi->fileid;
  1195. __entry->fhandle = nfs_fhandle_hash(fh);
  1196. ),
  1197. TP_printk("error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1198. "offset=%lld count=%u res=%u pos=%llu", __entry->error,
  1199. MAJOR(__entry->dev), MINOR(__entry->dev),
  1200. (unsigned long long)__entry->fileid, __entry->fhandle,
  1201. (long long)__entry->offset, __entry->arg_count, __entry->res_count,
  1202. __entry->pos
  1203. )
  1204. );
  1205. TRACE_EVENT(nfs_initiate_write,
  1206. TP_PROTO(
  1207. const struct nfs_pgio_header *hdr
  1208. ),
  1209. TP_ARGS(hdr),
  1210. TP_STRUCT__entry(
  1211. __field(dev_t, dev)
  1212. __field(u32, fhandle)
  1213. __field(u64, fileid)
  1214. __field(loff_t, offset)
  1215. __field(u32, count)
  1216. __field(unsigned long, stable)
  1217. ),
  1218. TP_fast_assign(
  1219. const struct inode *inode = hdr->inode;
  1220. const struct nfs_inode *nfsi = NFS_I(inode);
  1221. const struct nfs_fh *fh = hdr->args.fh ?
  1222. hdr->args.fh : &nfsi->fh;
  1223. __entry->offset = hdr->args.offset;
  1224. __entry->count = hdr->args.count;
  1225. __entry->stable = hdr->args.stable;
  1226. __entry->dev = inode->i_sb->s_dev;
  1227. __entry->fileid = nfsi->fileid;
  1228. __entry->fhandle = nfs_fhandle_hash(fh);
  1229. ),
  1230. TP_printk(
  1231. "fileid=%02x:%02x:%llu fhandle=0x%08x "
  1232. "offset=%lld count=%u stable=%s",
  1233. MAJOR(__entry->dev), MINOR(__entry->dev),
  1234. (unsigned long long)__entry->fileid,
  1235. __entry->fhandle,
  1236. (long long)__entry->offset, __entry->count,
  1237. show_nfs_stable_how(__entry->stable)
  1238. )
  1239. );
  1240. TRACE_EVENT(nfs_writeback_done,
  1241. TP_PROTO(
  1242. const struct rpc_task *task,
  1243. const struct nfs_pgio_header *hdr
  1244. ),
  1245. TP_ARGS(task, hdr),
  1246. TP_STRUCT__entry(
  1247. __field(dev_t, dev)
  1248. __field(u32, fhandle)
  1249. __field(u64, fileid)
  1250. __field(loff_t, offset)
  1251. __field(u32, arg_count)
  1252. __field(u32, res_count)
  1253. __field(int, error)
  1254. __field(unsigned long, stable)
  1255. __array(char, verifier, NFS4_VERIFIER_SIZE)
  1256. ),
  1257. TP_fast_assign(
  1258. const struct inode *inode = hdr->inode;
  1259. const struct nfs_inode *nfsi = NFS_I(inode);
  1260. const struct nfs_fh *fh = hdr->args.fh ?
  1261. hdr->args.fh : &nfsi->fh;
  1262. const struct nfs_writeverf *verf = hdr->res.verf;
  1263. __entry->error = task->tk_status;
  1264. __entry->offset = hdr->args.offset;
  1265. __entry->arg_count = hdr->args.count;
  1266. __entry->res_count = hdr->res.count;
  1267. __entry->stable = verf->committed;
  1268. memcpy(__entry->verifier,
  1269. &verf->verifier,
  1270. NFS4_VERIFIER_SIZE);
  1271. __entry->dev = inode->i_sb->s_dev;
  1272. __entry->fileid = nfsi->fileid;
  1273. __entry->fhandle = nfs_fhandle_hash(fh);
  1274. ),
  1275. TP_printk(
  1276. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1277. "offset=%lld count=%u res=%u stable=%s "
  1278. "verifier=%s", __entry->error,
  1279. MAJOR(__entry->dev), MINOR(__entry->dev),
  1280. (unsigned long long)__entry->fileid,
  1281. __entry->fhandle,
  1282. (long long)__entry->offset, __entry->arg_count,
  1283. __entry->res_count,
  1284. show_nfs_stable_how(__entry->stable),
  1285. show_nfs4_verifier(__entry->verifier)
  1286. )
  1287. );
  1288. DECLARE_EVENT_CLASS(nfs_page_class,
  1289. TP_PROTO(
  1290. const struct nfs_page *req
  1291. ),
  1292. TP_ARGS(req),
  1293. TP_STRUCT__entry(
  1294. __field(dev_t, dev)
  1295. __field(u32, fhandle)
  1296. __field(u64, fileid)
  1297. __field(const struct nfs_page *__private, req)
  1298. __field(loff_t, offset)
  1299. __field(unsigned int, count)
  1300. __field(unsigned long, flags)
  1301. ),
  1302. TP_fast_assign(
  1303. const struct inode *inode = folio_inode(req->wb_folio);
  1304. const struct nfs_inode *nfsi = NFS_I(inode);
  1305. __entry->dev = inode->i_sb->s_dev;
  1306. __entry->fileid = nfsi->fileid;
  1307. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  1308. __entry->req = req;
  1309. __entry->offset = req_offset(req);
  1310. __entry->count = req->wb_bytes;
  1311. __entry->flags = req->wb_flags;
  1312. ),
  1313. TP_printk(
  1314. "fileid=%02x:%02x:%llu fhandle=0x%08x req=%p offset=%lld count=%u flags=%s",
  1315. MAJOR(__entry->dev), MINOR(__entry->dev),
  1316. (unsigned long long)__entry->fileid, __entry->fhandle,
  1317. __entry->req, __entry->offset, __entry->count,
  1318. nfs_show_wb_flags(__entry->flags)
  1319. )
  1320. );
  1321. #define DEFINE_NFS_PAGE_EVENT(name) \
  1322. DEFINE_EVENT(nfs_page_class, name, \
  1323. TP_PROTO( \
  1324. const struct nfs_page *req \
  1325. ), \
  1326. TP_ARGS(req))
  1327. DEFINE_NFS_PAGE_EVENT(nfs_writepage_setup);
  1328. DEFINE_NFS_PAGE_EVENT(nfs_do_writepage);
  1329. DECLARE_EVENT_CLASS(nfs_page_error_class,
  1330. TP_PROTO(
  1331. const struct inode *inode,
  1332. const struct nfs_page *req,
  1333. int error
  1334. ),
  1335. TP_ARGS(inode, req, error),
  1336. TP_STRUCT__entry(
  1337. __field(dev_t, dev)
  1338. __field(u32, fhandle)
  1339. __field(u64, fileid)
  1340. __field(loff_t, offset)
  1341. __field(unsigned int, count)
  1342. __field(int, error)
  1343. ),
  1344. TP_fast_assign(
  1345. const struct nfs_inode *nfsi = NFS_I(inode);
  1346. __entry->dev = inode->i_sb->s_dev;
  1347. __entry->fileid = nfsi->fileid;
  1348. __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
  1349. __entry->offset = req_offset(req);
  1350. __entry->count = req->wb_bytes;
  1351. __entry->error = error;
  1352. ),
  1353. TP_printk(
  1354. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1355. "offset=%lld count=%u", __entry->error,
  1356. MAJOR(__entry->dev), MINOR(__entry->dev),
  1357. (unsigned long long)__entry->fileid,
  1358. __entry->fhandle, __entry->offset,
  1359. __entry->count
  1360. )
  1361. );
  1362. #define DEFINE_NFS_PAGEERR_EVENT(name) \
  1363. DEFINE_EVENT(nfs_page_error_class, name, \
  1364. TP_PROTO( \
  1365. const struct inode *inode, \
  1366. const struct nfs_page *req, \
  1367. int error \
  1368. ), \
  1369. TP_ARGS(inode, req, error))
  1370. DEFINE_NFS_PAGEERR_EVENT(nfs_write_error);
  1371. DEFINE_NFS_PAGEERR_EVENT(nfs_comp_error);
  1372. DEFINE_NFS_PAGEERR_EVENT(nfs_commit_error);
  1373. TRACE_EVENT(nfs_initiate_commit,
  1374. TP_PROTO(
  1375. const struct nfs_commit_data *data
  1376. ),
  1377. TP_ARGS(data),
  1378. TP_STRUCT__entry(
  1379. __field(dev_t, dev)
  1380. __field(u32, fhandle)
  1381. __field(u64, fileid)
  1382. __field(loff_t, offset)
  1383. __field(u32, count)
  1384. ),
  1385. TP_fast_assign(
  1386. const struct inode *inode = data->inode;
  1387. const struct nfs_inode *nfsi = NFS_I(inode);
  1388. const struct nfs_fh *fh = data->args.fh ?
  1389. data->args.fh : &nfsi->fh;
  1390. __entry->offset = data->args.offset;
  1391. __entry->count = data->args.count;
  1392. __entry->dev = inode->i_sb->s_dev;
  1393. __entry->fileid = nfsi->fileid;
  1394. __entry->fhandle = nfs_fhandle_hash(fh);
  1395. ),
  1396. TP_printk(
  1397. "fileid=%02x:%02x:%llu fhandle=0x%08x "
  1398. "offset=%lld count=%u",
  1399. MAJOR(__entry->dev), MINOR(__entry->dev),
  1400. (unsigned long long)__entry->fileid,
  1401. __entry->fhandle,
  1402. (long long)__entry->offset, __entry->count
  1403. )
  1404. );
  1405. TRACE_EVENT(nfs_commit_done,
  1406. TP_PROTO(
  1407. const struct rpc_task *task,
  1408. const struct nfs_commit_data *data
  1409. ),
  1410. TP_ARGS(task, data),
  1411. TP_STRUCT__entry(
  1412. __field(dev_t, dev)
  1413. __field(u32, fhandle)
  1414. __field(u64, fileid)
  1415. __field(loff_t, offset)
  1416. __field(int, error)
  1417. __field(unsigned long, stable)
  1418. __array(char, verifier, NFS4_VERIFIER_SIZE)
  1419. ),
  1420. TP_fast_assign(
  1421. const struct inode *inode = data->inode;
  1422. const struct nfs_inode *nfsi = NFS_I(inode);
  1423. const struct nfs_fh *fh = data->args.fh ?
  1424. data->args.fh : &nfsi->fh;
  1425. const struct nfs_writeverf *verf = data->res.verf;
  1426. __entry->error = task->tk_status;
  1427. __entry->offset = data->args.offset;
  1428. __entry->stable = verf->committed;
  1429. memcpy(__entry->verifier,
  1430. &verf->verifier,
  1431. NFS4_VERIFIER_SIZE);
  1432. __entry->dev = inode->i_sb->s_dev;
  1433. __entry->fileid = nfsi->fileid;
  1434. __entry->fhandle = nfs_fhandle_hash(fh);
  1435. ),
  1436. TP_printk(
  1437. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x "
  1438. "offset=%lld stable=%s verifier=%s", __entry->error,
  1439. MAJOR(__entry->dev), MINOR(__entry->dev),
  1440. (unsigned long long)__entry->fileid,
  1441. __entry->fhandle,
  1442. (long long)__entry->offset,
  1443. show_nfs_stable_how(__entry->stable),
  1444. show_nfs4_verifier(__entry->verifier)
  1445. )
  1446. );
  1447. #define nfs_show_direct_req_flags(v) \
  1448. __print_flags(v, "|", \
  1449. { NFS_ODIRECT_DO_COMMIT, "DO_COMMIT" }, \
  1450. { NFS_ODIRECT_RESCHED_WRITES, "RESCHED_WRITES" }, \
  1451. { NFS_ODIRECT_SHOULD_DIRTY, "SHOULD DIRTY" }, \
  1452. { NFS_ODIRECT_DONE, "DONE" } )
  1453. DECLARE_EVENT_CLASS(nfs_direct_req_class,
  1454. TP_PROTO(
  1455. const struct nfs_direct_req *dreq
  1456. ),
  1457. TP_ARGS(dreq),
  1458. TP_STRUCT__entry(
  1459. __field(dev_t, dev)
  1460. __field(u64, fileid)
  1461. __field(u32, fhandle)
  1462. __field(loff_t, offset)
  1463. __field(ssize_t, count)
  1464. __field(ssize_t, error)
  1465. __field(int, flags)
  1466. ),
  1467. TP_fast_assign(
  1468. const struct inode *inode = dreq->inode;
  1469. const struct nfs_inode *nfsi = NFS_I(inode);
  1470. const struct nfs_fh *fh = &nfsi->fh;
  1471. __entry->dev = inode->i_sb->s_dev;
  1472. __entry->fileid = nfsi->fileid;
  1473. __entry->fhandle = nfs_fhandle_hash(fh);
  1474. __entry->offset = dreq->io_start;
  1475. __entry->count = dreq->count;
  1476. __entry->error = dreq->error;
  1477. __entry->flags = dreq->flags;
  1478. ),
  1479. TP_printk(
  1480. "error=%zd fileid=%02x:%02x:%llu fhandle=0x%08x "
  1481. "offset=%lld count=%zd flags=%s",
  1482. __entry->error, MAJOR(__entry->dev),
  1483. MINOR(__entry->dev),
  1484. (unsigned long long)__entry->fileid,
  1485. __entry->fhandle, __entry->offset,
  1486. __entry->count,
  1487. nfs_show_direct_req_flags(__entry->flags)
  1488. )
  1489. );
  1490. #define DEFINE_NFS_DIRECT_REQ_EVENT(name) \
  1491. DEFINE_EVENT(nfs_direct_req_class, name, \
  1492. TP_PROTO( \
  1493. const struct nfs_direct_req *dreq \
  1494. ), \
  1495. TP_ARGS(dreq))
  1496. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_commit_complete);
  1497. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_resched_write);
  1498. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_complete);
  1499. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_completion);
  1500. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_schedule_iovec);
  1501. DEFINE_NFS_DIRECT_REQ_EVENT(nfs_direct_write_reschedule_io);
  1502. #if IS_ENABLED(CONFIG_NFS_LOCALIO)
  1503. DECLARE_EVENT_CLASS(nfs_local_dio_class,
  1504. TP_PROTO(
  1505. const struct inode *inode,
  1506. loff_t offset,
  1507. ssize_t count,
  1508. const struct nfs_local_dio *local_dio
  1509. ),
  1510. TP_ARGS(inode, offset, count, local_dio),
  1511. TP_STRUCT__entry(
  1512. __field(dev_t, dev)
  1513. __field(u64, fileid)
  1514. __field(u32, fhandle)
  1515. __field(loff_t, offset)
  1516. __field(ssize_t, count)
  1517. __field(u32, mem_align)
  1518. __field(u32, offset_align)
  1519. __field(loff_t, start)
  1520. __field(ssize_t, start_len)
  1521. __field(loff_t, middle)
  1522. __field(ssize_t, middle_len)
  1523. __field(loff_t, end)
  1524. __field(ssize_t, end_len)
  1525. ),
  1526. TP_fast_assign(
  1527. const struct nfs_inode *nfsi = NFS_I(inode);
  1528. const struct nfs_fh *fh = &nfsi->fh;
  1529. __entry->dev = inode->i_sb->s_dev;
  1530. __entry->fileid = nfsi->fileid;
  1531. __entry->fhandle = nfs_fhandle_hash(fh);
  1532. __entry->offset = offset;
  1533. __entry->count = count;
  1534. __entry->mem_align = local_dio->mem_align;
  1535. __entry->offset_align = local_dio->offset_align;
  1536. __entry->start = offset;
  1537. __entry->start_len = local_dio->start_len;
  1538. __entry->middle = local_dio->middle_offset;
  1539. __entry->middle_len = local_dio->middle_len;
  1540. __entry->end = local_dio->end_offset;
  1541. __entry->end_len = local_dio->end_len;
  1542. ),
  1543. TP_printk("fileid=%02x:%02x:%llu fhandle=0x%08x "
  1544. "offset=%lld count=%zd "
  1545. "mem_align=%u offset_align=%u "
  1546. "start=%llu+%zd middle=%llu+%zd end=%llu+%zd",
  1547. MAJOR(__entry->dev), MINOR(__entry->dev),
  1548. (unsigned long long)__entry->fileid,
  1549. __entry->fhandle, __entry->offset, __entry->count,
  1550. __entry->mem_align, __entry->offset_align,
  1551. __entry->start, __entry->start_len,
  1552. __entry->middle, __entry->middle_len,
  1553. __entry->end, __entry->end_len)
  1554. )
  1555. #define DEFINE_NFS_LOCAL_DIO_EVENT(name) \
  1556. DEFINE_EVENT(nfs_local_dio_class, nfs_local_dio_##name, \
  1557. TP_PROTO(const struct inode *inode, \
  1558. loff_t offset, \
  1559. ssize_t count, \
  1560. const struct nfs_local_dio *local_dio),\
  1561. TP_ARGS(inode, offset, count, local_dio))
  1562. DEFINE_NFS_LOCAL_DIO_EVENT(read);
  1563. DEFINE_NFS_LOCAL_DIO_EVENT(write);
  1564. DEFINE_NFS_LOCAL_DIO_EVENT(misaligned);
  1565. #endif /* CONFIG_NFS_LOCALIO */
  1566. TRACE_EVENT(nfs_fh_to_dentry,
  1567. TP_PROTO(
  1568. const struct super_block *sb,
  1569. const struct nfs_fh *fh,
  1570. u64 fileid,
  1571. int error
  1572. ),
  1573. TP_ARGS(sb, fh, fileid, error),
  1574. TP_STRUCT__entry(
  1575. __field(int, error)
  1576. __field(dev_t, dev)
  1577. __field(u32, fhandle)
  1578. __field(u64, fileid)
  1579. ),
  1580. TP_fast_assign(
  1581. __entry->error = error;
  1582. __entry->dev = sb->s_dev;
  1583. __entry->fileid = fileid;
  1584. __entry->fhandle = nfs_fhandle_hash(fh);
  1585. ),
  1586. TP_printk(
  1587. "error=%d fileid=%02x:%02x:%llu fhandle=0x%08x ",
  1588. __entry->error,
  1589. MAJOR(__entry->dev), MINOR(__entry->dev),
  1590. (unsigned long long)__entry->fileid,
  1591. __entry->fhandle
  1592. )
  1593. );
  1594. TRACE_EVENT(nfs_mount_assign,
  1595. TP_PROTO(
  1596. const char *option,
  1597. const char *value
  1598. ),
  1599. TP_ARGS(option, value),
  1600. TP_STRUCT__entry(
  1601. __string(option, option)
  1602. __string(value, value)
  1603. ),
  1604. TP_fast_assign(
  1605. __assign_str(option);
  1606. __assign_str(value);
  1607. ),
  1608. TP_printk("option %s=%s",
  1609. __get_str(option), __get_str(value)
  1610. )
  1611. );
  1612. TRACE_EVENT(nfs_mount_option,
  1613. TP_PROTO(
  1614. const struct fs_parameter *param
  1615. ),
  1616. TP_ARGS(param),
  1617. TP_STRUCT__entry(
  1618. __string(option, param->key)
  1619. ),
  1620. TP_fast_assign(
  1621. __assign_str(option);
  1622. ),
  1623. TP_printk("option %s", __get_str(option))
  1624. );
  1625. TRACE_EVENT(nfs_mount_path,
  1626. TP_PROTO(
  1627. const char *path
  1628. ),
  1629. TP_ARGS(path),
  1630. TP_STRUCT__entry(
  1631. __string(path, path)
  1632. ),
  1633. TP_fast_assign(
  1634. __assign_str(path);
  1635. ),
  1636. TP_printk("path='%s'", __get_str(path))
  1637. );
  1638. TRACE_EVENT(nfs_local_open_fh,
  1639. TP_PROTO(
  1640. const struct nfs_fh *fh,
  1641. fmode_t fmode,
  1642. int error
  1643. ),
  1644. TP_ARGS(fh, fmode, error),
  1645. TP_STRUCT__entry(
  1646. __field(int, error)
  1647. __field(u32, fhandle)
  1648. __field(unsigned int, fmode)
  1649. ),
  1650. TP_fast_assign(
  1651. __entry->error = error;
  1652. __entry->fhandle = nfs_fhandle_hash(fh);
  1653. __entry->fmode = (__force unsigned int)fmode;
  1654. ),
  1655. TP_printk(
  1656. "fhandle=0x%08x mode=%s result=%d",
  1657. __entry->fhandle,
  1658. show_fs_fmode_flags(__entry->fmode),
  1659. __entry->error
  1660. )
  1661. );
  1662. DECLARE_EVENT_CLASS(nfs_xdr_event,
  1663. TP_PROTO(
  1664. const struct xdr_stream *xdr,
  1665. int error
  1666. ),
  1667. TP_ARGS(xdr, error),
  1668. TP_STRUCT__entry(
  1669. __field(unsigned int, task_id)
  1670. __field(unsigned int, client_id)
  1671. __field(u32, xid)
  1672. __field(int, version)
  1673. __field(unsigned long, error)
  1674. __string(program,
  1675. xdr->rqst->rq_task->tk_client->cl_program->name)
  1676. __string(procedure,
  1677. xdr->rqst->rq_task->tk_msg.rpc_proc->p_name)
  1678. ),
  1679. TP_fast_assign(
  1680. const struct rpc_rqst *rqstp = xdr->rqst;
  1681. const struct rpc_task *task = rqstp->rq_task;
  1682. __entry->task_id = task->tk_pid;
  1683. __entry->client_id = task->tk_client->cl_clid;
  1684. __entry->xid = be32_to_cpu(rqstp->rq_xid);
  1685. __entry->version = task->tk_client->cl_vers;
  1686. __entry->error = error;
  1687. __assign_str(program);
  1688. __assign_str(procedure);
  1689. ),
  1690. TP_printk(SUNRPC_TRACE_TASK_SPECIFIER
  1691. " xid=0x%08x %sv%d %s error=%ld (%s)",
  1692. __entry->task_id, __entry->client_id, __entry->xid,
  1693. __get_str(program), __entry->version,
  1694. __get_str(procedure), -__entry->error,
  1695. show_nfs_status(__entry->error)
  1696. )
  1697. );
  1698. #define DEFINE_NFS_XDR_EVENT(name) \
  1699. DEFINE_EVENT(nfs_xdr_event, name, \
  1700. TP_PROTO( \
  1701. const struct xdr_stream *xdr, \
  1702. int error \
  1703. ), \
  1704. TP_ARGS(xdr, error))
  1705. DEFINE_NFS_XDR_EVENT(nfs_xdr_status);
  1706. DEFINE_NFS_XDR_EVENT(nfs_xdr_bad_filehandle);
  1707. #endif /* _TRACE_NFS_H */
  1708. #undef TRACE_INCLUDE_PATH
  1709. #define TRACE_INCLUDE_PATH .
  1710. #define TRACE_INCLUDE_FILE nfstrace
  1711. /* This part must be outside protection */
  1712. #include <trace/define_trace.h>