trace.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. /*
  2. * Copyright (C) 2017 Oracle. All Rights Reserved.
  3. *
  4. * Author: Darrick J. Wong <darrick.wong@oracle.com>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it would be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write the Free Software Foundation,
  18. * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. #undef TRACE_SYSTEM
  21. #define TRACE_SYSTEM xfs_scrub
  22. #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
  23. #define _TRACE_XFS_SCRUB_TRACE_H
  24. #include <linux/tracepoint.h>
  25. #include "xfs_bit.h"
  26. DECLARE_EVENT_CLASS(xfs_scrub_class,
  27. TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
  28. int error),
  29. TP_ARGS(ip, sm, error),
  30. TP_STRUCT__entry(
  31. __field(dev_t, dev)
  32. __field(xfs_ino_t, ino)
  33. __field(unsigned int, type)
  34. __field(xfs_agnumber_t, agno)
  35. __field(xfs_ino_t, inum)
  36. __field(unsigned int, gen)
  37. __field(unsigned int, flags)
  38. __field(int, error)
  39. ),
  40. TP_fast_assign(
  41. __entry->dev = ip->i_mount->m_super->s_dev;
  42. __entry->ino = ip->i_ino;
  43. __entry->type = sm->sm_type;
  44. __entry->agno = sm->sm_agno;
  45. __entry->inum = sm->sm_ino;
  46. __entry->gen = sm->sm_gen;
  47. __entry->flags = sm->sm_flags;
  48. __entry->error = error;
  49. ),
  50. TP_printk("dev %d:%d ino 0x%llx type %u agno %u inum %llu gen %u flags 0x%x error %d",
  51. MAJOR(__entry->dev), MINOR(__entry->dev),
  52. __entry->ino,
  53. __entry->type,
  54. __entry->agno,
  55. __entry->inum,
  56. __entry->gen,
  57. __entry->flags,
  58. __entry->error)
  59. )
  60. #define DEFINE_SCRUB_EVENT(name) \
  61. DEFINE_EVENT(xfs_scrub_class, name, \
  62. TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \
  63. int error), \
  64. TP_ARGS(ip, sm, error))
  65. DEFINE_SCRUB_EVENT(xfs_scrub_start);
  66. DEFINE_SCRUB_EVENT(xfs_scrub_done);
  67. DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry);
  68. TRACE_EVENT(xfs_scrub_op_error,
  69. TP_PROTO(struct xfs_scrub_context *sc, xfs_agnumber_t agno,
  70. xfs_agblock_t bno, int error, void *ret_ip),
  71. TP_ARGS(sc, agno, bno, error, ret_ip),
  72. TP_STRUCT__entry(
  73. __field(dev_t, dev)
  74. __field(unsigned int, type)
  75. __field(xfs_agnumber_t, agno)
  76. __field(xfs_agblock_t, bno)
  77. __field(int, error)
  78. __field(void *, ret_ip)
  79. ),
  80. TP_fast_assign(
  81. __entry->dev = sc->mp->m_super->s_dev;
  82. __entry->type = sc->sm->sm_type;
  83. __entry->agno = agno;
  84. __entry->bno = bno;
  85. __entry->error = error;
  86. __entry->ret_ip = ret_ip;
  87. ),
  88. TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pS",
  89. MAJOR(__entry->dev), MINOR(__entry->dev),
  90. __entry->type,
  91. __entry->agno,
  92. __entry->bno,
  93. __entry->error,
  94. __entry->ret_ip)
  95. );
  96. TRACE_EVENT(xfs_scrub_file_op_error,
  97. TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
  98. xfs_fileoff_t offset, int error, void *ret_ip),
  99. TP_ARGS(sc, whichfork, offset, error, ret_ip),
  100. TP_STRUCT__entry(
  101. __field(dev_t, dev)
  102. __field(xfs_ino_t, ino)
  103. __field(int, whichfork)
  104. __field(unsigned int, type)
  105. __field(xfs_fileoff_t, offset)
  106. __field(int, error)
  107. __field(void *, ret_ip)
  108. ),
  109. TP_fast_assign(
  110. __entry->dev = sc->ip->i_mount->m_super->s_dev;
  111. __entry->ino = sc->ip->i_ino;
  112. __entry->whichfork = whichfork;
  113. __entry->type = sc->sm->sm_type;
  114. __entry->offset = offset;
  115. __entry->error = error;
  116. __entry->ret_ip = ret_ip;
  117. ),
  118. TP_printk("dev %d:%d ino 0x%llx fork %d type %u offset %llu error %d ret_ip %pS",
  119. MAJOR(__entry->dev), MINOR(__entry->dev),
  120. __entry->ino,
  121. __entry->whichfork,
  122. __entry->type,
  123. __entry->offset,
  124. __entry->error,
  125. __entry->ret_ip)
  126. );
  127. DECLARE_EVENT_CLASS(xfs_scrub_block_error_class,
  128. TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, void *ret_ip),
  129. TP_ARGS(sc, daddr, ret_ip),
  130. TP_STRUCT__entry(
  131. __field(dev_t, dev)
  132. __field(unsigned int, type)
  133. __field(xfs_agnumber_t, agno)
  134. __field(xfs_agblock_t, bno)
  135. __field(void *, ret_ip)
  136. ),
  137. TP_fast_assign(
  138. xfs_fsblock_t fsbno;
  139. xfs_agnumber_t agno;
  140. xfs_agblock_t bno;
  141. fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
  142. agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
  143. bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
  144. __entry->dev = sc->mp->m_super->s_dev;
  145. __entry->type = sc->sm->sm_type;
  146. __entry->agno = agno;
  147. __entry->bno = bno;
  148. __entry->ret_ip = ret_ip;
  149. ),
  150. TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pS",
  151. MAJOR(__entry->dev), MINOR(__entry->dev),
  152. __entry->type,
  153. __entry->agno,
  154. __entry->bno,
  155. __entry->ret_ip)
  156. )
  157. #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
  158. DEFINE_EVENT(xfs_scrub_block_error_class, name, \
  159. TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, \
  160. void *ret_ip), \
  161. TP_ARGS(sc, daddr, ret_ip))
  162. DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error);
  163. DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen);
  164. DECLARE_EVENT_CLASS(xfs_scrub_ino_error_class,
  165. TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, void *ret_ip),
  166. TP_ARGS(sc, ino, ret_ip),
  167. TP_STRUCT__entry(
  168. __field(dev_t, dev)
  169. __field(xfs_ino_t, ino)
  170. __field(unsigned int, type)
  171. __field(void *, ret_ip)
  172. ),
  173. TP_fast_assign(
  174. __entry->dev = sc->mp->m_super->s_dev;
  175. __entry->ino = ino;
  176. __entry->type = sc->sm->sm_type;
  177. __entry->ret_ip = ret_ip;
  178. ),
  179. TP_printk("dev %d:%d ino 0x%llx type %u ret_ip %pS",
  180. MAJOR(__entry->dev), MINOR(__entry->dev),
  181. __entry->ino,
  182. __entry->type,
  183. __entry->ret_ip)
  184. )
  185. #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
  186. DEFINE_EVENT(xfs_scrub_ino_error_class, name, \
  187. TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, \
  188. void *ret_ip), \
  189. TP_ARGS(sc, ino, ret_ip))
  190. DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_error);
  191. DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_preen);
  192. DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_warning);
  193. DECLARE_EVENT_CLASS(xfs_scrub_fblock_error_class,
  194. TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
  195. xfs_fileoff_t offset, void *ret_ip),
  196. TP_ARGS(sc, whichfork, offset, ret_ip),
  197. TP_STRUCT__entry(
  198. __field(dev_t, dev)
  199. __field(xfs_ino_t, ino)
  200. __field(int, whichfork)
  201. __field(unsigned int, type)
  202. __field(xfs_fileoff_t, offset)
  203. __field(void *, ret_ip)
  204. ),
  205. TP_fast_assign(
  206. __entry->dev = sc->ip->i_mount->m_super->s_dev;
  207. __entry->ino = sc->ip->i_ino;
  208. __entry->whichfork = whichfork;
  209. __entry->type = sc->sm->sm_type;
  210. __entry->offset = offset;
  211. __entry->ret_ip = ret_ip;
  212. ),
  213. TP_printk("dev %d:%d ino 0x%llx fork %d type %u offset %llu ret_ip %pS",
  214. MAJOR(__entry->dev), MINOR(__entry->dev),
  215. __entry->ino,
  216. __entry->whichfork,
  217. __entry->type,
  218. __entry->offset,
  219. __entry->ret_ip)
  220. );
  221. #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
  222. DEFINE_EVENT(xfs_scrub_fblock_error_class, name, \
  223. TP_PROTO(struct xfs_scrub_context *sc, int whichfork, \
  224. xfs_fileoff_t offset, void *ret_ip), \
  225. TP_ARGS(sc, whichfork, offset, ret_ip))
  226. DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error);
  227. DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning);
  228. TRACE_EVENT(xfs_scrub_incomplete,
  229. TP_PROTO(struct xfs_scrub_context *sc, void *ret_ip),
  230. TP_ARGS(sc, ret_ip),
  231. TP_STRUCT__entry(
  232. __field(dev_t, dev)
  233. __field(unsigned int, type)
  234. __field(void *, ret_ip)
  235. ),
  236. TP_fast_assign(
  237. __entry->dev = sc->mp->m_super->s_dev;
  238. __entry->type = sc->sm->sm_type;
  239. __entry->ret_ip = ret_ip;
  240. ),
  241. TP_printk("dev %d:%d type %u ret_ip %pS",
  242. MAJOR(__entry->dev), MINOR(__entry->dev),
  243. __entry->type,
  244. __entry->ret_ip)
  245. );
  246. TRACE_EVENT(xfs_scrub_btree_op_error,
  247. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
  248. int level, int error, void *ret_ip),
  249. TP_ARGS(sc, cur, level, error, ret_ip),
  250. TP_STRUCT__entry(
  251. __field(dev_t, dev)
  252. __field(unsigned int, type)
  253. __field(xfs_btnum_t, btnum)
  254. __field(int, level)
  255. __field(xfs_agnumber_t, agno)
  256. __field(xfs_agblock_t, bno)
  257. __field(int, ptr);
  258. __field(int, error)
  259. __field(void *, ret_ip)
  260. ),
  261. TP_fast_assign(
  262. xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
  263. __entry->dev = sc->mp->m_super->s_dev;
  264. __entry->type = sc->sm->sm_type;
  265. __entry->btnum = cur->bc_btnum;
  266. __entry->level = level;
  267. __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
  268. __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
  269. __entry->ptr = cur->bc_ptrs[level];
  270. __entry->error = error;
  271. __entry->ret_ip = ret_ip;
  272. ),
  273. TP_printk("dev %d:%d type %u btnum %d level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
  274. MAJOR(__entry->dev), MINOR(__entry->dev),
  275. __entry->type,
  276. __entry->btnum,
  277. __entry->level,
  278. __entry->ptr,
  279. __entry->agno,
  280. __entry->bno,
  281. __entry->error,
  282. __entry->ret_ip)
  283. );
  284. TRACE_EVENT(xfs_scrub_ifork_btree_op_error,
  285. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
  286. int level, int error, void *ret_ip),
  287. TP_ARGS(sc, cur, level, error, ret_ip),
  288. TP_STRUCT__entry(
  289. __field(dev_t, dev)
  290. __field(xfs_ino_t, ino)
  291. __field(int, whichfork)
  292. __field(unsigned int, type)
  293. __field(xfs_btnum_t, btnum)
  294. __field(int, level)
  295. __field(int, ptr)
  296. __field(xfs_agnumber_t, agno)
  297. __field(xfs_agblock_t, bno)
  298. __field(int, error)
  299. __field(void *, ret_ip)
  300. ),
  301. TP_fast_assign(
  302. xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
  303. __entry->dev = sc->mp->m_super->s_dev;
  304. __entry->ino = sc->ip->i_ino;
  305. __entry->whichfork = cur->bc_private.b.whichfork;
  306. __entry->type = sc->sm->sm_type;
  307. __entry->btnum = cur->bc_btnum;
  308. __entry->level = level;
  309. __entry->ptr = cur->bc_ptrs[level];
  310. __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
  311. __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
  312. __entry->error = error;
  313. __entry->ret_ip = ret_ip;
  314. ),
  315. TP_printk("dev %d:%d ino 0x%llx fork %d type %u btnum %d level %d ptr %d agno %u agbno %u error %d ret_ip %pS",
  316. MAJOR(__entry->dev), MINOR(__entry->dev),
  317. __entry->ino,
  318. __entry->whichfork,
  319. __entry->type,
  320. __entry->btnum,
  321. __entry->level,
  322. __entry->ptr,
  323. __entry->agno,
  324. __entry->bno,
  325. __entry->error,
  326. __entry->ret_ip)
  327. );
  328. TRACE_EVENT(xfs_scrub_btree_error,
  329. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
  330. int level, void *ret_ip),
  331. TP_ARGS(sc, cur, level, ret_ip),
  332. TP_STRUCT__entry(
  333. __field(dev_t, dev)
  334. __field(unsigned int, type)
  335. __field(xfs_btnum_t, btnum)
  336. __field(int, level)
  337. __field(xfs_agnumber_t, agno)
  338. __field(xfs_agblock_t, bno)
  339. __field(int, ptr);
  340. __field(void *, ret_ip)
  341. ),
  342. TP_fast_assign(
  343. xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
  344. __entry->dev = sc->mp->m_super->s_dev;
  345. __entry->type = sc->sm->sm_type;
  346. __entry->btnum = cur->bc_btnum;
  347. __entry->level = level;
  348. __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
  349. __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
  350. __entry->ptr = cur->bc_ptrs[level];
  351. __entry->ret_ip = ret_ip;
  352. ),
  353. TP_printk("dev %d:%d type %u btnum %d level %d ptr %d agno %u agbno %u ret_ip %pS",
  354. MAJOR(__entry->dev), MINOR(__entry->dev),
  355. __entry->type,
  356. __entry->btnum,
  357. __entry->level,
  358. __entry->ptr,
  359. __entry->agno,
  360. __entry->bno,
  361. __entry->ret_ip)
  362. );
  363. TRACE_EVENT(xfs_scrub_ifork_btree_error,
  364. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
  365. int level, void *ret_ip),
  366. TP_ARGS(sc, cur, level, ret_ip),
  367. TP_STRUCT__entry(
  368. __field(dev_t, dev)
  369. __field(xfs_ino_t, ino)
  370. __field(int, whichfork)
  371. __field(unsigned int, type)
  372. __field(xfs_btnum_t, btnum)
  373. __field(int, level)
  374. __field(xfs_agnumber_t, agno)
  375. __field(xfs_agblock_t, bno)
  376. __field(int, ptr);
  377. __field(void *, ret_ip)
  378. ),
  379. TP_fast_assign(
  380. xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
  381. __entry->dev = sc->mp->m_super->s_dev;
  382. __entry->ino = sc->ip->i_ino;
  383. __entry->whichfork = cur->bc_private.b.whichfork;
  384. __entry->type = sc->sm->sm_type;
  385. __entry->btnum = cur->bc_btnum;
  386. __entry->level = level;
  387. __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
  388. __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
  389. __entry->ptr = cur->bc_ptrs[level];
  390. __entry->ret_ip = ret_ip;
  391. ),
  392. TP_printk("dev %d:%d ino 0x%llx fork %d type %u btnum %d level %d ptr %d agno %u agbno %u ret_ip %pS",
  393. MAJOR(__entry->dev), MINOR(__entry->dev),
  394. __entry->ino,
  395. __entry->whichfork,
  396. __entry->type,
  397. __entry->btnum,
  398. __entry->level,
  399. __entry->ptr,
  400. __entry->agno,
  401. __entry->bno,
  402. __entry->ret_ip)
  403. );
  404. DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class,
  405. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur,
  406. int level),
  407. TP_ARGS(sc, cur, level),
  408. TP_STRUCT__entry(
  409. __field(dev_t, dev)
  410. __field(int, type)
  411. __field(xfs_btnum_t, btnum)
  412. __field(xfs_agnumber_t, agno)
  413. __field(xfs_agblock_t, bno)
  414. __field(int, level)
  415. __field(int, nlevels)
  416. __field(int, ptr)
  417. ),
  418. TP_fast_assign(
  419. xfs_fsblock_t fsbno = xfs_scrub_btree_cur_fsbno(cur, level);
  420. __entry->dev = sc->mp->m_super->s_dev;
  421. __entry->type = sc->sm->sm_type;
  422. __entry->btnum = cur->bc_btnum;
  423. __entry->agno = XFS_FSB_TO_AGNO(cur->bc_mp, fsbno);
  424. __entry->bno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno);
  425. __entry->level = level;
  426. __entry->nlevels = cur->bc_nlevels;
  427. __entry->ptr = cur->bc_ptrs[level];
  428. ),
  429. TP_printk("dev %d:%d type %u btnum %d agno %u agbno %u level %d nlevels %d ptr %d",
  430. MAJOR(__entry->dev), MINOR(__entry->dev),
  431. __entry->type,
  432. __entry->btnum,
  433. __entry->agno,
  434. __entry->bno,
  435. __entry->level,
  436. __entry->nlevels,
  437. __entry->ptr)
  438. )
  439. #define DEFINE_SCRUB_SBTREE_EVENT(name) \
  440. DEFINE_EVENT(xfs_scrub_sbtree_class, name, \
  441. TP_PROTO(struct xfs_scrub_context *sc, struct xfs_btree_cur *cur, \
  442. int level), \
  443. TP_ARGS(sc, cur, level))
  444. DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec);
  445. DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key);
  446. TRACE_EVENT(xfs_scrub_xref_error,
  447. TP_PROTO(struct xfs_scrub_context *sc, int error, void *ret_ip),
  448. TP_ARGS(sc, error, ret_ip),
  449. TP_STRUCT__entry(
  450. __field(dev_t, dev)
  451. __field(int, type)
  452. __field(int, error)
  453. __field(void *, ret_ip)
  454. ),
  455. TP_fast_assign(
  456. __entry->dev = sc->mp->m_super->s_dev;
  457. __entry->type = sc->sm->sm_type;
  458. __entry->error = error;
  459. __entry->ret_ip = ret_ip;
  460. ),
  461. TP_printk("dev %d:%d type %u xref error %d ret_ip %pF",
  462. MAJOR(__entry->dev), MINOR(__entry->dev),
  463. __entry->type,
  464. __entry->error,
  465. __entry->ret_ip)
  466. );
  467. #endif /* _TRACE_XFS_SCRUB_TRACE_H */
  468. #undef TRACE_INCLUDE_PATH
  469. #define TRACE_INCLUDE_PATH .
  470. #define TRACE_INCLUDE_FILE scrub/trace
  471. #include <trace/define_trace.h>