|
|
@@ -24,6 +24,7 @@
|
|
|
#define _TRACE_XFS_SCRUB_TRACE_H
|
|
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
+#include "xfs_bit.h"
|
|
|
|
|
|
DECLARE_EVENT_CLASS(xfs_scrub_class,
|
|
|
TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm,
|
|
|
@@ -67,6 +68,220 @@ DEFINE_EVENT(xfs_scrub_class, name, \
|
|
|
|
|
|
DEFINE_SCRUB_EVENT(xfs_scrub_start);
|
|
|
DEFINE_SCRUB_EVENT(xfs_scrub_done);
|
|
|
+DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry);
|
|
|
+
|
|
|
+TRACE_EVENT(xfs_scrub_op_error,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, xfs_agnumber_t agno,
|
|
|
+ xfs_agblock_t bno, int error, void *ret_ip),
|
|
|
+ TP_ARGS(sc, agno, bno, error, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(xfs_agnumber_t, agno)
|
|
|
+ __field(xfs_agblock_t, bno)
|
|
|
+ __field(int, error)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ __entry->dev = sc->mp->m_super->s_dev;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->agno = agno;
|
|
|
+ __entry->bno = bno;
|
|
|
+ __entry->error = error;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->type,
|
|
|
+ __entry->agno,
|
|
|
+ __entry->bno,
|
|
|
+ __entry->error,
|
|
|
+ __entry->ret_ip)
|
|
|
+);
|
|
|
+
|
|
|
+TRACE_EVENT(xfs_scrub_file_op_error,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
|
|
|
+ xfs_fileoff_t offset, int error, void *ret_ip),
|
|
|
+ TP_ARGS(sc, whichfork, offset, error, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(xfs_ino_t, ino)
|
|
|
+ __field(int, whichfork)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(xfs_fileoff_t, offset)
|
|
|
+ __field(int, error)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ __entry->dev = sc->ip->i_mount->m_super->s_dev;
|
|
|
+ __entry->ino = sc->ip->i_ino;
|
|
|
+ __entry->whichfork = whichfork;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->offset = offset;
|
|
|
+ __entry->error = error;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu error %d ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->ino,
|
|
|
+ __entry->whichfork,
|
|
|
+ __entry->type,
|
|
|
+ __entry->offset,
|
|
|
+ __entry->error,
|
|
|
+ __entry->ret_ip)
|
|
|
+);
|
|
|
+
|
|
|
+DECLARE_EVENT_CLASS(xfs_scrub_block_error_class,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, void *ret_ip),
|
|
|
+ TP_ARGS(sc, daddr, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(xfs_agnumber_t, agno)
|
|
|
+ __field(xfs_agblock_t, bno)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ xfs_fsblock_t fsbno;
|
|
|
+ xfs_agnumber_t agno;
|
|
|
+ xfs_agblock_t bno;
|
|
|
+
|
|
|
+ fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
|
|
|
+ agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
|
|
|
+ bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
|
|
|
+
|
|
|
+ __entry->dev = sc->mp->m_super->s_dev;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->agno = agno;
|
|
|
+ __entry->bno = bno;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->type,
|
|
|
+ __entry->agno,
|
|
|
+ __entry->bno,
|
|
|
+ __entry->ret_ip)
|
|
|
+)
|
|
|
+
|
|
|
+#define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \
|
|
|
+DEFINE_EVENT(xfs_scrub_block_error_class, name, \
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, \
|
|
|
+ void *ret_ip), \
|
|
|
+ TP_ARGS(sc, daddr, ret_ip))
|
|
|
+
|
|
|
+DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error);
|
|
|
+DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen);
|
|
|
+
|
|
|
+DECLARE_EVENT_CLASS(xfs_scrub_ino_error_class,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, xfs_daddr_t daddr,
|
|
|
+ void *ret_ip),
|
|
|
+ TP_ARGS(sc, ino, daddr, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(xfs_ino_t, ino)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(xfs_agnumber_t, agno)
|
|
|
+ __field(xfs_agblock_t, bno)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ xfs_fsblock_t fsbno;
|
|
|
+ xfs_agnumber_t agno;
|
|
|
+ xfs_agblock_t bno;
|
|
|
+
|
|
|
+ if (daddr) {
|
|
|
+ fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr);
|
|
|
+ agno = XFS_FSB_TO_AGNO(sc->mp, fsbno);
|
|
|
+ bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno);
|
|
|
+ } else {
|
|
|
+ agno = XFS_INO_TO_AGNO(sc->mp, ino);
|
|
|
+ bno = XFS_AGINO_TO_AGBNO(sc->mp,
|
|
|
+ XFS_INO_TO_AGINO(sc->mp, ino));
|
|
|
+ }
|
|
|
+
|
|
|
+ __entry->dev = sc->mp->m_super->s_dev;
|
|
|
+ __entry->ino = ino;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->agno = agno;
|
|
|
+ __entry->bno = bno;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d ino %llu type %u agno %u agbno %u ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->ino,
|
|
|
+ __entry->type,
|
|
|
+ __entry->agno,
|
|
|
+ __entry->bno,
|
|
|
+ __entry->ret_ip)
|
|
|
+)
|
|
|
+
|
|
|
+#define DEFINE_SCRUB_INO_ERROR_EVENT(name) \
|
|
|
+DEFINE_EVENT(xfs_scrub_ino_error_class, name, \
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, \
|
|
|
+ xfs_daddr_t daddr, void *ret_ip), \
|
|
|
+ TP_ARGS(sc, ino, daddr, ret_ip))
|
|
|
+
|
|
|
+DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_error);
|
|
|
+DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_preen);
|
|
|
+DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_warning);
|
|
|
+
|
|
|
+DECLARE_EVENT_CLASS(xfs_scrub_fblock_error_class,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, int whichfork,
|
|
|
+ xfs_fileoff_t offset, void *ret_ip),
|
|
|
+ TP_ARGS(sc, whichfork, offset, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(xfs_ino_t, ino)
|
|
|
+ __field(int, whichfork)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(xfs_fileoff_t, offset)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ __entry->dev = sc->ip->i_mount->m_super->s_dev;
|
|
|
+ __entry->ino = sc->ip->i_ino;
|
|
|
+ __entry->whichfork = whichfork;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->offset = offset;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->ino,
|
|
|
+ __entry->whichfork,
|
|
|
+ __entry->type,
|
|
|
+ __entry->offset,
|
|
|
+ __entry->ret_ip)
|
|
|
+);
|
|
|
+
|
|
|
+#define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \
|
|
|
+DEFINE_EVENT(xfs_scrub_fblock_error_class, name, \
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, int whichfork, \
|
|
|
+ xfs_fileoff_t offset, void *ret_ip), \
|
|
|
+ TP_ARGS(sc, whichfork, offset, ret_ip))
|
|
|
+
|
|
|
+DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error);
|
|
|
+DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning);
|
|
|
+
|
|
|
+TRACE_EVENT(xfs_scrub_incomplete,
|
|
|
+ TP_PROTO(struct xfs_scrub_context *sc, void *ret_ip),
|
|
|
+ TP_ARGS(sc, ret_ip),
|
|
|
+ TP_STRUCT__entry(
|
|
|
+ __field(dev_t, dev)
|
|
|
+ __field(unsigned int, type)
|
|
|
+ __field(void *, ret_ip)
|
|
|
+ ),
|
|
|
+ TP_fast_assign(
|
|
|
+ __entry->dev = sc->mp->m_super->s_dev;
|
|
|
+ __entry->type = sc->sm->sm_type;
|
|
|
+ __entry->ret_ip = ret_ip;
|
|
|
+ ),
|
|
|
+ TP_printk("dev %d:%d type %u ret_ip %pF",
|
|
|
+ MAJOR(__entry->dev), MINOR(__entry->dev),
|
|
|
+ __entry->type,
|
|
|
+ __entry->ret_ip)
|
|
|
+);
|
|
|
|
|
|
#endif /* _TRACE_XFS_SCRUB_TRACE_H */
|
|
|
|