cachefiles.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /* CacheFiles tracepoints
  3. *
  4. * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
  5. * Written by David Howells ([email protected])
  6. */
  7. #undef TRACE_SYSTEM
  8. #define TRACE_SYSTEM cachefiles
  9. #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ)
  10. #define _TRACE_CACHEFILES_H
  11. #include <linux/tracepoint.h>
  12. /*
  13. * Define enums for tracing information.
  14. */
  15. #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
  16. #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
  17. enum cachefiles_obj_ref_trace {
  18. cachefiles_obj_get_ioreq,
  19. cachefiles_obj_new,
  20. cachefiles_obj_put_alloc_fail,
  21. cachefiles_obj_put_detach,
  22. cachefiles_obj_put_ioreq,
  23. cachefiles_obj_see_clean_commit,
  24. cachefiles_obj_see_clean_delete,
  25. cachefiles_obj_see_clean_drop_tmp,
  26. cachefiles_obj_see_lookup_cookie,
  27. cachefiles_obj_see_lookup_failed,
  28. cachefiles_obj_see_withdraw_cookie,
  29. cachefiles_obj_see_withdrawal,
  30. cachefiles_obj_get_ondemand_fd,
  31. cachefiles_obj_put_ondemand_fd,
  32. };
  33. enum fscache_why_object_killed {
  34. FSCACHE_OBJECT_IS_STALE,
  35. FSCACHE_OBJECT_IS_WEIRD,
  36. FSCACHE_OBJECT_INVALIDATED,
  37. FSCACHE_OBJECT_NO_SPACE,
  38. FSCACHE_OBJECT_WAS_RETIRED,
  39. FSCACHE_OBJECT_WAS_CULLED,
  40. FSCACHE_VOLUME_IS_WEIRD,
  41. };
  42. enum cachefiles_coherency_trace {
  43. cachefiles_coherency_check_aux,
  44. cachefiles_coherency_check_content,
  45. cachefiles_coherency_check_dirty,
  46. cachefiles_coherency_check_len,
  47. cachefiles_coherency_check_objsize,
  48. cachefiles_coherency_check_ok,
  49. cachefiles_coherency_check_type,
  50. cachefiles_coherency_check_xattr,
  51. cachefiles_coherency_set_fail,
  52. cachefiles_coherency_set_ok,
  53. cachefiles_coherency_vol_check_cmp,
  54. cachefiles_coherency_vol_check_ok,
  55. cachefiles_coherency_vol_check_resv,
  56. cachefiles_coherency_vol_check_xattr,
  57. cachefiles_coherency_vol_set_fail,
  58. cachefiles_coherency_vol_set_ok,
  59. };
  60. enum cachefiles_trunc_trace {
  61. cachefiles_trunc_dio_adjust,
  62. cachefiles_trunc_expand_tmpfile,
  63. cachefiles_trunc_shrink,
  64. };
  65. enum cachefiles_prepare_read_trace {
  66. cachefiles_trace_read_after_eof,
  67. cachefiles_trace_read_found_hole,
  68. cachefiles_trace_read_found_part,
  69. cachefiles_trace_read_have_data,
  70. cachefiles_trace_read_no_data,
  71. cachefiles_trace_read_no_file,
  72. cachefiles_trace_read_seek_error,
  73. cachefiles_trace_read_seek_nxio,
  74. };
  75. enum cachefiles_error_trace {
  76. cachefiles_trace_fallocate_error,
  77. cachefiles_trace_getxattr_error,
  78. cachefiles_trace_link_error,
  79. cachefiles_trace_lookup_error,
  80. cachefiles_trace_mkdir_error,
  81. cachefiles_trace_notify_change_error,
  82. cachefiles_trace_open_error,
  83. cachefiles_trace_read_error,
  84. cachefiles_trace_remxattr_error,
  85. cachefiles_trace_rename_error,
  86. cachefiles_trace_seek_error,
  87. cachefiles_trace_setxattr_error,
  88. cachefiles_trace_statfs_error,
  89. cachefiles_trace_tmpfile_error,
  90. cachefiles_trace_trunc_error,
  91. cachefiles_trace_unlink_error,
  92. cachefiles_trace_write_error,
  93. };
  94. #endif
  95. /*
  96. * Define enum -> string mappings for display.
  97. */
  98. #define cachefiles_obj_kill_traces \
  99. EM(FSCACHE_OBJECT_IS_STALE, "stale") \
  100. EM(FSCACHE_OBJECT_IS_WEIRD, "weird") \
  101. EM(FSCACHE_OBJECT_INVALIDATED, "inval") \
  102. EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \
  103. EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \
  104. EM(FSCACHE_OBJECT_WAS_CULLED, "was_culled") \
  105. E_(FSCACHE_VOLUME_IS_WEIRD, "volume_weird")
  106. #define cachefiles_obj_ref_traces \
  107. EM(cachefiles_obj_get_ioreq, "GET ioreq") \
  108. EM(cachefiles_obj_new, "NEW obj") \
  109. EM(cachefiles_obj_put_alloc_fail, "PUT alloc_fail") \
  110. EM(cachefiles_obj_put_detach, "PUT detach") \
  111. EM(cachefiles_obj_put_ioreq, "PUT ioreq") \
  112. EM(cachefiles_obj_see_clean_commit, "SEE clean_commit") \
  113. EM(cachefiles_obj_see_clean_delete, "SEE clean_delete") \
  114. EM(cachefiles_obj_see_clean_drop_tmp, "SEE clean_drop_tmp") \
  115. EM(cachefiles_obj_see_lookup_cookie, "SEE lookup_cookie") \
  116. EM(cachefiles_obj_see_lookup_failed, "SEE lookup_failed") \
  117. EM(cachefiles_obj_see_withdraw_cookie, "SEE withdraw_cookie") \
  118. E_(cachefiles_obj_see_withdrawal, "SEE withdrawal")
  119. #define cachefiles_coherency_traces \
  120. EM(cachefiles_coherency_check_aux, "BAD aux ") \
  121. EM(cachefiles_coherency_check_content, "BAD cont") \
  122. EM(cachefiles_coherency_check_dirty, "BAD dirt") \
  123. EM(cachefiles_coherency_check_len, "BAD len ") \
  124. EM(cachefiles_coherency_check_objsize, "BAD osiz") \
  125. EM(cachefiles_coherency_check_ok, "OK ") \
  126. EM(cachefiles_coherency_check_type, "BAD type") \
  127. EM(cachefiles_coherency_check_xattr, "BAD xatt") \
  128. EM(cachefiles_coherency_set_fail, "SET fail") \
  129. EM(cachefiles_coherency_set_ok, "SET ok ") \
  130. EM(cachefiles_coherency_vol_check_cmp, "VOL BAD cmp ") \
  131. EM(cachefiles_coherency_vol_check_ok, "VOL OK ") \
  132. EM(cachefiles_coherency_vol_check_resv, "VOL BAD resv") \
  133. EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt") \
  134. EM(cachefiles_coherency_vol_set_fail, "VOL SET fail") \
  135. E_(cachefiles_coherency_vol_set_ok, "VOL SET ok ")
  136. #define cachefiles_trunc_traces \
  137. EM(cachefiles_trunc_dio_adjust, "DIOADJ") \
  138. EM(cachefiles_trunc_expand_tmpfile, "EXPTMP") \
  139. E_(cachefiles_trunc_shrink, "SHRINK")
  140. #define cachefiles_prepare_read_traces \
  141. EM(cachefiles_trace_read_after_eof, "after-eof ") \
  142. EM(cachefiles_trace_read_found_hole, "found-hole") \
  143. EM(cachefiles_trace_read_found_part, "found-part") \
  144. EM(cachefiles_trace_read_have_data, "have-data ") \
  145. EM(cachefiles_trace_read_no_data, "no-data ") \
  146. EM(cachefiles_trace_read_no_file, "no-file ") \
  147. EM(cachefiles_trace_read_seek_error, "seek-error") \
  148. E_(cachefiles_trace_read_seek_nxio, "seek-enxio")
  149. #define cachefiles_error_traces \
  150. EM(cachefiles_trace_fallocate_error, "fallocate") \
  151. EM(cachefiles_trace_getxattr_error, "getxattr") \
  152. EM(cachefiles_trace_link_error, "link") \
  153. EM(cachefiles_trace_lookup_error, "lookup") \
  154. EM(cachefiles_trace_mkdir_error, "mkdir") \
  155. EM(cachefiles_trace_notify_change_error, "notify_change") \
  156. EM(cachefiles_trace_open_error, "open") \
  157. EM(cachefiles_trace_read_error, "read") \
  158. EM(cachefiles_trace_remxattr_error, "remxattr") \
  159. EM(cachefiles_trace_rename_error, "rename") \
  160. EM(cachefiles_trace_seek_error, "seek") \
  161. EM(cachefiles_trace_setxattr_error, "setxattr") \
  162. EM(cachefiles_trace_statfs_error, "statfs") \
  163. EM(cachefiles_trace_tmpfile_error, "tmpfile") \
  164. EM(cachefiles_trace_trunc_error, "trunc") \
  165. EM(cachefiles_trace_unlink_error, "unlink") \
  166. E_(cachefiles_trace_write_error, "write")
  167. /*
  168. * Export enum symbols via userspace.
  169. */
  170. #undef EM
  171. #undef E_
  172. #define EM(a, b) TRACE_DEFINE_ENUM(a);
  173. #define E_(a, b) TRACE_DEFINE_ENUM(a);
  174. cachefiles_obj_kill_traces;
  175. cachefiles_obj_ref_traces;
  176. cachefiles_coherency_traces;
  177. cachefiles_trunc_traces;
  178. cachefiles_prepare_read_traces;
  179. cachefiles_error_traces;
  180. /*
  181. * Now redefine the EM() and E_() macros to map the enums to the strings that
  182. * will be printed in the output.
  183. */
  184. #undef EM
  185. #undef E_
  186. #define EM(a, b) { a, b },
  187. #define E_(a, b) { a, b }
  188. TRACE_EVENT(cachefiles_ref,
  189. TP_PROTO(unsigned int object_debug_id,
  190. unsigned int cookie_debug_id,
  191. int usage,
  192. enum cachefiles_obj_ref_trace why),
  193. TP_ARGS(object_debug_id, cookie_debug_id, usage, why),
  194. /* Note that obj may be NULL */
  195. TP_STRUCT__entry(
  196. __field(unsigned int, obj )
  197. __field(unsigned int, cookie )
  198. __field(enum cachefiles_obj_ref_trace, why )
  199. __field(int, usage )
  200. ),
  201. TP_fast_assign(
  202. __entry->obj = object_debug_id;
  203. __entry->cookie = cookie_debug_id;
  204. __entry->usage = usage;
  205. __entry->why = why;
  206. ),
  207. TP_printk("c=%08x o=%08x u=%d %s",
  208. __entry->cookie, __entry->obj, __entry->usage,
  209. __print_symbolic(__entry->why, cachefiles_obj_ref_traces))
  210. );
  211. TRACE_EVENT(cachefiles_lookup,
  212. TP_PROTO(struct cachefiles_object *obj,
  213. struct dentry *dir,
  214. struct dentry *de),
  215. TP_ARGS(obj, dir, de),
  216. TP_STRUCT__entry(
  217. __field(unsigned int, obj )
  218. __field(short, error )
  219. __field(unsigned long, dino )
  220. __field(unsigned long, ino )
  221. ),
  222. TP_fast_assign(
  223. __entry->obj = obj ? obj->debug_id : 0;
  224. __entry->dino = d_backing_inode(dir)->i_ino;
  225. __entry->ino = (!IS_ERR(de) && d_backing_inode(de) ?
  226. d_backing_inode(de)->i_ino : 0);
  227. __entry->error = IS_ERR(de) ? PTR_ERR(de) : 0;
  228. ),
  229. TP_printk("o=%08x dB=%lx B=%lx e=%d",
  230. __entry->obj, __entry->dino, __entry->ino, __entry->error)
  231. );
  232. TRACE_EVENT(cachefiles_mkdir,
  233. TP_PROTO(struct dentry *dir, struct dentry *subdir),
  234. TP_ARGS(dir, subdir),
  235. TP_STRUCT__entry(
  236. __field(unsigned int, dir )
  237. __field(unsigned int, subdir )
  238. ),
  239. TP_fast_assign(
  240. __entry->dir = d_backing_inode(dir)->i_ino;
  241. __entry->subdir = d_backing_inode(subdir)->i_ino;
  242. ),
  243. TP_printk("dB=%x sB=%x",
  244. __entry->dir,
  245. __entry->subdir)
  246. );
  247. TRACE_EVENT(cachefiles_tmpfile,
  248. TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
  249. TP_ARGS(obj, backer),
  250. TP_STRUCT__entry(
  251. __field(unsigned int, obj )
  252. __field(unsigned int, backer )
  253. ),
  254. TP_fast_assign(
  255. __entry->obj = obj->debug_id;
  256. __entry->backer = backer->i_ino;
  257. ),
  258. TP_printk("o=%08x B=%x",
  259. __entry->obj,
  260. __entry->backer)
  261. );
  262. TRACE_EVENT(cachefiles_link,
  263. TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
  264. TP_ARGS(obj, backer),
  265. TP_STRUCT__entry(
  266. __field(unsigned int, obj )
  267. __field(unsigned int, backer )
  268. ),
  269. TP_fast_assign(
  270. __entry->obj = obj->debug_id;
  271. __entry->backer = backer->i_ino;
  272. ),
  273. TP_printk("o=%08x B=%x",
  274. __entry->obj,
  275. __entry->backer)
  276. );
  277. TRACE_EVENT(cachefiles_unlink,
  278. TP_PROTO(struct cachefiles_object *obj,
  279. ino_t ino,
  280. enum fscache_why_object_killed why),
  281. TP_ARGS(obj, ino, why),
  282. /* Note that obj may be NULL */
  283. TP_STRUCT__entry(
  284. __field(unsigned int, obj )
  285. __field(unsigned int, ino )
  286. __field(enum fscache_why_object_killed, why )
  287. ),
  288. TP_fast_assign(
  289. __entry->obj = obj ? obj->debug_id : UINT_MAX;
  290. __entry->ino = ino;
  291. __entry->why = why;
  292. ),
  293. TP_printk("o=%08x B=%x w=%s",
  294. __entry->obj, __entry->ino,
  295. __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
  296. );
  297. TRACE_EVENT(cachefiles_rename,
  298. TP_PROTO(struct cachefiles_object *obj,
  299. ino_t ino,
  300. enum fscache_why_object_killed why),
  301. TP_ARGS(obj, ino, why),
  302. /* Note that obj may be NULL */
  303. TP_STRUCT__entry(
  304. __field(unsigned int, obj )
  305. __field(unsigned int, ino )
  306. __field(enum fscache_why_object_killed, why )
  307. ),
  308. TP_fast_assign(
  309. __entry->obj = obj ? obj->debug_id : UINT_MAX;
  310. __entry->ino = ino;
  311. __entry->why = why;
  312. ),
  313. TP_printk("o=%08x B=%x w=%s",
  314. __entry->obj, __entry->ino,
  315. __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
  316. );
  317. TRACE_EVENT(cachefiles_coherency,
  318. TP_PROTO(struct cachefiles_object *obj,
  319. ino_t ino,
  320. enum cachefiles_content content,
  321. enum cachefiles_coherency_trace why),
  322. TP_ARGS(obj, ino, content, why),
  323. /* Note that obj may be NULL */
  324. TP_STRUCT__entry(
  325. __field(unsigned int, obj )
  326. __field(enum cachefiles_coherency_trace, why )
  327. __field(enum cachefiles_content, content )
  328. __field(u64, ino )
  329. ),
  330. TP_fast_assign(
  331. __entry->obj = obj->debug_id;
  332. __entry->why = why;
  333. __entry->content = content;
  334. __entry->ino = ino;
  335. ),
  336. TP_printk("o=%08x %s B=%llx c=%u",
  337. __entry->obj,
  338. __print_symbolic(__entry->why, cachefiles_coherency_traces),
  339. __entry->ino,
  340. __entry->content)
  341. );
  342. TRACE_EVENT(cachefiles_vol_coherency,
  343. TP_PROTO(struct cachefiles_volume *volume,
  344. ino_t ino,
  345. enum cachefiles_coherency_trace why),
  346. TP_ARGS(volume, ino, why),
  347. /* Note that obj may be NULL */
  348. TP_STRUCT__entry(
  349. __field(unsigned int, vol )
  350. __field(enum cachefiles_coherency_trace, why )
  351. __field(u64, ino )
  352. ),
  353. TP_fast_assign(
  354. __entry->vol = volume->vcookie->debug_id;
  355. __entry->why = why;
  356. __entry->ino = ino;
  357. ),
  358. TP_printk("V=%08x %s B=%llx",
  359. __entry->vol,
  360. __print_symbolic(__entry->why, cachefiles_coherency_traces),
  361. __entry->ino)
  362. );
  363. TRACE_EVENT(cachefiles_prep_read,
  364. TP_PROTO(struct netfs_io_subrequest *sreq,
  365. enum netfs_io_source source,
  366. enum cachefiles_prepare_read_trace why,
  367. ino_t cache_inode),
  368. TP_ARGS(sreq, source, why, cache_inode),
  369. TP_STRUCT__entry(
  370. __field(unsigned int, rreq )
  371. __field(unsigned short, index )
  372. __field(unsigned short, flags )
  373. __field(enum netfs_io_source, source )
  374. __field(enum cachefiles_prepare_read_trace, why )
  375. __field(size_t, len )
  376. __field(loff_t, start )
  377. __field(unsigned int, netfs_inode )
  378. __field(unsigned int, cache_inode )
  379. ),
  380. TP_fast_assign(
  381. __entry->rreq = sreq->rreq->debug_id;
  382. __entry->index = sreq->debug_index;
  383. __entry->flags = sreq->flags;
  384. __entry->source = source;
  385. __entry->why = why;
  386. __entry->len = sreq->len;
  387. __entry->start = sreq->start;
  388. __entry->netfs_inode = sreq->rreq->inode->i_ino;
  389. __entry->cache_inode = cache_inode;
  390. ),
  391. TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx ni=%x B=%x",
  392. __entry->rreq, __entry->index,
  393. __print_symbolic(__entry->source, netfs_sreq_sources),
  394. __print_symbolic(__entry->why, cachefiles_prepare_read_traces),
  395. __entry->flags,
  396. __entry->start, __entry->len,
  397. __entry->netfs_inode, __entry->cache_inode)
  398. );
  399. TRACE_EVENT(cachefiles_read,
  400. TP_PROTO(struct cachefiles_object *obj,
  401. struct inode *backer,
  402. loff_t start,
  403. size_t len),
  404. TP_ARGS(obj, backer, start, len),
  405. TP_STRUCT__entry(
  406. __field(unsigned int, obj )
  407. __field(unsigned int, backer )
  408. __field(size_t, len )
  409. __field(loff_t, start )
  410. ),
  411. TP_fast_assign(
  412. __entry->obj = obj->debug_id;
  413. __entry->backer = backer->i_ino;
  414. __entry->start = start;
  415. __entry->len = len;
  416. ),
  417. TP_printk("o=%08x B=%x s=%llx l=%zx",
  418. __entry->obj,
  419. __entry->backer,
  420. __entry->start,
  421. __entry->len)
  422. );
  423. TRACE_EVENT(cachefiles_write,
  424. TP_PROTO(struct cachefiles_object *obj,
  425. struct inode *backer,
  426. loff_t start,
  427. size_t len),
  428. TP_ARGS(obj, backer, start, len),
  429. TP_STRUCT__entry(
  430. __field(unsigned int, obj )
  431. __field(unsigned int, backer )
  432. __field(size_t, len )
  433. __field(loff_t, start )
  434. ),
  435. TP_fast_assign(
  436. __entry->obj = obj->debug_id;
  437. __entry->backer = backer->i_ino;
  438. __entry->start = start;
  439. __entry->len = len;
  440. ),
  441. TP_printk("o=%08x B=%x s=%llx l=%zx",
  442. __entry->obj,
  443. __entry->backer,
  444. __entry->start,
  445. __entry->len)
  446. );
  447. TRACE_EVENT(cachefiles_trunc,
  448. TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
  449. loff_t from, loff_t to, enum cachefiles_trunc_trace why),
  450. TP_ARGS(obj, backer, from, to, why),
  451. TP_STRUCT__entry(
  452. __field(unsigned int, obj )
  453. __field(unsigned int, backer )
  454. __field(enum cachefiles_trunc_trace, why )
  455. __field(loff_t, from )
  456. __field(loff_t, to )
  457. ),
  458. TP_fast_assign(
  459. __entry->obj = obj->debug_id;
  460. __entry->backer = backer->i_ino;
  461. __entry->from = from;
  462. __entry->to = to;
  463. __entry->why = why;
  464. ),
  465. TP_printk("o=%08x B=%x %s l=%llx->%llx",
  466. __entry->obj,
  467. __entry->backer,
  468. __print_symbolic(__entry->why, cachefiles_trunc_traces),
  469. __entry->from,
  470. __entry->to)
  471. );
  472. TRACE_EVENT(cachefiles_mark_active,
  473. TP_PROTO(struct cachefiles_object *obj,
  474. struct inode *inode),
  475. TP_ARGS(obj, inode),
  476. /* Note that obj may be NULL */
  477. TP_STRUCT__entry(
  478. __field(unsigned int, obj )
  479. __field(ino_t, inode )
  480. ),
  481. TP_fast_assign(
  482. __entry->obj = obj ? obj->debug_id : 0;
  483. __entry->inode = inode->i_ino;
  484. ),
  485. TP_printk("o=%08x B=%lx",
  486. __entry->obj, __entry->inode)
  487. );
  488. TRACE_EVENT(cachefiles_mark_failed,
  489. TP_PROTO(struct cachefiles_object *obj,
  490. struct inode *inode),
  491. TP_ARGS(obj, inode),
  492. /* Note that obj may be NULL */
  493. TP_STRUCT__entry(
  494. __field(unsigned int, obj )
  495. __field(ino_t, inode )
  496. ),
  497. TP_fast_assign(
  498. __entry->obj = obj ? obj->debug_id : 0;
  499. __entry->inode = inode->i_ino;
  500. ),
  501. TP_printk("o=%08x B=%lx",
  502. __entry->obj, __entry->inode)
  503. );
  504. TRACE_EVENT(cachefiles_mark_inactive,
  505. TP_PROTO(struct cachefiles_object *obj,
  506. struct inode *inode),
  507. TP_ARGS(obj, inode),
  508. /* Note that obj may be NULL */
  509. TP_STRUCT__entry(
  510. __field(unsigned int, obj )
  511. __field(ino_t, inode )
  512. ),
  513. TP_fast_assign(
  514. __entry->obj = obj ? obj->debug_id : 0;
  515. __entry->inode = inode->i_ino;
  516. ),
  517. TP_printk("o=%08x B=%lx",
  518. __entry->obj, __entry->inode)
  519. );
  520. TRACE_EVENT(cachefiles_vfs_error,
  521. TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
  522. int error, enum cachefiles_error_trace where),
  523. TP_ARGS(obj, backer, error, where),
  524. TP_STRUCT__entry(
  525. __field(unsigned int, obj )
  526. __field(unsigned int, backer )
  527. __field(enum cachefiles_error_trace, where )
  528. __field(short, error )
  529. ),
  530. TP_fast_assign(
  531. __entry->obj = obj ? obj->debug_id : 0;
  532. __entry->backer = backer->i_ino;
  533. __entry->error = error;
  534. __entry->where = where;
  535. ),
  536. TP_printk("o=%08x B=%x %s e=%d",
  537. __entry->obj,
  538. __entry->backer,
  539. __print_symbolic(__entry->where, cachefiles_error_traces),
  540. __entry->error)
  541. );
  542. TRACE_EVENT(cachefiles_io_error,
  543. TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
  544. int error, enum cachefiles_error_trace where),
  545. TP_ARGS(obj, backer, error, where),
  546. TP_STRUCT__entry(
  547. __field(unsigned int, obj )
  548. __field(unsigned int, backer )
  549. __field(enum cachefiles_error_trace, where )
  550. __field(short, error )
  551. ),
  552. TP_fast_assign(
  553. __entry->obj = obj ? obj->debug_id : 0;
  554. __entry->backer = backer->i_ino;
  555. __entry->error = error;
  556. __entry->where = where;
  557. ),
  558. TP_printk("o=%08x B=%x %s e=%d",
  559. __entry->obj,
  560. __entry->backer,
  561. __print_symbolic(__entry->where, cachefiles_error_traces),
  562. __entry->error)
  563. );
  564. TRACE_EVENT(cachefiles_ondemand_open,
  565. TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
  566. struct cachefiles_open *load),
  567. TP_ARGS(obj, msg, load),
  568. TP_STRUCT__entry(
  569. __field(unsigned int, obj )
  570. __field(unsigned int, msg_id )
  571. __field(unsigned int, object_id )
  572. __field(unsigned int, fd )
  573. __field(unsigned int, flags )
  574. ),
  575. TP_fast_assign(
  576. __entry->obj = obj ? obj->debug_id : 0;
  577. __entry->msg_id = msg->msg_id;
  578. __entry->object_id = msg->object_id;
  579. __entry->fd = load->fd;
  580. __entry->flags = load->flags;
  581. ),
  582. TP_printk("o=%08x mid=%x oid=%x fd=%d f=%x",
  583. __entry->obj,
  584. __entry->msg_id,
  585. __entry->object_id,
  586. __entry->fd,
  587. __entry->flags)
  588. );
  589. TRACE_EVENT(cachefiles_ondemand_copen,
  590. TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id,
  591. long len),
  592. TP_ARGS(obj, msg_id, len),
  593. TP_STRUCT__entry(
  594. __field(unsigned int, obj )
  595. __field(unsigned int, msg_id )
  596. __field(long, len )
  597. ),
  598. TP_fast_assign(
  599. __entry->obj = obj ? obj->debug_id : 0;
  600. __entry->msg_id = msg_id;
  601. __entry->len = len;
  602. ),
  603. TP_printk("o=%08x mid=%x l=%lx",
  604. __entry->obj,
  605. __entry->msg_id,
  606. __entry->len)
  607. );
  608. TRACE_EVENT(cachefiles_ondemand_close,
  609. TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg),
  610. TP_ARGS(obj, msg),
  611. TP_STRUCT__entry(
  612. __field(unsigned int, obj )
  613. __field(unsigned int, msg_id )
  614. __field(unsigned int, object_id )
  615. ),
  616. TP_fast_assign(
  617. __entry->obj = obj ? obj->debug_id : 0;
  618. __entry->msg_id = msg->msg_id;
  619. __entry->object_id = msg->object_id;
  620. ),
  621. TP_printk("o=%08x mid=%x oid=%x",
  622. __entry->obj,
  623. __entry->msg_id,
  624. __entry->object_id)
  625. );
  626. TRACE_EVENT(cachefiles_ondemand_read,
  627. TP_PROTO(struct cachefiles_object *obj, struct cachefiles_msg *msg,
  628. struct cachefiles_read *load),
  629. TP_ARGS(obj, msg, load),
  630. TP_STRUCT__entry(
  631. __field(unsigned int, obj )
  632. __field(unsigned int, msg_id )
  633. __field(unsigned int, object_id )
  634. __field(loff_t, start )
  635. __field(size_t, len )
  636. ),
  637. TP_fast_assign(
  638. __entry->obj = obj ? obj->debug_id : 0;
  639. __entry->msg_id = msg->msg_id;
  640. __entry->object_id = msg->object_id;
  641. __entry->start = load->off;
  642. __entry->len = load->len;
  643. ),
  644. TP_printk("o=%08x mid=%x oid=%x s=%llx l=%zx",
  645. __entry->obj,
  646. __entry->msg_id,
  647. __entry->object_id,
  648. __entry->start,
  649. __entry->len)
  650. );
  651. TRACE_EVENT(cachefiles_ondemand_cread,
  652. TP_PROTO(struct cachefiles_object *obj, unsigned int msg_id),
  653. TP_ARGS(obj, msg_id),
  654. TP_STRUCT__entry(
  655. __field(unsigned int, obj )
  656. __field(unsigned int, msg_id )
  657. ),
  658. TP_fast_assign(
  659. __entry->obj = obj ? obj->debug_id : 0;
  660. __entry->msg_id = msg_id;
  661. ),
  662. TP_printk("o=%08x mid=%x",
  663. __entry->obj,
  664. __entry->msg_id)
  665. );
  666. TRACE_EVENT(cachefiles_ondemand_fd_write,
  667. TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
  668. loff_t start, size_t len),
  669. TP_ARGS(obj, backer, start, len),
  670. TP_STRUCT__entry(
  671. __field(unsigned int, obj )
  672. __field(unsigned int, backer )
  673. __field(loff_t, start )
  674. __field(size_t, len )
  675. ),
  676. TP_fast_assign(
  677. __entry->obj = obj ? obj->debug_id : 0;
  678. __entry->backer = backer->i_ino;
  679. __entry->start = start;
  680. __entry->len = len;
  681. ),
  682. TP_printk("o=%08x iB=%x s=%llx l=%zx",
  683. __entry->obj,
  684. __entry->backer,
  685. __entry->start,
  686. __entry->len)
  687. );
  688. TRACE_EVENT(cachefiles_ondemand_fd_release,
  689. TP_PROTO(struct cachefiles_object *obj, int object_id),
  690. TP_ARGS(obj, object_id),
  691. TP_STRUCT__entry(
  692. __field(unsigned int, obj )
  693. __field(unsigned int, object_id )
  694. ),
  695. TP_fast_assign(
  696. __entry->obj = obj ? obj->debug_id : 0;
  697. __entry->object_id = object_id;
  698. ),
  699. TP_printk("o=%08x oid=%x",
  700. __entry->obj,
  701. __entry->object_id)
  702. );
  703. #endif /* _TRACE_CACHEFILES_H */
  704. /* This part must be outside protection */
  705. #include <trace/define_trace.h>