Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0-or-later 2 : /* 3 : * Copyright (C) 2017-2023 Oracle. All Rights Reserved. 4 : * Author: Darrick J. Wong <djwong@kernel.org> 5 : */ 6 : #include "xfs.h" 7 : #include "xfs_fs.h" 8 : #include "xfs_shared.h" 9 : #include "xfs_format.h" 10 : #include "xfs_log_format.h" 11 : #include "xfs_trans_resv.h" 12 : #include "xfs_mount.h" 13 : #include "xfs_inode.h" 14 : #include "xfs_btree.h" 15 : #include "xfs_btree_mem.h" 16 : #include "xfs_ag.h" 17 : #include "xfs_quota_defs.h" 18 : #include "xfs_dir2.h" 19 : #include "xfs_da_format.h" 20 : #include "xfs_rmap.h" 21 : #include "xfs_parent.h" 22 : #include "xfs_rtbitmap.h" 23 : #include "xfs_rtgroup.h" 24 : #include "scrub/scrub.h" 25 : #include "scrub/xfile.h" 26 : #include "scrub/xfarray.h" 27 : #include "scrub/iscan.h" 28 : #include "scrub/orphanage.h" 29 : #include "scrub/nlinks.h" 30 : #include "scrub/fscounters.h" 31 : #include "scrub/xfbtree.h" 32 : #include "scrub/bitmap.h" 33 : #include "scrub/xfblob.h" 34 : #include "scrub/dirtree.h" 35 : 36 : /* Figure out which block the btree cursor was pointing to. */ 37 : static inline xfs_fsblock_t 38 0 : xchk_btree_cur_fsbno( 39 : struct xfs_btree_cur *cur, 40 : int level) 41 : { 42 0 : if (level < cur->bc_nlevels && cur->bc_levels[level].bp) 43 0 : return XFS_DADDR_TO_FSB(cur->bc_mp, 44 : xfs_buf_daddr(cur->bc_levels[level].bp)); 45 : 46 0 : if (level == cur->bc_nlevels - 1 && 47 0 : (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE)) 48 0 : return XFS_INO_TO_FSB(cur->bc_mp, cur->bc_ino.ip->i_ino); 49 : 50 : return NULLFSBLOCK; 51 : } 52 : 53 : #ifdef CONFIG_XFS_BTREE_IN_XFILE 54 : static inline unsigned long 55 : xfbtree_ino( 56 : struct xfbtree *xfbt) 57 : { 58 0 : return file_inode(xfbt->target->bt_xfile->file)->i_ino; 59 : } 60 : #endif /* CONFIG_XFS_BTREE_IN_XFILE */ 61 : 62 : /* 63 : * We include this last to have the helpers above available for the trace 64 : * event implementations. 65 : */ 66 : #define CREATE_TRACE_POINTS 67 : #include "scrub/trace.h" 68 : 69 : /* xchk_whine stuff */ 70 : struct xchk_tstr { 71 : unsigned int type; 72 : const char *tag; 73 : }; 74 : 75 : static const struct xchk_tstr xchk_tstr_tags[] = { XFS_SCRUB_TYPE_STRINGS }; 76 : 77 : const char * 78 310675 : xchk_type_string( 79 : unsigned int type) 80 : { 81 310675 : unsigned int i; 82 : 83 4457879 : for (i = 0; i < ARRAY_SIZE(xchk_tstr_tags); i++) { 84 4457879 : if (xchk_tstr_tags[i].type == type) 85 310678 : return xchk_tstr_tags[i].tag; 86 : } 87 : 88 : return "???"; 89 : }