xfs: add a tracepoint to report incorrect extent refcounts
authorDarrick J. Wong <djwong@kernel.org>
Wed, 12 Apr 2023 01:59:58 +0000 (18:59 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 12 Apr 2023 01:59:58 +0000 (18:59 -0700)
Add a new tracepoint so that I can see exactly what and where we failed
the refcount check.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/refcount.c
fs/xfs/scrub/trace.h

index a5005b1..aaad13b 100644 (file)
@@ -13,6 +13,7 @@
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/btree.h"
+#include "scrub/trace.h"
 #include "xfs_trans_resv.h"
 #include "xfs_mount.h"
 #include "xfs_ag.h"
@@ -300,8 +301,10 @@ xchk_refcountbt_xref_rmap(
                goto out_free;
 
        xchk_refcountbt_process_rmap_fragments(&refchk);
-       if (irec->rc_refcount != refchk.seen)
+       if (irec->rc_refcount != refchk.seen) {
+               trace_xchk_refcount_incorrect(sc->sa.pag, irec, refchk.seen);
                xchk_btree_xref_set_corrupt(sc, sc->sa.rmap_cur, 0);
+       }
 
 out_free:
        list_for_each_entry_safe(frag, n, &refchk.fragments, list) {
index 81f7c30..ad25ae8 100644 (file)
@@ -30,6 +30,9 @@ TRACE_DEFINE_ENUM(XFS_BTNUM_FINOi);
 TRACE_DEFINE_ENUM(XFS_BTNUM_RMAPi);
 TRACE_DEFINE_ENUM(XFS_BTNUM_REFCi);
 
+TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_SHARED);
+TRACE_DEFINE_ENUM(XFS_REFC_DOMAIN_COW);
+
 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_PROBE);
 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_SB);
 TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_AGF);
@@ -657,6 +660,38 @@ TRACE_EVENT(xchk_fscounters_within_range,
                  __entry->old_value)
 )
 
+TRACE_EVENT(xchk_refcount_incorrect,
+       TP_PROTO(struct xfs_perag *pag, const struct xfs_refcount_irec *irec,
+                xfs_nlink_t seen),
+       TP_ARGS(pag, irec, seen),
+       TP_STRUCT__entry(
+               __field(dev_t, dev)
+               __field(xfs_agnumber_t, agno)
+               __field(enum xfs_refc_domain, domain)
+               __field(xfs_agblock_t, startblock)
+               __field(xfs_extlen_t, blockcount)
+               __field(xfs_nlink_t, refcount)
+               __field(xfs_nlink_t, seen)
+       ),
+       TP_fast_assign(
+               __entry->dev = pag->pag_mount->m_super->s_dev;
+               __entry->agno = pag->pag_agno;
+               __entry->domain = irec->rc_domain;
+               __entry->startblock = irec->rc_startblock;
+               __entry->blockcount = irec->rc_blockcount;
+               __entry->refcount = irec->rc_refcount;
+               __entry->seen = seen;
+       ),
+       TP_printk("dev %d:%d agno 0x%x dom %s agbno 0x%x fsbcount 0x%x refcount %u seen %u",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 __entry->agno,
+                 __print_symbolic(__entry->domain, XFS_REFC_DOMAIN_STRINGS),
+                 __entry->startblock,
+                 __entry->blockcount,
+                 __entry->refcount,
+                 __entry->seen)
+)
+
 /* repair tracepoints */
 #if IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR)