136fd6e86SDarrick J. Wong /* 236fd6e86SDarrick J. Wong * Copyright (C) 2017 Oracle. All Rights Reserved. 336fd6e86SDarrick J. Wong * 436fd6e86SDarrick J. Wong * Author: Darrick J. Wong <darrick.wong@oracle.com> 536fd6e86SDarrick J. Wong * 636fd6e86SDarrick J. Wong * This program is free software; you can redistribute it and/or 736fd6e86SDarrick J. Wong * modify it under the terms of the GNU General Public License 836fd6e86SDarrick J. Wong * as published by the Free Software Foundation; either version 2 936fd6e86SDarrick J. Wong * of the License, or (at your option) any later version. 1036fd6e86SDarrick J. Wong * 1136fd6e86SDarrick J. Wong * This program is distributed in the hope that it would be useful, 1236fd6e86SDarrick J. Wong * but WITHOUT ANY WARRANTY; without even the implied warranty of 1336fd6e86SDarrick J. Wong * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1436fd6e86SDarrick J. Wong * GNU General Public License for more details. 1536fd6e86SDarrick J. Wong * 1636fd6e86SDarrick J. Wong * You should have received a copy of the GNU General Public License 1736fd6e86SDarrick J. Wong * along with this program; if not, write the Free Software Foundation, 1836fd6e86SDarrick J. Wong * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 1936fd6e86SDarrick J. Wong */ 2036fd6e86SDarrick J. Wong #undef TRACE_SYSTEM 2136fd6e86SDarrick J. Wong #define TRACE_SYSTEM xfs_scrub 2236fd6e86SDarrick J. Wong 2336fd6e86SDarrick J. Wong #if !defined(_TRACE_XFS_SCRUB_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 2436fd6e86SDarrick J. Wong #define _TRACE_XFS_SCRUB_TRACE_H 2536fd6e86SDarrick J. Wong 2636fd6e86SDarrick J. Wong #include <linux/tracepoint.h> 27*4700d229SDarrick J. Wong #include "xfs_bit.h" 2836fd6e86SDarrick J. Wong 29a5637186SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_class, 30a5637186SDarrick J. Wong TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, 31a5637186SDarrick J. Wong int error), 32a5637186SDarrick J. Wong TP_ARGS(ip, sm, error), 33a5637186SDarrick J. Wong TP_STRUCT__entry( 34a5637186SDarrick J. Wong __field(dev_t, dev) 35a5637186SDarrick J. Wong __field(xfs_ino_t, ino) 36a5637186SDarrick J. Wong __field(unsigned int, type) 37a5637186SDarrick J. Wong __field(xfs_agnumber_t, agno) 38a5637186SDarrick J. Wong __field(xfs_ino_t, inum) 39a5637186SDarrick J. Wong __field(unsigned int, gen) 40a5637186SDarrick J. Wong __field(unsigned int, flags) 41a5637186SDarrick J. Wong __field(int, error) 42a5637186SDarrick J. Wong ), 43a5637186SDarrick J. Wong TP_fast_assign( 44a5637186SDarrick J. Wong __entry->dev = ip->i_mount->m_super->s_dev; 45a5637186SDarrick J. Wong __entry->ino = ip->i_ino; 46a5637186SDarrick J. Wong __entry->type = sm->sm_type; 47a5637186SDarrick J. Wong __entry->agno = sm->sm_agno; 48a5637186SDarrick J. Wong __entry->inum = sm->sm_ino; 49a5637186SDarrick J. Wong __entry->gen = sm->sm_gen; 50a5637186SDarrick J. Wong __entry->flags = sm->sm_flags; 51a5637186SDarrick J. Wong __entry->error = error; 52a5637186SDarrick J. Wong ), 53a5637186SDarrick J. Wong TP_printk("dev %d:%d ino %llu type %u agno %u inum %llu gen %u flags 0x%x error %d", 54a5637186SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 55a5637186SDarrick J. Wong __entry->ino, 56a5637186SDarrick J. Wong __entry->type, 57a5637186SDarrick J. Wong __entry->agno, 58a5637186SDarrick J. Wong __entry->inum, 59a5637186SDarrick J. Wong __entry->gen, 60a5637186SDarrick J. Wong __entry->flags, 61a5637186SDarrick J. Wong __entry->error) 62a5637186SDarrick J. Wong ) 63a5637186SDarrick J. Wong #define DEFINE_SCRUB_EVENT(name) \ 64a5637186SDarrick J. Wong DEFINE_EVENT(xfs_scrub_class, name, \ 65a5637186SDarrick J. Wong TP_PROTO(struct xfs_inode *ip, struct xfs_scrub_metadata *sm, \ 66a5637186SDarrick J. Wong int error), \ 67a5637186SDarrick J. Wong TP_ARGS(ip, sm, error)) 68a5637186SDarrick J. Wong 69a5637186SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_start); 70a5637186SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_done); 71*4700d229SDarrick J. Wong DEFINE_SCRUB_EVENT(xfs_scrub_deadlock_retry); 72*4700d229SDarrick J. Wong 73*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_op_error, 74*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, xfs_agnumber_t agno, 75*4700d229SDarrick J. Wong xfs_agblock_t bno, int error, void *ret_ip), 76*4700d229SDarrick J. Wong TP_ARGS(sc, agno, bno, error, ret_ip), 77*4700d229SDarrick J. Wong TP_STRUCT__entry( 78*4700d229SDarrick J. Wong __field(dev_t, dev) 79*4700d229SDarrick J. Wong __field(unsigned int, type) 80*4700d229SDarrick J. Wong __field(xfs_agnumber_t, agno) 81*4700d229SDarrick J. Wong __field(xfs_agblock_t, bno) 82*4700d229SDarrick J. Wong __field(int, error) 83*4700d229SDarrick J. Wong __field(void *, ret_ip) 84*4700d229SDarrick J. Wong ), 85*4700d229SDarrick J. Wong TP_fast_assign( 86*4700d229SDarrick J. Wong __entry->dev = sc->mp->m_super->s_dev; 87*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 88*4700d229SDarrick J. Wong __entry->agno = agno; 89*4700d229SDarrick J. Wong __entry->bno = bno; 90*4700d229SDarrick J. Wong __entry->error = error; 91*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 92*4700d229SDarrick J. Wong ), 93*4700d229SDarrick J. Wong TP_printk("dev %d:%d type %u agno %u agbno %u error %d ret_ip %pF", 94*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 95*4700d229SDarrick J. Wong __entry->type, 96*4700d229SDarrick J. Wong __entry->agno, 97*4700d229SDarrick J. Wong __entry->bno, 98*4700d229SDarrick J. Wong __entry->error, 99*4700d229SDarrick J. Wong __entry->ret_ip) 100*4700d229SDarrick J. Wong ); 101*4700d229SDarrick J. Wong 102*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_file_op_error, 103*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, int whichfork, 104*4700d229SDarrick J. Wong xfs_fileoff_t offset, int error, void *ret_ip), 105*4700d229SDarrick J. Wong TP_ARGS(sc, whichfork, offset, error, ret_ip), 106*4700d229SDarrick J. Wong TP_STRUCT__entry( 107*4700d229SDarrick J. Wong __field(dev_t, dev) 108*4700d229SDarrick J. Wong __field(xfs_ino_t, ino) 109*4700d229SDarrick J. Wong __field(int, whichfork) 110*4700d229SDarrick J. Wong __field(unsigned int, type) 111*4700d229SDarrick J. Wong __field(xfs_fileoff_t, offset) 112*4700d229SDarrick J. Wong __field(int, error) 113*4700d229SDarrick J. Wong __field(void *, ret_ip) 114*4700d229SDarrick J. Wong ), 115*4700d229SDarrick J. Wong TP_fast_assign( 116*4700d229SDarrick J. Wong __entry->dev = sc->ip->i_mount->m_super->s_dev; 117*4700d229SDarrick J. Wong __entry->ino = sc->ip->i_ino; 118*4700d229SDarrick J. Wong __entry->whichfork = whichfork; 119*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 120*4700d229SDarrick J. Wong __entry->offset = offset; 121*4700d229SDarrick J. Wong __entry->error = error; 122*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 123*4700d229SDarrick J. Wong ), 124*4700d229SDarrick J. Wong TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu error %d ret_ip %pF", 125*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 126*4700d229SDarrick J. Wong __entry->ino, 127*4700d229SDarrick J. Wong __entry->whichfork, 128*4700d229SDarrick J. Wong __entry->type, 129*4700d229SDarrick J. Wong __entry->offset, 130*4700d229SDarrick J. Wong __entry->error, 131*4700d229SDarrick J. Wong __entry->ret_ip) 132*4700d229SDarrick J. Wong ); 133*4700d229SDarrick J. Wong 134*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_block_error_class, 135*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, void *ret_ip), 136*4700d229SDarrick J. Wong TP_ARGS(sc, daddr, ret_ip), 137*4700d229SDarrick J. Wong TP_STRUCT__entry( 138*4700d229SDarrick J. Wong __field(dev_t, dev) 139*4700d229SDarrick J. Wong __field(unsigned int, type) 140*4700d229SDarrick J. Wong __field(xfs_agnumber_t, agno) 141*4700d229SDarrick J. Wong __field(xfs_agblock_t, bno) 142*4700d229SDarrick J. Wong __field(void *, ret_ip) 143*4700d229SDarrick J. Wong ), 144*4700d229SDarrick J. Wong TP_fast_assign( 145*4700d229SDarrick J. Wong xfs_fsblock_t fsbno; 146*4700d229SDarrick J. Wong xfs_agnumber_t agno; 147*4700d229SDarrick J. Wong xfs_agblock_t bno; 148*4700d229SDarrick J. Wong 149*4700d229SDarrick J. Wong fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr); 150*4700d229SDarrick J. Wong agno = XFS_FSB_TO_AGNO(sc->mp, fsbno); 151*4700d229SDarrick J. Wong bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno); 152*4700d229SDarrick J. Wong 153*4700d229SDarrick J. Wong __entry->dev = sc->mp->m_super->s_dev; 154*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 155*4700d229SDarrick J. Wong __entry->agno = agno; 156*4700d229SDarrick J. Wong __entry->bno = bno; 157*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 158*4700d229SDarrick J. Wong ), 159*4700d229SDarrick J. Wong TP_printk("dev %d:%d type %u agno %u agbno %u ret_ip %pF", 160*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 161*4700d229SDarrick J. Wong __entry->type, 162*4700d229SDarrick J. Wong __entry->agno, 163*4700d229SDarrick J. Wong __entry->bno, 164*4700d229SDarrick J. Wong __entry->ret_ip) 165*4700d229SDarrick J. Wong ) 166*4700d229SDarrick J. Wong 167*4700d229SDarrick J. Wong #define DEFINE_SCRUB_BLOCK_ERROR_EVENT(name) \ 168*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_block_error_class, name, \ 169*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, xfs_daddr_t daddr, \ 170*4700d229SDarrick J. Wong void *ret_ip), \ 171*4700d229SDarrick J. Wong TP_ARGS(sc, daddr, ret_ip)) 172*4700d229SDarrick J. Wong 173*4700d229SDarrick J. Wong DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_error); 174*4700d229SDarrick J. Wong DEFINE_SCRUB_BLOCK_ERROR_EVENT(xfs_scrub_block_preen); 175*4700d229SDarrick J. Wong 176*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_ino_error_class, 177*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, xfs_daddr_t daddr, 178*4700d229SDarrick J. Wong void *ret_ip), 179*4700d229SDarrick J. Wong TP_ARGS(sc, ino, daddr, ret_ip), 180*4700d229SDarrick J. Wong TP_STRUCT__entry( 181*4700d229SDarrick J. Wong __field(dev_t, dev) 182*4700d229SDarrick J. Wong __field(xfs_ino_t, ino) 183*4700d229SDarrick J. Wong __field(unsigned int, type) 184*4700d229SDarrick J. Wong __field(xfs_agnumber_t, agno) 185*4700d229SDarrick J. Wong __field(xfs_agblock_t, bno) 186*4700d229SDarrick J. Wong __field(void *, ret_ip) 187*4700d229SDarrick J. Wong ), 188*4700d229SDarrick J. Wong TP_fast_assign( 189*4700d229SDarrick J. Wong xfs_fsblock_t fsbno; 190*4700d229SDarrick J. Wong xfs_agnumber_t agno; 191*4700d229SDarrick J. Wong xfs_agblock_t bno; 192*4700d229SDarrick J. Wong 193*4700d229SDarrick J. Wong if (daddr) { 194*4700d229SDarrick J. Wong fsbno = XFS_DADDR_TO_FSB(sc->mp, daddr); 195*4700d229SDarrick J. Wong agno = XFS_FSB_TO_AGNO(sc->mp, fsbno); 196*4700d229SDarrick J. Wong bno = XFS_FSB_TO_AGBNO(sc->mp, fsbno); 197*4700d229SDarrick J. Wong } else { 198*4700d229SDarrick J. Wong agno = XFS_INO_TO_AGNO(sc->mp, ino); 199*4700d229SDarrick J. Wong bno = XFS_AGINO_TO_AGBNO(sc->mp, 200*4700d229SDarrick J. Wong XFS_INO_TO_AGINO(sc->mp, ino)); 201*4700d229SDarrick J. Wong } 202*4700d229SDarrick J. Wong 203*4700d229SDarrick J. Wong __entry->dev = sc->mp->m_super->s_dev; 204*4700d229SDarrick J. Wong __entry->ino = ino; 205*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 206*4700d229SDarrick J. Wong __entry->agno = agno; 207*4700d229SDarrick J. Wong __entry->bno = bno; 208*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 209*4700d229SDarrick J. Wong ), 210*4700d229SDarrick J. Wong TP_printk("dev %d:%d ino %llu type %u agno %u agbno %u ret_ip %pF", 211*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 212*4700d229SDarrick J. Wong __entry->ino, 213*4700d229SDarrick J. Wong __entry->type, 214*4700d229SDarrick J. Wong __entry->agno, 215*4700d229SDarrick J. Wong __entry->bno, 216*4700d229SDarrick J. Wong __entry->ret_ip) 217*4700d229SDarrick J. Wong ) 218*4700d229SDarrick J. Wong 219*4700d229SDarrick J. Wong #define DEFINE_SCRUB_INO_ERROR_EVENT(name) \ 220*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_ino_error_class, name, \ 221*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, xfs_ino_t ino, \ 222*4700d229SDarrick J. Wong xfs_daddr_t daddr, void *ret_ip), \ 223*4700d229SDarrick J. Wong TP_ARGS(sc, ino, daddr, ret_ip)) 224*4700d229SDarrick J. Wong 225*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_error); 226*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_preen); 227*4700d229SDarrick J. Wong DEFINE_SCRUB_INO_ERROR_EVENT(xfs_scrub_ino_warning); 228*4700d229SDarrick J. Wong 229*4700d229SDarrick J. Wong DECLARE_EVENT_CLASS(xfs_scrub_fblock_error_class, 230*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, int whichfork, 231*4700d229SDarrick J. Wong xfs_fileoff_t offset, void *ret_ip), 232*4700d229SDarrick J. Wong TP_ARGS(sc, whichfork, offset, ret_ip), 233*4700d229SDarrick J. Wong TP_STRUCT__entry( 234*4700d229SDarrick J. Wong __field(dev_t, dev) 235*4700d229SDarrick J. Wong __field(xfs_ino_t, ino) 236*4700d229SDarrick J. Wong __field(int, whichfork) 237*4700d229SDarrick J. Wong __field(unsigned int, type) 238*4700d229SDarrick J. Wong __field(xfs_fileoff_t, offset) 239*4700d229SDarrick J. Wong __field(void *, ret_ip) 240*4700d229SDarrick J. Wong ), 241*4700d229SDarrick J. Wong TP_fast_assign( 242*4700d229SDarrick J. Wong __entry->dev = sc->ip->i_mount->m_super->s_dev; 243*4700d229SDarrick J. Wong __entry->ino = sc->ip->i_ino; 244*4700d229SDarrick J. Wong __entry->whichfork = whichfork; 245*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 246*4700d229SDarrick J. Wong __entry->offset = offset; 247*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 248*4700d229SDarrick J. Wong ), 249*4700d229SDarrick J. Wong TP_printk("dev %d:%d ino %llu fork %d type %u offset %llu ret_ip %pF", 250*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 251*4700d229SDarrick J. Wong __entry->ino, 252*4700d229SDarrick J. Wong __entry->whichfork, 253*4700d229SDarrick J. Wong __entry->type, 254*4700d229SDarrick J. Wong __entry->offset, 255*4700d229SDarrick J. Wong __entry->ret_ip) 256*4700d229SDarrick J. Wong ); 257*4700d229SDarrick J. Wong 258*4700d229SDarrick J. Wong #define DEFINE_SCRUB_FBLOCK_ERROR_EVENT(name) \ 259*4700d229SDarrick J. Wong DEFINE_EVENT(xfs_scrub_fblock_error_class, name, \ 260*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, int whichfork, \ 261*4700d229SDarrick J. Wong xfs_fileoff_t offset, void *ret_ip), \ 262*4700d229SDarrick J. Wong TP_ARGS(sc, whichfork, offset, ret_ip)) 263*4700d229SDarrick J. Wong 264*4700d229SDarrick J. Wong DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_error); 265*4700d229SDarrick J. Wong DEFINE_SCRUB_FBLOCK_ERROR_EVENT(xfs_scrub_fblock_warning); 266*4700d229SDarrick J. Wong 267*4700d229SDarrick J. Wong TRACE_EVENT(xfs_scrub_incomplete, 268*4700d229SDarrick J. Wong TP_PROTO(struct xfs_scrub_context *sc, void *ret_ip), 269*4700d229SDarrick J. Wong TP_ARGS(sc, ret_ip), 270*4700d229SDarrick J. Wong TP_STRUCT__entry( 271*4700d229SDarrick J. Wong __field(dev_t, dev) 272*4700d229SDarrick J. Wong __field(unsigned int, type) 273*4700d229SDarrick J. Wong __field(void *, ret_ip) 274*4700d229SDarrick J. Wong ), 275*4700d229SDarrick J. Wong TP_fast_assign( 276*4700d229SDarrick J. Wong __entry->dev = sc->mp->m_super->s_dev; 277*4700d229SDarrick J. Wong __entry->type = sc->sm->sm_type; 278*4700d229SDarrick J. Wong __entry->ret_ip = ret_ip; 279*4700d229SDarrick J. Wong ), 280*4700d229SDarrick J. Wong TP_printk("dev %d:%d type %u ret_ip %pF", 281*4700d229SDarrick J. Wong MAJOR(__entry->dev), MINOR(__entry->dev), 282*4700d229SDarrick J. Wong __entry->type, 283*4700d229SDarrick J. Wong __entry->ret_ip) 284*4700d229SDarrick J. Wong ); 285a5637186SDarrick J. Wong 28636fd6e86SDarrick J. Wong #endif /* _TRACE_XFS_SCRUB_TRACE_H */ 28736fd6e86SDarrick J. Wong 28836fd6e86SDarrick J. Wong #undef TRACE_INCLUDE_PATH 28936fd6e86SDarrick J. Wong #define TRACE_INCLUDE_PATH . 29036fd6e86SDarrick J. Wong #define TRACE_INCLUDE_FILE scrub/trace 29136fd6e86SDarrick J. Wong #include <trace/define_trace.h> 292