1153323Srodrigc/* 2159451Srodrigc * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3159451Srodrigc * All Rights Reserved. 4153323Srodrigc * 5159451Srodrigc * This program is free software; you can redistribute it and/or 6159451Srodrigc * modify it under the terms of the GNU General Public License as 7153323Srodrigc * published by the Free Software Foundation. 8153323Srodrigc * 9159451Srodrigc * This program is distributed in the hope that it would be useful, 10159451Srodrigc * but WITHOUT ANY WARRANTY; without even the implied warranty of 11159451Srodrigc * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12159451Srodrigc * GNU General Public License for more details. 13153323Srodrigc * 14159451Srodrigc * You should have received a copy of the GNU General Public License 15159451Srodrigc * along with this program; if not, write the Free Software Foundation, 16159451Srodrigc * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17153323Srodrigc */ 18153323Srodrigc#include "xfs.h" 19153323Srodrigc 20159451Srodrigc#include "xfs_fs.h" 21153323Srodrigc#include "xfs_types.h" 22159451Srodrigc#include "xfs_bit.h" 23159451Srodrigc#include "xfs_log.h" 24153323Srodrigc#include "xfs_inum.h" 25153323Srodrigc#include "xfs_trans.h" 26153323Srodrigc#include "xfs_sb.h" 27159451Srodrigc#include "xfs_ag.h" 28153323Srodrigc#include "xfs_dir.h" 29153323Srodrigc#include "xfs_dir2.h" 30153323Srodrigc#include "xfs_dmapi.h" 31153323Srodrigc#include "xfs_mount.h" 32153323Srodrigc#include "xfs_alloc.h" 33159451Srodrigc#include "xfs_da_btree.h" 34153323Srodrigc#include "xfs_alloc_btree.h" 35153323Srodrigc#include "xfs_bmap_btree.h" 36153323Srodrigc#include "xfs_ialloc_btree.h" 37159451Srodrigc#include "xfs_dir_sf.h" 38159451Srodrigc#include "xfs_dir2_sf.h" 39159451Srodrigc#include "xfs_attr_sf.h" 40159451Srodrigc#include "xfs_dinode.h" 41159451Srodrigc#include "xfs_inode.h" 42153323Srodrigc#include "xfs_btree.h" 43153323Srodrigc#include "xfs_buf_item.h" 44159451Srodrigc#include "xfs_inode_item.h" 45153323Srodrigc#include "xfs_extfree_item.h" 46153323Srodrigc#include "xfs_rw.h" 47153323Srodrigc#include "xfs_bmap.h" 48153323Srodrigc#include "xfs_attr.h" 49153323Srodrigc#include "xfs_attr_leaf.h" 50153323Srodrigc#include "xfs_dir_leaf.h" 51153323Srodrigc#include "xfs_dir2_data.h" 52153323Srodrigc#include "xfs_dir2_leaf.h" 53153323Srodrigc#include "xfs_dir2_block.h" 54153323Srodrigc#include "xfs_dir2_node.h" 55159451Srodrigc#include "xfs_dir2_trace.h" 56153323Srodrigc#include "xfs_log_priv.h" 57153323Srodrigc#include "xfs_log_recover.h" 58153323Srodrigc#include "xfs_quota.h" 59153323Srodrigc#include "quota/xfs_qm.h" 60153323Srodrigc#include "xfs_iomap.h" 61153323Srodrigc 62153323Srodrigc#include <support/kdb.h> 63153323Srodrigc 64153323Srodrigc#define qprintf kdb_printf 65153323Srodrigc 66153323Srodrigc/* 67153323Srodrigc * Command table functions. (tracing) 68153323Srodrigc */ 69153323Srodrigc#ifdef XFS_ALLOC_TRACE 70153323Srodrigcstatic void xfsidbg_xalatrace(int); 71153323Srodrigcstatic void xfsidbg_xalbtrace(xfs_agblock_t); 72153323Srodrigcstatic void xfsidbg_xalgtrace(xfs_agnumber_t); 73153323Srodrigcstatic void xfsidbg_xalmtrace(xfs_mount_t *); 74153323Srodrigcstatic void xfsidbg_xalttrace(int); 75153323Srodrigc#endif 76153323Srodrigc#ifdef XFS_ATTR_TRACE 77153323Srodrigcstatic void xfsidbg_xattrtrace(int); 78153323Srodrigc#endif 79153323Srodrigc#ifdef XFS_BLI_TRACE 80153323Srodrigcstatic void xfsidbg_xblitrace(xfs_buf_log_item_t *); 81153323Srodrigc#endif 82153323Srodrigc#ifdef XFS_BMAP_TRACE 83153323Srodrigcstatic void xfsidbg_xbmatrace(int); 84153323Srodrigcstatic void xfsidbg_xbmitrace(xfs_inode_t *); 85153323Srodrigcstatic void xfsidbg_xbmstrace(xfs_inode_t *); 86153323Srodrigcstatic void xfsidbg_xbxatrace(int); 87153323Srodrigcstatic void xfsidbg_xbxitrace(xfs_inode_t *); 88153323Srodrigcstatic void xfsidbg_xbxstrace(xfs_inode_t *); 89153323Srodrigc#endif 90153323Srodrigc#ifdef XFS_ILOCK_TRACE 91153323Srodrigcstatic void xfsidbg_xilock_trace(xfs_inode_t *); 92153323Srodrigcstatic void xfsidbg_xailock_trace(int); 93153323Srodrigc#endif 94153323Srodrigc#ifdef XFS_DIR_TRACE 95153323Srodrigcstatic void xfsidbg_xdirtrace(int); 96153323Srodrigc#endif 97153323Srodrigc#ifdef XFS_DIR2_TRACE 98153323Srodrigcstatic void xfsidbg_xdir2atrace(int); 99153323Srodrigcstatic void xfsidbg_xdir2itrace(xfs_inode_t *); 100153323Srodrigc#endif 101153323Srodrigc#ifdef XFS_LOG_TRACE 102153323Srodrigcstatic void xfsidbg_xiclogtrace(xlog_in_core_t *); 103153323Srodrigcstatic void xfsidbg_xlog_granttrace(xlog_t *); 104153323Srodrigc#endif 105153323Srodrigc#ifdef XFS_DQUOT_TRACE 106153323Srodrigcstatic void xfsidbg_xqm_dqtrace(xfs_dquot_t *); 107153323Srodrigc#endif 108153323Srodrigc 109153323Srodrigc 110153323Srodrigc/* 111153323Srodrigc * Command table functions. 112153323Srodrigc */ 113153323Srodrigcstatic void xfsidbg_xagf(xfs_agf_t *); 114153323Srodrigcstatic void xfsidbg_xagi(xfs_agi_t *); 115153323Srodrigcstatic void xfsidbg_xaildump(xfs_mount_t *); 116153323Srodrigcstatic void xfsidbg_xalloc(xfs_alloc_arg_t *); 117153323Srodrigcstatic void xfsidbg_xattrcontext(xfs_attr_list_context_t *); 118153323Srodrigcstatic void xfsidbg_xattrleaf(xfs_attr_leafblock_t *); 119153323Srodrigcstatic void xfsidbg_xattrsf(xfs_attr_shortform_t *); 120153323Srodrigcstatic void xfsidbg_xbirec(xfs_bmbt_irec_t *r); 121153323Srodrigcstatic void xfsidbg_xbmalla(xfs_bmalloca_t *); 122153323Srodrigcstatic void xfsidbg_xbrec(xfs_bmbt_rec_64_t *); 123153323Srodrigcstatic void xfsidbg_xbroot(xfs_inode_t *); 124153323Srodrigcstatic void xfsidbg_xbroota(xfs_inode_t *); 125153323Srodrigcstatic void xfsidbg_xbtcur(xfs_btree_cur_t *); 126153323Srodrigcstatic void xfsidbg_xbuf(xfs_buf_t *); 127153323Srodrigcstatic void xfsidbg_xbuf_real(xfs_buf_t *, int); 128153323Srodrigcstatic void xfsidbg_xarg(int); 129153323Srodrigcstatic void xfsidbg_xchksum(uint *); 130153323Srodrigcstatic void xfsidbg_xchash(xfs_mount_t *mp); 131153323Srodrigcstatic void xfsidbg_xchashlist(xfs_chashlist_t *chl); 132153323Srodrigcstatic void xfsidbg_xdaargs(xfs_da_args_t *); 133153323Srodrigcstatic void xfsidbg_xdabuf(xfs_dabuf_t *); 134153323Srodrigcstatic void xfsidbg_xdanode(xfs_da_intnode_t *); 135153323Srodrigcstatic void xfsidbg_xdastate(xfs_da_state_t *); 136153323Srodrigcstatic void xfsidbg_xdirleaf(xfs_dir_leafblock_t *); 137153323Srodrigcstatic void xfsidbg_xdirsf(xfs_dir_shortform_t *); 138153323Srodrigcstatic void xfsidbg_xdir2free(xfs_dir2_free_t *); 139153323Srodrigcstatic void xfsidbg_xdir2sf(xfs_dir2_sf_t *); 140153323Srodrigcstatic void xfsidbg_xexlist(xfs_inode_t *); 141153323Srodrigcstatic void xfsidbg_xflist(xfs_bmap_free_t *); 142153323Srodrigcstatic void xfsidbg_xhelp(void); 143153323Srodrigcstatic void xfsidbg_xiclog(xlog_in_core_t *); 144153323Srodrigcstatic void xfsidbg_xiclogall(xlog_in_core_t *); 145153323Srodrigcstatic void xfsidbg_xiclogcb(xlog_in_core_t *); 146153323Srodrigcstatic void xfsidbg_xihash(xfs_mount_t *mp); 147153323Srodrigcstatic void xfsidbg_xinodes(xfs_mount_t *); 148153323Srodrigcstatic void xfsidbg_delayed_blocks(xfs_mount_t *); 149153323Srodrigcstatic void xfsidbg_xinodes_quiesce(xfs_mount_t *); 150153323Srodrigcstatic void xfsidbg_xlog(xlog_t *); 151153323Srodrigcstatic void xfsidbg_xlog_ritem(xlog_recover_item_t *); 152153323Srodrigcstatic void xfsidbg_xlog_rtrans(xlog_recover_t *); 153153323Srodrigcstatic void xfsidbg_xlog_rtrans_entire(xlog_recover_t *); 154153323Srodrigcstatic void xfsidbg_xlog_tic(xlog_ticket_t *); 155153323Srodrigcstatic void xfsidbg_xlogitem(xfs_log_item_t *); 156153323Srodrigcstatic void xfsidbg_xmount(xfs_mount_t *); 157153323Srodrigcstatic void xfsidbg_xnode(xfs_inode_t *ip); 158153323Srodrigcstatic void xfsidbg_xcore(xfs_iocore_t *io); 159153323Srodrigcstatic void xfsidbg_xperag(xfs_mount_t *); 160153323Srodrigcstatic void xfsidbg_xqm_diskdq(xfs_disk_dquot_t *); 161153323Srodrigcstatic void xfsidbg_xqm_dqattached_inos(xfs_mount_t *); 162153323Srodrigcstatic void xfsidbg_xqm_dquot(xfs_dquot_t *); 163153323Srodrigcstatic void xfsidbg_xqm_mplist(xfs_mount_t *); 164153323Srodrigcstatic void xfsidbg_xqm_qinfo(xfs_mount_t *mp); 165153323Srodrigcstatic void xfsidbg_xqm_tpdqinfo(xfs_trans_t *tp); 166159451Srodrigcstatic void xfsidbg_xsb(xfs_sb_t *); 167159451Srodrigcstatic void xfsidbg_xsb_convert(xfs_sb_t *); 168153323Srodrigcstatic void xfsidbg_xtp(xfs_trans_t *); 169153323Srodrigcstatic void xfsidbg_xtrans_res(xfs_mount_t *); 170153323Srodrigc#ifdef CONFIG_XFS_QUOTA 171153323Srodrigcstatic void xfsidbg_xqm(void); 172153323Srodrigcstatic void xfsidbg_xqm_htab(void); 173153323Srodrigcstatic void xfsidbg_xqm_freelist_print(xfs_frlist_t *qlist, char *title); 174153323Srodrigcstatic void xfsidbg_xqm_freelist(void); 175153323Srodrigc#endif 176153323Srodrigc 177153323Srodrigc#ifdef XFS_BMAP_TRACE 178153323Srodrigcstatic void xfs_convert_extent(xfs_bmbt_rec_32_t *, xfs_dfiloff_t *, 179153323Srodrigc xfs_dfsbno_t *, xfs_dfilblks_t *, int *); 180153323Srodrigc#endif 181153323Srodrigc 182159451Srodrigc/* 183159451Srodrigc * Prototypes for static functions. 184159451Srodrigc */ 185159451Srodrigc#ifdef XFS_ALLOC_TRACE 186159451Srodrigcstatic int xfs_alloc_trace_entry(ktrace_entry_t *ktep); 187159451Srodrigc#endif 188159451Srodrigc#ifdef XFS_ATTR_TRACE 189159451Srodrigcstatic int xfs_attr_trace_entry(ktrace_entry_t *ktep); 190159451Srodrigc#endif 191159451Srodrigc#ifdef XFS_BMAP_TRACE 192159451Srodrigcstatic int xfs_bmap_trace_entry(ktrace_entry_t *ktep); 193159451Srodrigc#endif 194159451Srodrigc#ifdef XFS_BMAP_TRACE 195159451Srodrigcstatic int xfs_bmbt_trace_entry(ktrace_entry_t *ktep); 196159451Srodrigc#endif 197159451Srodrigc#ifdef XFS_DIR_TRACE 198159451Srodrigcstatic int xfs_dir_trace_entry(ktrace_entry_t *ktep); 199159451Srodrigc#endif 200159451Srodrigc#ifdef XFS_DIR2_TRACE 201159451Srodrigcstatic int xfs_dir2_trace_entry(ktrace_entry_t *ktep); 202159451Srodrigc#endif 203159451Srodrigc#ifdef XFS_RW_TRACE 204159451Srodrigcstatic void xfs_bunmap_trace_entry(ktrace_entry_t *ktep); 205159451Srodrigcstatic void xfs_rw_enter_trace_entry(ktrace_entry_t *ktep); 206159451Srodrigcstatic void xfs_page_trace_entry(ktrace_entry_t *ktep); 207159451Srodrigcstatic int xfs_rw_trace_entry(ktrace_entry_t *ktep); 208159451Srodrigc#endif 209159451Srodrigcstatic void xfs_broot(xfs_inode_t *ip, xfs_ifork_t *f); 210159451Srodrigcstatic void xfs_btalloc(xfs_alloc_block_t *bt, int bsz); 211159451Srodrigcstatic void xfs_btbmap(xfs_bmbt_block_t *bt, int bsz); 212159451Srodrigcstatic void xfs_btino(xfs_inobt_block_t *bt, int bsz); 213159451Srodrigcstatic void xfs_buf_item_print(xfs_buf_log_item_t *blip, int summary); 214159451Srodrigcstatic void xfs_dastate_path(xfs_da_state_path_t *p); 215159451Srodrigcstatic void xfs_dir2data(void *addr, int size); 216159451Srodrigcstatic void xfs_dir2leaf(xfs_dir2_leaf_t *leaf, int size); 217159451Srodrigcstatic void xfs_dquot_item_print(xfs_dq_logitem_t *lip, int summary); 218159451Srodrigcstatic void xfs_efd_item_print(xfs_efd_log_item_t *efdp, int summary); 219159451Srodrigcstatic void xfs_efi_item_print(xfs_efi_log_item_t *efip, int summary); 220159451Srodrigcstatic char * xfs_fmtformat(xfs_dinode_fmt_t f); 221159451Srodrigcchar * xfs_fmtfsblock(xfs_fsblock_t bno, xfs_mount_t *mp); 222159451Srodrigcstatic char * xfs_fmtino(xfs_ino_t ino, xfs_mount_t *mp); 223159451Srodrigcstatic char * xfs_fmtlsn(xfs_lsn_t *lsnp); 224159451Srodrigcstatic char * xfs_fmtmode(int m); 225159451Srodrigcstatic char * xfs_fmtsize(size_t i); 226159451Srodrigcstatic char * xfs_fmtuuid(uuid_t *); 227159451Srodrigcstatic void xfs_inode_item_print(xfs_inode_log_item_t *ilip, int summary); 228159451Srodrigcstatic void xfs_inodebuf(xfs_buf_t *bp); 229159451Srodrigcstatic void xfs_prdinode_core(xfs_dinode_core_t *dip); 230159451Srodrigcstatic void xfs_qoff_item_print(xfs_qoff_logitem_t *lip, int summary); 231159451Srodrigcstatic void xfs_xexlist_fork(xfs_inode_t *ip, int whichfork); 232159451Srodrigcstatic void xfs_xnode_fork(char *name, xfs_ifork_t *f); 233159451Srodrigc 234159451Srodrigc 235153323Srodrigc/* kdb wrappers */ 236153323Srodrigc 237153323Srodrigcstatic int kdbm_xfs_xagf( 238153323Srodrigc int argc, 239153323Srodrigc const char **argv, 240153323Srodrigc const char **envp, 241153323Srodrigc struct pt_regs *regs) 242153323Srodrigc{ 243153323Srodrigc unsigned long addr; 244153323Srodrigc int nextarg = 1; 245153323Srodrigc long offset = 0; 246153323Srodrigc int diag; 247153323Srodrigc 248153323Srodrigc if (argc != 1) 249153323Srodrigc return KDB_ARGCOUNT; 250153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 251153323Srodrigc if (diag) 252153323Srodrigc return diag; 253153323Srodrigc 254153323Srodrigc xfsidbg_xagf((xfs_agf_t *)addr); 255153323Srodrigc return 0; 256153323Srodrigc} 257153323Srodrigc 258153323Srodrigcstatic int kdbm_xfs_xagi( 259153323Srodrigc int argc, 260153323Srodrigc const char **argv, 261153323Srodrigc const char **envp, 262153323Srodrigc struct pt_regs *regs) 263153323Srodrigc{ 264153323Srodrigc unsigned long addr; 265153323Srodrigc int nextarg = 1; 266153323Srodrigc long offset = 0; 267153323Srodrigc int diag; 268153323Srodrigc 269153323Srodrigc if (argc != 1) 270153323Srodrigc return KDB_ARGCOUNT; 271153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 272153323Srodrigc if (diag) 273153323Srodrigc return diag; 274153323Srodrigc 275153323Srodrigc xfsidbg_xagi((xfs_agi_t *)addr); 276153323Srodrigc return 0; 277153323Srodrigc} 278153323Srodrigc 279153323Srodrigcstatic int kdbm_xfs_xaildump( 280153323Srodrigc int argc, 281153323Srodrigc const char **argv, 282153323Srodrigc const char **envp, 283153323Srodrigc struct pt_regs *regs) 284153323Srodrigc{ 285153323Srodrigc unsigned long addr; 286153323Srodrigc int nextarg = 1; 287153323Srodrigc long offset = 0; 288153323Srodrigc int diag; 289153323Srodrigc 290153323Srodrigc if (argc != 1) 291153323Srodrigc return KDB_ARGCOUNT; 292153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 293153323Srodrigc if (diag) 294153323Srodrigc return diag; 295153323Srodrigc 296153323Srodrigc xfsidbg_xaildump((xfs_mount_t *) addr); 297153323Srodrigc return 0; 298153323Srodrigc} 299153323Srodrigc 300153323Srodrigc#ifdef XFS_ALLOC_TRACE 301153323Srodrigcstatic int kdbm_xfs_xalatrace( 302153323Srodrigc int argc, 303153323Srodrigc const char **argv, 304153323Srodrigc const char **envp, 305153323Srodrigc struct pt_regs *regs) 306153323Srodrigc{ 307153323Srodrigc unsigned long addr; 308153323Srodrigc int nextarg = 1; 309153323Srodrigc long offset = 0; 310153323Srodrigc int diag; 311153323Srodrigc 312153323Srodrigc if (argc != 1) 313153323Srodrigc return KDB_ARGCOUNT; 314153323Srodrigc 315153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 316153323Srodrigc if (diag) 317153323Srodrigc return diag; 318153323Srodrigc 319153323Srodrigc xfsidbg_xalatrace((int) addr); 320153323Srodrigc return 0; 321153323Srodrigc} 322153323Srodrigc 323153323Srodrigcstatic int kdbm_xfs_xalbtrace( 324153323Srodrigc int argc, 325153323Srodrigc const char **argv, 326153323Srodrigc const char **envp, 327153323Srodrigc struct pt_regs *regs) 328153323Srodrigc{ 329153323Srodrigc unsigned long addr; 330153323Srodrigc int nextarg = 1; 331153323Srodrigc long offset = 0; 332153323Srodrigc int diag; 333153323Srodrigc 334153323Srodrigc if (argc != 1) 335153323Srodrigc return KDB_ARGCOUNT; 336153323Srodrigc 337153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 338153323Srodrigc if (diag) 339153323Srodrigc return diag; 340153323Srodrigc 341153323Srodrigc xfsidbg_xalbtrace((xfs_agblock_t) addr); 342153323Srodrigc return 0; 343153323Srodrigc} 344153323Srodrigc 345153323Srodrigcstatic int kdbm_xfs_xalgtrace( 346153323Srodrigc int argc, 347153323Srodrigc const char **argv, 348153323Srodrigc const char **envp, 349153323Srodrigc struct pt_regs *regs) 350153323Srodrigc{ 351153323Srodrigc unsigned long addr; 352153323Srodrigc int nextarg = 1; 353153323Srodrigc long offset = 0; 354153323Srodrigc int diag; 355153323Srodrigc 356153323Srodrigc if (argc != 1) 357153323Srodrigc return KDB_ARGCOUNT; 358153323Srodrigc 359153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 360153323Srodrigc if (diag) 361153323Srodrigc return diag; 362153323Srodrigc 363153323Srodrigc xfsidbg_xalgtrace((xfs_agnumber_t) addr); 364153323Srodrigc return 0; 365153323Srodrigc} 366153323Srodrigc#endif 367153323Srodrigc 368153323Srodrigc#ifdef XFS_ATTR_TRACE 369153323Srodrigcstatic int kdbm_xfs_xattrtrace( 370153323Srodrigc int argc, 371153323Srodrigc const char **argv, 372153323Srodrigc const char **envp, 373153323Srodrigc struct pt_regs *regs) 374153323Srodrigc{ 375153323Srodrigc unsigned long addr; 376153323Srodrigc int nextarg = 1; 377153323Srodrigc long offset = 0; 378153323Srodrigc int diag; 379153323Srodrigc 380153323Srodrigc if (argc != 1) 381153323Srodrigc return KDB_ARGCOUNT; 382153323Srodrigc 383153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 384153323Srodrigc if (diag) 385153323Srodrigc return diag; 386153323Srodrigc 387153323Srodrigc xfsidbg_xattrtrace((int) addr); 388153323Srodrigc return 0; 389153323Srodrigc} 390153323Srodrigc#endif 391153323Srodrigc 392153323Srodrigc#ifdef XFS_BLI_TRACE 393153323Srodrigcstatic int kdbm_xfs_xblitrace( 394153323Srodrigc int argc, 395153323Srodrigc const char **argv, 396153323Srodrigc const char **envp, 397153323Srodrigc struct pt_regs *regs) 398153323Srodrigc{ 399153323Srodrigc unsigned long addr; 400153323Srodrigc int nextarg = 1; 401153323Srodrigc long offset = 0; 402153323Srodrigc int diag; 403153323Srodrigc 404153323Srodrigc if (argc != 1) 405153323Srodrigc return KDB_ARGCOUNT; 406153323Srodrigc 407153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 408153323Srodrigc if (diag) 409153323Srodrigc return diag; 410153323Srodrigc 411153323Srodrigc xfsidbg_xblitrace((xfs_buf_log_item_t *) addr); 412153323Srodrigc return 0; 413153323Srodrigc} 414153323Srodrigc#endif 415153323Srodrigc 416153323Srodrigc#ifdef XFS_BMAP_TRACE 417153323Srodrigcstatic int kdbm_xfs_xbmatrace( 418153323Srodrigc int argc, 419153323Srodrigc const char **argv, 420153323Srodrigc const char **envp, 421153323Srodrigc struct pt_regs *regs) 422153323Srodrigc{ 423153323Srodrigc unsigned long addr; 424153323Srodrigc int nextarg = 1; 425153323Srodrigc long offset = 0; 426153323Srodrigc int diag; 427153323Srodrigc 428153323Srodrigc if (argc != 1) 429153323Srodrigc return KDB_ARGCOUNT; 430153323Srodrigc 431153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 432153323Srodrigc if (diag) 433153323Srodrigc return diag; 434153323Srodrigc 435153323Srodrigc xfsidbg_xbmatrace((int) addr); 436153323Srodrigc return 0; 437153323Srodrigc} 438153323Srodrigc 439153323Srodrigcstatic int kdbm_xfs_xbmitrace( 440153323Srodrigc int argc, 441153323Srodrigc const char **argv, 442153323Srodrigc const char **envp, 443153323Srodrigc struct pt_regs *regs) 444153323Srodrigc{ 445153323Srodrigc unsigned long addr; 446153323Srodrigc int nextarg = 1; 447153323Srodrigc long offset = 0; 448153323Srodrigc int diag; 449153323Srodrigc 450153323Srodrigc if (argc != 1) 451153323Srodrigc return KDB_ARGCOUNT; 452153323Srodrigc 453153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 454153323Srodrigc if (diag) 455153323Srodrigc return diag; 456153323Srodrigc 457153323Srodrigc xfsidbg_xbmitrace((xfs_inode_t *) addr); 458153323Srodrigc return 0; 459153323Srodrigc} 460153323Srodrigc 461153323Srodrigcstatic int kdbm_xfs_xbmstrace( 462153323Srodrigc int argc, 463153323Srodrigc const char **argv, 464153323Srodrigc const char **envp, 465153323Srodrigc struct pt_regs *regs) 466153323Srodrigc{ 467153323Srodrigc unsigned long addr; 468153323Srodrigc int nextarg = 1; 469153323Srodrigc long offset = 0; 470153323Srodrigc int diag; 471153323Srodrigc 472153323Srodrigc if (argc != 1) 473153323Srodrigc return KDB_ARGCOUNT; 474153323Srodrigc 475153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 476153323Srodrigc if (diag) 477153323Srodrigc return diag; 478153323Srodrigc 479153323Srodrigc xfsidbg_xbmstrace((xfs_inode_t *) addr); 480153323Srodrigc return 0; 481153323Srodrigc} 482153323Srodrigc 483153323Srodrigcstatic int kdbm_xfs_xbxatrace( 484153323Srodrigc int argc, 485153323Srodrigc const char **argv, 486153323Srodrigc const char **envp, 487153323Srodrigc struct pt_regs *regs) 488153323Srodrigc{ 489153323Srodrigc unsigned long addr; 490153323Srodrigc int nextarg = 1; 491153323Srodrigc long offset = 0; 492153323Srodrigc int diag; 493153323Srodrigc 494153323Srodrigc if (argc != 1) 495153323Srodrigc return KDB_ARGCOUNT; 496153323Srodrigc 497153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 498153323Srodrigc if (diag) 499153323Srodrigc return diag; 500153323Srodrigc 501153323Srodrigc xfsidbg_xbxatrace((int) addr); 502153323Srodrigc return 0; 503153323Srodrigc} 504153323Srodrigc 505153323Srodrigcstatic int kdbm_xfs_xbxitrace( 506153323Srodrigc int argc, 507153323Srodrigc const char **argv, 508153323Srodrigc const char **envp, 509153323Srodrigc struct pt_regs *regs) 510153323Srodrigc{ 511153323Srodrigc unsigned long addr; 512153323Srodrigc int nextarg = 1; 513153323Srodrigc long offset = 0; 514153323Srodrigc int diag; 515153323Srodrigc 516153323Srodrigc if (argc != 1) 517153323Srodrigc return KDB_ARGCOUNT; 518153323Srodrigc 519153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 520153323Srodrigc if (diag) 521153323Srodrigc return diag; 522153323Srodrigc 523153323Srodrigc xfsidbg_xbxitrace((xfs_inode_t *) addr); 524153323Srodrigc return 0; 525153323Srodrigc} 526153323Srodrigc 527153323Srodrigcstatic int kdbm_xfs_xbxstrace( 528153323Srodrigc int argc, 529153323Srodrigc const char **argv, 530153323Srodrigc const char **envp, 531153323Srodrigc struct pt_regs *regs) 532153323Srodrigc{ 533153323Srodrigc unsigned long addr; 534153323Srodrigc int nextarg = 1; 535153323Srodrigc long offset = 0; 536153323Srodrigc int diag; 537153323Srodrigc 538153323Srodrigc if (argc != 1) 539153323Srodrigc return KDB_ARGCOUNT; 540153323Srodrigc 541153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 542153323Srodrigc if (diag) 543153323Srodrigc return diag; 544153323Srodrigc 545153323Srodrigc xfsidbg_xbxstrace((xfs_inode_t *) addr); 546153323Srodrigc return 0; 547153323Srodrigc} 548153323Srodrigc#endif 549153323Srodrigc 550153323Srodrigc#ifdef XFS_DIR2_TRACE 551153323Srodrigcstatic int kdbm_xfs_xdir2atrace( 552153323Srodrigc int argc, 553153323Srodrigc const char **argv, 554153323Srodrigc const char **envp, 555153323Srodrigc struct pt_regs *regs) 556153323Srodrigc{ 557153323Srodrigc unsigned long addr; 558153323Srodrigc int nextarg = 1; 559153323Srodrigc long offset = 0; 560153323Srodrigc int diag; 561153323Srodrigc 562153323Srodrigc if (argc != 1) 563153323Srodrigc return KDB_ARGCOUNT; 564153323Srodrigc 565153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 566153323Srodrigc if (diag) 567153323Srodrigc return diag; 568153323Srodrigc 569153323Srodrigc xfsidbg_xdir2atrace((int) addr); 570153323Srodrigc return 0; 571153323Srodrigc} 572153323Srodrigc 573153323Srodrigcstatic int kdbm_xfs_xdir2itrace( 574153323Srodrigc int argc, 575153323Srodrigc const char **argv, 576153323Srodrigc const char **envp, 577153323Srodrigc struct pt_regs *regs) 578153323Srodrigc{ 579153323Srodrigc unsigned long addr; 580153323Srodrigc int nextarg = 1; 581153323Srodrigc long offset = 0; 582153323Srodrigc int diag; 583153323Srodrigc 584153323Srodrigc if (argc != 1) 585153323Srodrigc return KDB_ARGCOUNT; 586153323Srodrigc 587153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 588153323Srodrigc if (diag) 589153323Srodrigc return diag; 590153323Srodrigc 591153323Srodrigc xfsidbg_xdir2itrace((xfs_inode_t *) addr); 592153323Srodrigc return 0; 593153323Srodrigc} 594153323Srodrigc#endif 595153323Srodrigc 596153323Srodrigc#ifdef XFS_DIR_TRACE 597153323Srodrigcstatic int kdbm_xfs_xdirtrace( 598153323Srodrigc int argc, 599153323Srodrigc const char **argv, 600153323Srodrigc const char **envp, 601153323Srodrigc struct pt_regs *regs) 602153323Srodrigc{ 603153323Srodrigc unsigned long addr; 604153323Srodrigc int nextarg = 1; 605153323Srodrigc long offset = 0; 606153323Srodrigc int diag; 607153323Srodrigc 608153323Srodrigc if (argc != 1) 609153323Srodrigc return KDB_ARGCOUNT; 610153323Srodrigc 611153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 612153323Srodrigc if (diag) 613153323Srodrigc return diag; 614153323Srodrigc 615153323Srodrigc xfsidbg_xdirtrace((int) addr); 616153323Srodrigc return 0; 617153323Srodrigc} 618153323Srodrigc#endif 619153323Srodrigc 620153323Srodrigc#ifdef XFS_LOG_TRACE 621153323Srodrigcstatic int kdbm_xfs_xiclogtrace( 622153323Srodrigc int argc, 623153323Srodrigc const char **argv, 624153323Srodrigc const char **envp, 625153323Srodrigc struct pt_regs *regs) 626153323Srodrigc{ 627153323Srodrigc unsigned long addr; 628153323Srodrigc int nextarg = 1; 629153323Srodrigc long offset = 0; 630153323Srodrigc int diag; 631153323Srodrigc 632153323Srodrigc if (argc != 1) 633153323Srodrigc return KDB_ARGCOUNT; 634153323Srodrigc 635153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 636153323Srodrigc if (diag) 637153323Srodrigc return diag; 638153323Srodrigc 639153323Srodrigc xfsidbg_xiclogtrace((xlog_in_core_t *) addr); 640153323Srodrigc return 0; 641153323Srodrigc} 642153323Srodrigc#endif 643153323Srodrigc 644153323Srodrigc#ifdef XFS_ILOCK_TRACE 645153323Srodrigcstatic int kdbm_xfs_xilock_trace( 646153323Srodrigc int argc, 647153323Srodrigc const char **argv, 648153323Srodrigc const char **envp, 649153323Srodrigc struct pt_regs *regs) 650153323Srodrigc{ 651153323Srodrigc unsigned long addr; 652153323Srodrigc int nextarg = 1; 653153323Srodrigc long offset = 0; 654153323Srodrigc int diag; 655153323Srodrigc 656153323Srodrigc if (argc != 1) 657153323Srodrigc return KDB_ARGCOUNT; 658153323Srodrigc 659153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 660153323Srodrigc if (diag) 661153323Srodrigc return diag; 662153323Srodrigc 663153323Srodrigc xfsidbg_xilock_trace((xfs_inode_t *) addr); 664153323Srodrigc return 0; 665153323Srodrigc} 666153323Srodrigc 667153323Srodrigcstatic int kdbm_xfs_xailock_trace( 668153323Srodrigc int argc, 669153323Srodrigc const char **argv, 670153323Srodrigc const char **envp, 671153323Srodrigc struct pt_regs *regs) 672153323Srodrigc{ 673153323Srodrigc unsigned long addr; 674153323Srodrigc int nextarg = 1; 675153323Srodrigc long offset = 0; 676153323Srodrigc int diag; 677153323Srodrigc 678153323Srodrigc if (argc != 1) 679153323Srodrigc return KDB_ARGCOUNT; 680153323Srodrigc 681153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 682153323Srodrigc if (diag) 683153323Srodrigc return diag; 684153323Srodrigc 685153323Srodrigc xfsidbg_xailock_trace((int) addr); 686153323Srodrigc return 0; 687153323Srodrigc} 688153323Srodrigc#endif 689153323Srodrigc 690153323Srodrigc#ifdef XFS_LOG_TRACE 691153323Srodrigcstatic int kdbm_xfs_xlog_granttrace( 692153323Srodrigc int argc, 693153323Srodrigc const char **argv, 694153323Srodrigc const char **envp, 695153323Srodrigc struct pt_regs *regs) 696153323Srodrigc{ 697153323Srodrigc unsigned long addr; 698153323Srodrigc int nextarg = 1; 699153323Srodrigc long offset = 0; 700153323Srodrigc int diag; 701153323Srodrigc 702153323Srodrigc if (argc != 1) 703153323Srodrigc return KDB_ARGCOUNT; 704153323Srodrigc 705153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 706153323Srodrigc if (diag) 707153323Srodrigc return diag; 708153323Srodrigc 709153323Srodrigc xfsidbg_xlog_granttrace((xlog_t *) addr); 710153323Srodrigc return 0; 711153323Srodrigc} 712153323Srodrigc#endif 713153323Srodrigc 714153323Srodrigc#ifdef XFS_DQUOT_TRACE 715153323Srodrigcstatic int kdbm_xfs_xqm_dqtrace( 716153323Srodrigc int argc, 717153323Srodrigc const char **argv, 718153323Srodrigc const char **envp, 719153323Srodrigc struct pt_regs *regs) 720153323Srodrigc{ 721153323Srodrigc unsigned long addr; 722153323Srodrigc int nextarg = 1; 723153323Srodrigc long offset = 0; 724153323Srodrigc int diag; 725153323Srodrigc 726153323Srodrigc if (argc != 1) 727153323Srodrigc return KDB_ARGCOUNT; 728153323Srodrigc 729153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 730153323Srodrigc if (diag) 731153323Srodrigc return diag; 732153323Srodrigc 733153323Srodrigc xfsidbg_xqm_dqtrace((xfs_dquot_t *) addr); 734153323Srodrigc return 0; 735153323Srodrigc} 736153323Srodrigc#endif 737153323Srodrigc 738153323Srodrigc#ifdef XFS_RW_TRACE 739153323Srodrigcstatic int kdbm_xfs_xrwtrace( 740153323Srodrigc int argc, 741153323Srodrigc const char **argv, 742153323Srodrigc const char **envp, 743153323Srodrigc struct pt_regs *regs) 744153323Srodrigc{ 745159451Srodrigc unsigned long addr; 746159451Srodrigc int nextarg = 1; 747159451Srodrigc long offset = 0; 748159451Srodrigc int diag; 749159451Srodrigc ktrace_entry_t *ktep; 750159451Srodrigc ktrace_snap_t kts; 751159451Srodrigc xfs_inode_t *ip; 752153323Srodrigc 753153323Srodrigc if (argc != 1) 754153323Srodrigc return KDB_ARGCOUNT; 755153323Srodrigc 756153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 757153323Srodrigc if (diag) 758153323Srodrigc return diag; 759153323Srodrigc 760159451Srodrigc ip = (xfs_inode_t *) addr; 761159451Srodrigc if (ip->i_rwtrace == NULL) { 762159451Srodrigc qprintf("The inode trace buffer is not initialized\n"); 763159451Srodrigc return 0; 764159451Srodrigc } 765159451Srodrigc qprintf("i_rwtrace = 0x%p\n", ip->i_rwtrace); 766159451Srodrigc ktep = ktrace_first(ip->i_rwtrace, &kts); 767159451Srodrigc while (ktep != NULL) { 768159451Srodrigc if (xfs_rw_trace_entry(ktep)) 769159451Srodrigc qprintf("\n"); 770159451Srodrigc ktep = ktrace_next(ip->i_rwtrace, &kts); 771159451Srodrigc } 772153323Srodrigc return 0; 773153323Srodrigc} 774153323Srodrigc#endif 775153323Srodrigc 776153323Srodrigcstatic int kdbm_xfs_xalloc( 777153323Srodrigc int argc, 778153323Srodrigc const char **argv, 779153323Srodrigc const char **envp, 780153323Srodrigc struct pt_regs *regs) 781153323Srodrigc{ 782153323Srodrigc unsigned long addr; 783153323Srodrigc int nextarg = 1; 784153323Srodrigc long offset = 0; 785153323Srodrigc int diag; 786153323Srodrigc 787153323Srodrigc if (argc != 1) 788153323Srodrigc return KDB_ARGCOUNT; 789153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 790153323Srodrigc if (diag) 791153323Srodrigc return diag; 792153323Srodrigc 793153323Srodrigc xfsidbg_xalloc((xfs_alloc_arg_t *) addr); 794153323Srodrigc return 0; 795153323Srodrigc} 796153323Srodrigc 797153323Srodrigc#ifdef XFS_ALLOC_TRACE 798153323Srodrigcstatic int kdbm_xfs_xalmtrace( 799153323Srodrigc int argc, 800153323Srodrigc const char **argv, 801153323Srodrigc const char **envp, 802153323Srodrigc struct pt_regs *regs) 803153323Srodrigc{ 804153323Srodrigc unsigned long addr; 805153323Srodrigc int nextarg = 1; 806153323Srodrigc long offset = 0; 807153323Srodrigc int diag; 808153323Srodrigc 809153323Srodrigc if (argc != 1) 810153323Srodrigc return KDB_ARGCOUNT; 811153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 812153323Srodrigc if (diag) 813153323Srodrigc return diag; 814153323Srodrigc 815153323Srodrigc xfsidbg_xalmtrace((xfs_mount_t *) addr); 816153323Srodrigc return 0; 817153323Srodrigc} 818153323Srodrigc 819153323Srodrigcstatic int kdbm_xfs_xalttrace( 820153323Srodrigc int argc, 821153323Srodrigc const char **argv, 822153323Srodrigc const char **envp, 823153323Srodrigc struct pt_regs *regs) 824153323Srodrigc{ 825153323Srodrigc unsigned long addr; 826153323Srodrigc int nextarg = 1; 827153323Srodrigc long offset = 0; 828153323Srodrigc int diag; 829153323Srodrigc 830153323Srodrigc if (argc != 1) 831153323Srodrigc return KDB_ARGCOUNT; 832153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 833153323Srodrigc if (diag) 834153323Srodrigc return diag; 835153323Srodrigc 836153323Srodrigc xfsidbg_xalttrace((int) addr); 837153323Srodrigc return 0; 838153323Srodrigc} 839153323Srodrigc#endif /* XFS_ALLOC_TRACE */ 840153323Srodrigc 841153323Srodrigcstatic int kdbm_xfs_xattrcontext( 842153323Srodrigc int argc, 843153323Srodrigc const char **argv, 844153323Srodrigc const char **envp, 845153323Srodrigc struct pt_regs *regs) 846153323Srodrigc{ 847153323Srodrigc unsigned long addr; 848153323Srodrigc int nextarg = 1; 849153323Srodrigc long offset = 0; 850153323Srodrigc int diag; 851153323Srodrigc 852153323Srodrigc if (argc != 1) 853153323Srodrigc return KDB_ARGCOUNT; 854153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 855153323Srodrigc if (diag) 856153323Srodrigc return diag; 857153323Srodrigc 858153323Srodrigc xfsidbg_xattrcontext((xfs_attr_list_context_t *) addr); 859153323Srodrigc return 0; 860153323Srodrigc} 861153323Srodrigc 862153323Srodrigcstatic int kdbm_xfs_xattrleaf( 863153323Srodrigc int argc, 864153323Srodrigc const char **argv, 865153323Srodrigc const char **envp, 866153323Srodrigc struct pt_regs *regs) 867153323Srodrigc{ 868153323Srodrigc unsigned long addr; 869153323Srodrigc int nextarg = 1; 870153323Srodrigc long offset = 0; 871153323Srodrigc int diag; 872153323Srodrigc 873153323Srodrigc if (argc != 1) 874153323Srodrigc return KDB_ARGCOUNT; 875153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 876153323Srodrigc if (diag) 877153323Srodrigc return diag; 878153323Srodrigc 879153323Srodrigc xfsidbg_xattrleaf((xfs_attr_leafblock_t *) addr); 880153323Srodrigc return 0; 881153323Srodrigc} 882153323Srodrigc 883153323Srodrigcstatic int kdbm_xfs_xattrsf( 884153323Srodrigc int argc, 885153323Srodrigc const char **argv, 886153323Srodrigc const char **envp, 887153323Srodrigc struct pt_regs *regs) 888153323Srodrigc{ 889153323Srodrigc unsigned long addr; 890153323Srodrigc int nextarg = 1; 891153323Srodrigc long offset = 0; 892153323Srodrigc int diag; 893153323Srodrigc 894153323Srodrigc if (argc != 1) 895153323Srodrigc return KDB_ARGCOUNT; 896153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 897153323Srodrigc if (diag) 898153323Srodrigc return diag; 899153323Srodrigc 900153323Srodrigc xfsidbg_xattrsf((xfs_attr_shortform_t *) addr); 901153323Srodrigc return 0; 902153323Srodrigc} 903153323Srodrigc 904153323Srodrigcstatic int kdbm_xfs_xbirec( 905153323Srodrigc int argc, 906153323Srodrigc const char **argv, 907153323Srodrigc const char **envp, 908153323Srodrigc struct pt_regs *regs) 909153323Srodrigc{ 910153323Srodrigc unsigned long addr; 911153323Srodrigc int nextarg = 1; 912153323Srodrigc long offset = 0; 913153323Srodrigc int diag; 914153323Srodrigc 915153323Srodrigc if (argc != 1) 916153323Srodrigc return KDB_ARGCOUNT; 917153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 918153323Srodrigc if (diag) 919153323Srodrigc return diag; 920153323Srodrigc 921153323Srodrigc xfsidbg_xbirec((xfs_bmbt_irec_t *) addr); 922153323Srodrigc return 0; 923153323Srodrigc} 924153323Srodrigc 925153323Srodrigcstatic int kdbm_xfs_xbmalla( 926153323Srodrigc int argc, 927153323Srodrigc const char **argv, 928153323Srodrigc const char **envp, 929153323Srodrigc struct pt_regs *regs) 930153323Srodrigc{ 931153323Srodrigc unsigned long addr; 932153323Srodrigc int nextarg = 1; 933153323Srodrigc long offset = 0; 934153323Srodrigc int diag; 935153323Srodrigc 936153323Srodrigc if (argc != 1) 937153323Srodrigc return KDB_ARGCOUNT; 938153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 939153323Srodrigc if (diag) 940153323Srodrigc return diag; 941153323Srodrigc 942153323Srodrigc xfsidbg_xbmalla((xfs_bmalloca_t *)addr); 943153323Srodrigc return 0; 944153323Srodrigc} 945153323Srodrigc 946153323Srodrigcstatic int kdbm_xfs_xbrec( 947153323Srodrigc int argc, 948153323Srodrigc const char **argv, 949153323Srodrigc const char **envp, 950153323Srodrigc struct pt_regs *regs) 951153323Srodrigc{ 952153323Srodrigc unsigned long addr; 953153323Srodrigc int nextarg = 1; 954153323Srodrigc long offset = 0; 955153323Srodrigc int diag; 956153323Srodrigc 957153323Srodrigc if (argc != 1) 958153323Srodrigc return KDB_ARGCOUNT; 959153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 960153323Srodrigc if (diag) 961153323Srodrigc return diag; 962153323Srodrigc 963153323Srodrigc xfsidbg_xbrec((xfs_bmbt_rec_64_t *) addr); 964153323Srodrigc return 0; 965153323Srodrigc} 966153323Srodrigc 967153323Srodrigcstatic int kdbm_xfs_xbroot( 968153323Srodrigc int argc, 969153323Srodrigc const char **argv, 970153323Srodrigc const char **envp, 971153323Srodrigc struct pt_regs *regs) 972153323Srodrigc{ 973153323Srodrigc unsigned long addr; 974153323Srodrigc int nextarg = 1; 975153323Srodrigc long offset = 0; 976153323Srodrigc int diag; 977153323Srodrigc 978153323Srodrigc if (argc != 1) 979153323Srodrigc return KDB_ARGCOUNT; 980153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 981153323Srodrigc if (diag) 982153323Srodrigc return diag; 983153323Srodrigc 984153323Srodrigc xfsidbg_xbroot((xfs_inode_t *) addr); 985153323Srodrigc return 0; 986153323Srodrigc} 987153323Srodrigc 988153323Srodrigcstatic int kdbm_xfs_xbroota( 989153323Srodrigc int argc, 990153323Srodrigc const char **argv, 991153323Srodrigc const char **envp, 992153323Srodrigc struct pt_regs *regs) 993153323Srodrigc{ 994153323Srodrigc unsigned long addr; 995153323Srodrigc int nextarg = 1; 996153323Srodrigc long offset = 0; 997153323Srodrigc int diag; 998153323Srodrigc 999153323Srodrigc if (argc != 1) 1000153323Srodrigc return KDB_ARGCOUNT; 1001153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1002153323Srodrigc if (diag) 1003153323Srodrigc return diag; 1004153323Srodrigc 1005153323Srodrigc xfsidbg_xbroota((xfs_inode_t *) addr); 1006153323Srodrigc return 0; 1007153323Srodrigc} 1008153323Srodrigc 1009153323Srodrigcstatic int kdbm_xfs_xbtcur( 1010153323Srodrigc int argc, 1011153323Srodrigc const char **argv, 1012153323Srodrigc const char **envp, 1013153323Srodrigc struct pt_regs *regs) 1014153323Srodrigc{ 1015153323Srodrigc unsigned long addr; 1016153323Srodrigc int nextarg = 1; 1017153323Srodrigc long offset = 0; 1018153323Srodrigc int diag; 1019153323Srodrigc 1020153323Srodrigc if (argc != 1) 1021153323Srodrigc return KDB_ARGCOUNT; 1022153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1023153323Srodrigc if (diag) 1024153323Srodrigc return diag; 1025153323Srodrigc 1026153323Srodrigc xfsidbg_xbtcur((xfs_btree_cur_t *) addr); 1027153323Srodrigc return 0; 1028153323Srodrigc} 1029153323Srodrigc 1030153323Srodrigcstatic int kdbm_xfs_xbuf( 1031153323Srodrigc int argc, 1032153323Srodrigc const char **argv, 1033153323Srodrigc const char **envp, 1034153323Srodrigc struct pt_regs *regs) 1035153323Srodrigc{ 1036153323Srodrigc unsigned long addr; 1037153323Srodrigc int nextarg = 1; 1038153323Srodrigc long offset = 0; 1039153323Srodrigc int diag; 1040153323Srodrigc 1041153323Srodrigc if (argc != 1) 1042153323Srodrigc return KDB_ARGCOUNT; 1043153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1044153323Srodrigc if (diag) 1045153323Srodrigc return diag; 1046153323Srodrigc 1047153323Srodrigc xfsidbg_xbuf((xfs_buf_t *) addr); 1048153323Srodrigc return 0; 1049153323Srodrigc} 1050153323Srodrigc 1051153323Srodrigc 1052153323Srodrigcstatic int kdbm_xfs_xarg( 1053153323Srodrigc int argc, 1054153323Srodrigc const char **argv, 1055153323Srodrigc const char **envp, 1056153323Srodrigc struct pt_regs *regs) 1057153323Srodrigc{ 1058153323Srodrigc unsigned long addr; 1059153323Srodrigc int nextarg = 1; 1060153323Srodrigc long offset = 0; 1061153323Srodrigc int diag; 1062153323Srodrigc 1063153323Srodrigc if (argc != 1) 1064153323Srodrigc return KDB_ARGCOUNT; 1065153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1066153323Srodrigc if (diag) 1067153323Srodrigc return diag; 1068153323Srodrigc 1069153323Srodrigc xfsidbg_xarg((int) addr); 1070153323Srodrigc return 0; 1071153323Srodrigc} 1072153323Srodrigc 1073153323Srodrigcstatic int kdbm_xfs_xchksum( 1074153323Srodrigc int argc, 1075153323Srodrigc const char **argv, 1076153323Srodrigc const char **envp, 1077153323Srodrigc struct pt_regs *regs) 1078153323Srodrigc{ 1079153323Srodrigc unsigned long addr; 1080153323Srodrigc int nextarg = 1; 1081153323Srodrigc long offset = 0; 1082153323Srodrigc int diag; 1083153323Srodrigc 1084153323Srodrigc if (argc != 1) 1085153323Srodrigc return KDB_ARGCOUNT; 1086153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1087153323Srodrigc if (diag) 1088153323Srodrigc return diag; 1089153323Srodrigc 1090153323Srodrigc xfsidbg_xchksum((uint *) addr); 1091153323Srodrigc return 0; 1092153323Srodrigc} 1093153323Srodrigc 1094153323Srodrigc 1095153323Srodrigcstatic int kdbm_xfs_xchash( 1096153323Srodrigc int argc, 1097153323Srodrigc const char **argv, 1098153323Srodrigc const char **envp, 1099153323Srodrigc struct pt_regs *regs) 1100153323Srodrigc{ 1101153323Srodrigc unsigned long addr; 1102153323Srodrigc int nextarg = 1; 1103153323Srodrigc long offset = 0; 1104153323Srodrigc int diag; 1105153323Srodrigc 1106153323Srodrigc if (argc != 1) 1107153323Srodrigc return KDB_ARGCOUNT; 1108153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1109153323Srodrigc if (diag) 1110153323Srodrigc return diag; 1111153323Srodrigc 1112153323Srodrigc xfsidbg_xchash((xfs_mount_t *) addr); 1113153323Srodrigc return 0; 1114153323Srodrigc} 1115153323Srodrigc 1116153323Srodrigcstatic int kdbm_xfs_xchashlist( 1117153323Srodrigc int argc, 1118153323Srodrigc const char **argv, 1119153323Srodrigc const char **envp, 1120153323Srodrigc struct pt_regs *regs) 1121153323Srodrigc{ 1122153323Srodrigc unsigned long addr; 1123153323Srodrigc int nextarg = 1; 1124153323Srodrigc long offset = 0; 1125153323Srodrigc int diag; 1126153323Srodrigc 1127153323Srodrigc if (argc != 1) 1128153323Srodrigc return KDB_ARGCOUNT; 1129153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1130153323Srodrigc if (diag) 1131153323Srodrigc return diag; 1132153323Srodrigc 1133153323Srodrigc xfsidbg_xchashlist((xfs_chashlist_t *) addr); 1134153323Srodrigc return 0; 1135153323Srodrigc} 1136153323Srodrigc 1137153323Srodrigc 1138153323Srodrigcstatic int kdbm_xfs_xdaargs( 1139153323Srodrigc int argc, 1140153323Srodrigc const char **argv, 1141153323Srodrigc const char **envp, 1142153323Srodrigc struct pt_regs *regs) 1143153323Srodrigc{ 1144153323Srodrigc unsigned long addr; 1145153323Srodrigc int nextarg = 1; 1146153323Srodrigc long offset = 0; 1147153323Srodrigc int diag; 1148153323Srodrigc 1149153323Srodrigc if (argc != 1) 1150153323Srodrigc return KDB_ARGCOUNT; 1151153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1152153323Srodrigc if (diag) 1153153323Srodrigc return diag; 1154153323Srodrigc 1155153323Srodrigc xfsidbg_xdaargs((xfs_da_args_t *) addr); 1156153323Srodrigc return 0; 1157153323Srodrigc} 1158153323Srodrigc 1159153323Srodrigcstatic int kdbm_xfs_xdabuf( 1160153323Srodrigc int argc, 1161153323Srodrigc const char **argv, 1162153323Srodrigc const char **envp, 1163153323Srodrigc struct pt_regs *regs) 1164153323Srodrigc{ 1165153323Srodrigc unsigned long addr; 1166153323Srodrigc int nextarg = 1; 1167153323Srodrigc long offset = 0; 1168153323Srodrigc int diag; 1169153323Srodrigc 1170153323Srodrigc if (argc != 1) 1171153323Srodrigc return KDB_ARGCOUNT; 1172153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1173153323Srodrigc if (diag) 1174153323Srodrigc return diag; 1175153323Srodrigc 1176153323Srodrigc xfsidbg_xdabuf((xfs_dabuf_t *) addr); 1177153323Srodrigc return 0; 1178153323Srodrigc} 1179153323Srodrigc 1180153323Srodrigcstatic int kdbm_xfs_xdanode( 1181153323Srodrigc int argc, 1182153323Srodrigc const char **argv, 1183153323Srodrigc const char **envp, 1184153323Srodrigc struct pt_regs *regs) 1185153323Srodrigc{ 1186153323Srodrigc unsigned long addr; 1187153323Srodrigc int nextarg = 1; 1188153323Srodrigc long offset = 0; 1189153323Srodrigc int diag; 1190153323Srodrigc 1191153323Srodrigc if (argc != 1) 1192153323Srodrigc return KDB_ARGCOUNT; 1193153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1194153323Srodrigc if (diag) 1195153323Srodrigc return diag; 1196153323Srodrigc 1197153323Srodrigc xfsidbg_xdanode((xfs_da_intnode_t *) addr); 1198153323Srodrigc return 0; 1199153323Srodrigc} 1200153323Srodrigc 1201153323Srodrigcstatic int kdbm_xfs_xdastate( 1202153323Srodrigc int argc, 1203153323Srodrigc const char **argv, 1204153323Srodrigc const char **envp, 1205153323Srodrigc struct pt_regs *regs) 1206153323Srodrigc{ 1207153323Srodrigc unsigned long addr; 1208153323Srodrigc int nextarg = 1; 1209153323Srodrigc long offset = 0; 1210153323Srodrigc int diag; 1211153323Srodrigc 1212153323Srodrigc if (argc != 1) 1213153323Srodrigc return KDB_ARGCOUNT; 1214153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1215153323Srodrigc if (diag) 1216153323Srodrigc return diag; 1217153323Srodrigc 1218153323Srodrigc xfsidbg_xdastate((xfs_da_state_t *) addr); 1219153323Srodrigc return 0; 1220153323Srodrigc} 1221153323Srodrigc 1222153323Srodrigcstatic int kdbm_xfs_xdirleaf( 1223153323Srodrigc int argc, 1224153323Srodrigc const char **argv, 1225153323Srodrigc const char **envp, 1226153323Srodrigc struct pt_regs *regs) 1227153323Srodrigc{ 1228153323Srodrigc unsigned long addr; 1229153323Srodrigc int nextarg = 1; 1230153323Srodrigc long offset = 0; 1231153323Srodrigc int diag; 1232153323Srodrigc 1233153323Srodrigc if (argc != 1) 1234153323Srodrigc return KDB_ARGCOUNT; 1235153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1236153323Srodrigc if (diag) 1237153323Srodrigc return diag; 1238153323Srodrigc 1239153323Srodrigc xfsidbg_xdirleaf((xfs_dir_leafblock_t *) addr); 1240153323Srodrigc return 0; 1241153323Srodrigc} 1242153323Srodrigc 1243153323Srodrigcstatic int kdbm_xfs_xdirsf( 1244153323Srodrigc int argc, 1245153323Srodrigc const char **argv, 1246153323Srodrigc const char **envp, 1247153323Srodrigc struct pt_regs *regs) 1248153323Srodrigc{ 1249153323Srodrigc unsigned long addr; 1250153323Srodrigc int nextarg = 1; 1251153323Srodrigc long offset = 0; 1252153323Srodrigc int diag; 1253153323Srodrigc 1254153323Srodrigc if (argc != 1) 1255153323Srodrigc return KDB_ARGCOUNT; 1256153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1257153323Srodrigc if (diag) 1258153323Srodrigc return diag; 1259153323Srodrigc 1260153323Srodrigc xfsidbg_xdirsf((xfs_dir_shortform_t *) addr); 1261153323Srodrigc return 0; 1262153323Srodrigc} 1263153323Srodrigc 1264153323Srodrigcstatic int kdbm_xfs_xdir2free( 1265153323Srodrigc int argc, 1266153323Srodrigc const char **argv, 1267153323Srodrigc const char **envp, 1268153323Srodrigc struct pt_regs *regs) 1269153323Srodrigc{ 1270153323Srodrigc unsigned long addr; 1271153323Srodrigc int nextarg = 1; 1272153323Srodrigc long offset = 0; 1273153323Srodrigc int diag; 1274153323Srodrigc 1275153323Srodrigc if (argc != 1) 1276153323Srodrigc return KDB_ARGCOUNT; 1277153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1278153323Srodrigc if (diag) 1279153323Srodrigc return diag; 1280153323Srodrigc 1281153323Srodrigc xfsidbg_xdir2free((xfs_dir2_free_t *) addr); 1282153323Srodrigc return 0; 1283153323Srodrigc} 1284153323Srodrigc 1285153323Srodrigcstatic int kdbm_xfs_xdir2sf( 1286153323Srodrigc int argc, 1287153323Srodrigc const char **argv, 1288153323Srodrigc const char **envp, 1289153323Srodrigc struct pt_regs *regs) 1290153323Srodrigc{ 1291153323Srodrigc unsigned long addr; 1292153323Srodrigc int nextarg = 1; 1293153323Srodrigc long offset = 0; 1294153323Srodrigc int diag; 1295153323Srodrigc 1296153323Srodrigc if (argc != 1) 1297153323Srodrigc return KDB_ARGCOUNT; 1298153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1299153323Srodrigc if (diag) 1300153323Srodrigc return diag; 1301153323Srodrigc 1302153323Srodrigc xfsidbg_xdir2sf((xfs_dir2_sf_t *) addr); 1303153323Srodrigc return 0; 1304153323Srodrigc} 1305153323Srodrigc 1306153323Srodrigcstatic int kdbm_xfs_xexlist( 1307153323Srodrigc int argc, 1308153323Srodrigc const char **argv, 1309153323Srodrigc const char **envp, 1310153323Srodrigc struct pt_regs *regs) 1311153323Srodrigc{ 1312153323Srodrigc unsigned long addr; 1313153323Srodrigc int nextarg = 1; 1314153323Srodrigc long offset = 0; 1315153323Srodrigc int diag; 1316153323Srodrigc 1317153323Srodrigc if (argc != 1) 1318153323Srodrigc return KDB_ARGCOUNT; 1319153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1320153323Srodrigc if (diag) 1321153323Srodrigc return diag; 1322153323Srodrigc 1323153323Srodrigc xfsidbg_xexlist((xfs_inode_t *) addr); 1324153323Srodrigc return 0; 1325153323Srodrigc} 1326153323Srodrigc 1327153323Srodrigcstatic int kdbm_xfs_xflist( 1328153323Srodrigc int argc, 1329153323Srodrigc const char **argv, 1330153323Srodrigc const char **envp, 1331153323Srodrigc struct pt_regs *regs) 1332153323Srodrigc{ 1333153323Srodrigc unsigned long addr; 1334153323Srodrigc int nextarg = 1; 1335153323Srodrigc long offset = 0; 1336153323Srodrigc int diag; 1337153323Srodrigc 1338153323Srodrigc if (argc != 1) 1339153323Srodrigc return KDB_ARGCOUNT; 1340153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1341153323Srodrigc if (diag) 1342153323Srodrigc return diag; 1343153323Srodrigc 1344153323Srodrigc xfsidbg_xflist((xfs_bmap_free_t *) addr); 1345153323Srodrigc return 0; 1346153323Srodrigc} 1347153323Srodrigc 1348153323Srodrigcstatic int kdbm_xfs_xhelp( 1349153323Srodrigc int argc, 1350153323Srodrigc const char **argv, 1351153323Srodrigc const char **envp, 1352153323Srodrigc struct pt_regs *regs) 1353153323Srodrigc{ 1354153323Srodrigc if (argc != 0) 1355153323Srodrigc return KDB_ARGCOUNT; 1356153323Srodrigc 1357153323Srodrigc xfsidbg_xhelp(); 1358153323Srodrigc return 0; 1359153323Srodrigc} 1360153323Srodrigc 1361153323Srodrigcstatic int kdbm_xfs_xiclog( 1362153323Srodrigc int argc, 1363153323Srodrigc const char **argv, 1364153323Srodrigc const char **envp, 1365153323Srodrigc struct pt_regs *regs) 1366153323Srodrigc{ 1367153323Srodrigc unsigned long addr; 1368153323Srodrigc int nextarg = 1; 1369153323Srodrigc long offset = 0; 1370153323Srodrigc int diag; 1371153323Srodrigc 1372153323Srodrigc if (argc != 1) 1373153323Srodrigc return KDB_ARGCOUNT; 1374153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1375153323Srodrigc if (diag) 1376153323Srodrigc return diag; 1377153323Srodrigc 1378153323Srodrigc xfsidbg_xiclog((xlog_in_core_t *) addr); 1379153323Srodrigc return 0; 1380153323Srodrigc} 1381153323Srodrigc 1382153323Srodrigcstatic int kdbm_xfs_xiclogall( 1383153323Srodrigc int argc, 1384153323Srodrigc const char **argv, 1385153323Srodrigc const char **envp, 1386153323Srodrigc struct pt_regs *regs) 1387153323Srodrigc{ 1388153323Srodrigc unsigned long addr; 1389153323Srodrigc int nextarg = 1; 1390153323Srodrigc long offset = 0; 1391153323Srodrigc int diag; 1392153323Srodrigc 1393153323Srodrigc if (argc != 1) 1394153323Srodrigc return KDB_ARGCOUNT; 1395153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1396153323Srodrigc if (diag) 1397153323Srodrigc return diag; 1398153323Srodrigc 1399153323Srodrigc xfsidbg_xiclogall((xlog_in_core_t *) addr); 1400153323Srodrigc return 0; 1401153323Srodrigc} 1402153323Srodrigc 1403153323Srodrigcstatic int kdbm_xfs_xiclogcb( 1404153323Srodrigc int argc, 1405153323Srodrigc const char **argv, 1406153323Srodrigc const char **envp, 1407153323Srodrigc struct pt_regs *regs) 1408153323Srodrigc{ 1409153323Srodrigc unsigned long addr; 1410153323Srodrigc int nextarg = 1; 1411153323Srodrigc long offset = 0; 1412153323Srodrigc int diag; 1413153323Srodrigc 1414153323Srodrigc if (argc != 1) 1415153323Srodrigc return KDB_ARGCOUNT; 1416153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1417153323Srodrigc if (diag) 1418153323Srodrigc return diag; 1419153323Srodrigc 1420153323Srodrigc xfsidbg_xiclogcb((xlog_in_core_t *) addr); 1421153323Srodrigc return 0; 1422153323Srodrigc} 1423153323Srodrigc 1424153323Srodrigcstatic int kdbm_xfs_xihash( 1425153323Srodrigc int argc, 1426153323Srodrigc const char **argv, 1427153323Srodrigc const char **envp, 1428153323Srodrigc struct pt_regs *regs) 1429153323Srodrigc{ 1430153323Srodrigc unsigned long addr; 1431153323Srodrigc int nextarg = 1; 1432153323Srodrigc long offset = 0; 1433153323Srodrigc int diag; 1434153323Srodrigc 1435153323Srodrigc if (argc != 1) 1436153323Srodrigc return KDB_ARGCOUNT; 1437153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1438153323Srodrigc if (diag) 1439153323Srodrigc return diag; 1440153323Srodrigc 1441153323Srodrigc xfsidbg_xihash((xfs_mount_t *) addr); 1442153323Srodrigc return 0; 1443153323Srodrigc} 1444153323Srodrigc 1445153323Srodrigcstatic int kdbm_xfs_xinodes( 1446153323Srodrigc int argc, 1447153323Srodrigc const char **argv, 1448153323Srodrigc const char **envp, 1449153323Srodrigc struct pt_regs *regs) 1450153323Srodrigc{ 1451153323Srodrigc unsigned long addr; 1452153323Srodrigc int nextarg = 1; 1453153323Srodrigc long offset = 0; 1454153323Srodrigc int diag; 1455153323Srodrigc 1456153323Srodrigc if (argc != 1) 1457153323Srodrigc return KDB_ARGCOUNT; 1458153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1459153323Srodrigc if (diag) 1460153323Srodrigc return diag; 1461153323Srodrigc 1462153323Srodrigc xfsidbg_xinodes((xfs_mount_t *) addr); 1463153323Srodrigc return 0; 1464153323Srodrigc} 1465153323Srodrigc 1466153323Srodrigcstatic int kdbm_xfs_delayed_blocks( 1467153323Srodrigc int argc, 1468153323Srodrigc const char **argv, 1469153323Srodrigc const char **envp, 1470153323Srodrigc struct pt_regs *regs) 1471153323Srodrigc{ 1472153323Srodrigc unsigned long addr; 1473153323Srodrigc int nextarg = 1; 1474153323Srodrigc long offset = 0; 1475153323Srodrigc int diag; 1476153323Srodrigc 1477153323Srodrigc if (argc != 1) 1478153323Srodrigc return KDB_ARGCOUNT; 1479153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1480153323Srodrigc if (diag) 1481153323Srodrigc return diag; 1482153323Srodrigc 1483153323Srodrigc xfsidbg_delayed_blocks((xfs_mount_t *) addr); 1484153323Srodrigc return 0; 1485153323Srodrigc} 1486153323Srodrigc 1487153323Srodrigc 1488153323Srodrigcstatic int kdbm_xfs_xinodes_quiesce( 1489153323Srodrigc int argc, 1490153323Srodrigc const char **argv, 1491153323Srodrigc const char **envp, 1492153323Srodrigc struct pt_regs *regs) 1493153323Srodrigc{ 1494153323Srodrigc unsigned long addr; 1495153323Srodrigc int nextarg = 1; 1496153323Srodrigc long offset = 0; 1497153323Srodrigc int diag; 1498153323Srodrigc 1499153323Srodrigc if (argc != 1) 1500153323Srodrigc return KDB_ARGCOUNT; 1501153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1502153323Srodrigc if (diag) 1503153323Srodrigc return diag; 1504153323Srodrigc 1505153323Srodrigc xfsidbg_xinodes_quiesce((xfs_mount_t *) addr); 1506153323Srodrigc return 0; 1507153323Srodrigc} 1508153323Srodrigc 1509153323Srodrigcstatic int kdbm_xfs_xlog( 1510153323Srodrigc int argc, 1511153323Srodrigc const char **argv, 1512153323Srodrigc const char **envp, 1513153323Srodrigc struct pt_regs *regs) 1514153323Srodrigc{ 1515153323Srodrigc unsigned long addr; 1516153323Srodrigc int nextarg = 1; 1517153323Srodrigc long offset = 0; 1518153323Srodrigc int diag; 1519153323Srodrigc 1520153323Srodrigc if (argc != 1) 1521153323Srodrigc return KDB_ARGCOUNT; 1522153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1523153323Srodrigc if (diag) 1524153323Srodrigc return diag; 1525153323Srodrigc 1526153323Srodrigc xfsidbg_xlog((xlog_t *) addr); 1527153323Srodrigc return 0; 1528153323Srodrigc} 1529153323Srodrigc 1530153323Srodrigcstatic int kdbm_xfs_xlog_ritem( 1531153323Srodrigc int argc, 1532153323Srodrigc const char **argv, 1533153323Srodrigc const char **envp, 1534153323Srodrigc struct pt_regs *regs) 1535153323Srodrigc{ 1536153323Srodrigc unsigned long addr; 1537153323Srodrigc int nextarg = 1; 1538153323Srodrigc long offset = 0; 1539153323Srodrigc int diag; 1540153323Srodrigc 1541153323Srodrigc if (argc != 1) 1542153323Srodrigc return KDB_ARGCOUNT; 1543153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1544153323Srodrigc if (diag) 1545153323Srodrigc return diag; 1546153323Srodrigc 1547153323Srodrigc xfsidbg_xlog_ritem((xlog_recover_item_t *) addr); 1548153323Srodrigc return 0; 1549153323Srodrigc} 1550153323Srodrigc 1551153323Srodrigcstatic int kdbm_xfs_xlog_rtrans( 1552153323Srodrigc int argc, 1553153323Srodrigc const char **argv, 1554153323Srodrigc const char **envp, 1555153323Srodrigc struct pt_regs *regs) 1556153323Srodrigc{ 1557153323Srodrigc unsigned long addr; 1558153323Srodrigc int nextarg = 1; 1559153323Srodrigc long offset = 0; 1560153323Srodrigc int diag; 1561153323Srodrigc 1562153323Srodrigc if (argc != 1) 1563153323Srodrigc return KDB_ARGCOUNT; 1564153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1565153323Srodrigc if (diag) 1566153323Srodrigc return diag; 1567153323Srodrigc 1568153323Srodrigc xfsidbg_xlog_rtrans((xlog_recover_t *) addr); 1569153323Srodrigc return 0; 1570153323Srodrigc} 1571153323Srodrigc 1572153323Srodrigcstatic int kdbm_xfs_xlog_rtrans_entire( 1573153323Srodrigc int argc, 1574153323Srodrigc const char **argv, 1575153323Srodrigc const char **envp, 1576153323Srodrigc struct pt_regs *regs) 1577153323Srodrigc{ 1578153323Srodrigc unsigned long addr; 1579153323Srodrigc int nextarg = 1; 1580153323Srodrigc long offset = 0; 1581153323Srodrigc int diag; 1582153323Srodrigc 1583153323Srodrigc if (argc != 1) 1584153323Srodrigc return KDB_ARGCOUNT; 1585153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1586153323Srodrigc if (diag) 1587153323Srodrigc return diag; 1588153323Srodrigc 1589153323Srodrigc xfsidbg_xlog_rtrans_entire((xlog_recover_t *) addr); 1590153323Srodrigc return 0; 1591153323Srodrigc} 1592153323Srodrigc 1593153323Srodrigcstatic int kdbm_xfs_xlog_tic( 1594153323Srodrigc int argc, 1595153323Srodrigc const char **argv, 1596153323Srodrigc const char **envp, 1597153323Srodrigc struct pt_regs *regs) 1598153323Srodrigc{ 1599153323Srodrigc unsigned long addr; 1600153323Srodrigc int nextarg = 1; 1601153323Srodrigc long offset = 0; 1602153323Srodrigc int diag; 1603153323Srodrigc 1604153323Srodrigc if (argc != 1) 1605153323Srodrigc return KDB_ARGCOUNT; 1606153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1607153323Srodrigc if (diag) 1608153323Srodrigc return diag; 1609153323Srodrigc 1610153323Srodrigc xfsidbg_xlog_tic((xlog_ticket_t *) addr); 1611153323Srodrigc return 0; 1612153323Srodrigc} 1613153323Srodrigc 1614153323Srodrigcstatic int kdbm_xfs_xlogitem( 1615153323Srodrigc int argc, 1616153323Srodrigc const char **argv, 1617153323Srodrigc const char **envp, 1618153323Srodrigc struct pt_regs *regs) 1619153323Srodrigc{ 1620153323Srodrigc unsigned long addr; 1621153323Srodrigc int nextarg = 1; 1622153323Srodrigc long offset = 0; 1623153323Srodrigc int diag; 1624153323Srodrigc 1625153323Srodrigc if (argc != 1) 1626153323Srodrigc return KDB_ARGCOUNT; 1627153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1628153323Srodrigc if (diag) 1629153323Srodrigc return diag; 1630153323Srodrigc 1631153323Srodrigc xfsidbg_xlogitem((xfs_log_item_t *) addr); 1632153323Srodrigc return 0; 1633153323Srodrigc} 1634153323Srodrigc 1635153323Srodrigcstatic int kdbm_xfs_xmount( 1636153323Srodrigc int argc, 1637153323Srodrigc const char **argv, 1638153323Srodrigc const char **envp, 1639153323Srodrigc struct pt_regs *regs) 1640153323Srodrigc{ 1641153323Srodrigc unsigned long addr; 1642153323Srodrigc int nextarg = 1; 1643153323Srodrigc long offset = 0; 1644153323Srodrigc int diag; 1645153323Srodrigc 1646153323Srodrigc if (argc != 1) 1647153323Srodrigc return KDB_ARGCOUNT; 1648153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1649153323Srodrigc if (diag) 1650153323Srodrigc return diag; 1651153323Srodrigc 1652153323Srodrigc xfsidbg_xmount((xfs_mount_t *) addr); 1653153323Srodrigc return 0; 1654153323Srodrigc} 1655153323Srodrigc 1656153323Srodrigcstatic int kdbm_xfs_xnode( 1657153323Srodrigc int argc, 1658153323Srodrigc const char **argv, 1659153323Srodrigc const char **envp, 1660153323Srodrigc struct pt_regs *regs) 1661153323Srodrigc{ 1662153323Srodrigc unsigned long addr; 1663153323Srodrigc int nextarg = 1; 1664153323Srodrigc long offset = 0; 1665153323Srodrigc int diag; 1666153323Srodrigc 1667153323Srodrigc if (argc != 1) 1668153323Srodrigc return KDB_ARGCOUNT; 1669153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1670153323Srodrigc if (diag) 1671153323Srodrigc return diag; 1672153323Srodrigc 1673153323Srodrigc xfsidbg_xnode((xfs_inode_t *) addr); 1674153323Srodrigc return 0; 1675153323Srodrigc} 1676153323Srodrigc 1677153323Srodrigcstatic int kdbm_xfs_xcore( 1678153323Srodrigc int argc, 1679153323Srodrigc const char **argv, 1680153323Srodrigc const char **envp, 1681153323Srodrigc struct pt_regs *regs) 1682153323Srodrigc{ 1683153323Srodrigc unsigned long addr; 1684153323Srodrigc int nextarg = 1; 1685153323Srodrigc long offset = 0; 1686153323Srodrigc int diag; 1687153323Srodrigc 1688153323Srodrigc if (argc != 1) 1689153323Srodrigc return KDB_ARGCOUNT; 1690153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1691153323Srodrigc if (diag) 1692153323Srodrigc return diag; 1693153323Srodrigc 1694153323Srodrigc xfsidbg_xcore((xfs_iocore_t *) addr); 1695153323Srodrigc return 0; 1696153323Srodrigc} 1697153323Srodrigc 1698153323Srodrigcstatic int kdbm_xfs_xperag( 1699153323Srodrigc int argc, 1700153323Srodrigc const char **argv, 1701153323Srodrigc const char **envp, 1702153323Srodrigc struct pt_regs *regs) 1703153323Srodrigc{ 1704153323Srodrigc unsigned long addr; 1705153323Srodrigc int nextarg = 1; 1706153323Srodrigc long offset = 0; 1707153323Srodrigc int diag; 1708153323Srodrigc 1709153323Srodrigc if (argc != 1) 1710153323Srodrigc return KDB_ARGCOUNT; 1711153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1712153323Srodrigc if (diag) 1713153323Srodrigc return diag; 1714153323Srodrigc 1715153323Srodrigc xfsidbg_xperag((xfs_mount_t *) addr); 1716153323Srodrigc return 0; 1717153323Srodrigc} 1718153323Srodrigc 1719153323Srodrigcstatic int kdbm_xfs_xqm_diskdq( 1720153323Srodrigc int argc, 1721153323Srodrigc const char **argv, 1722153323Srodrigc const char **envp, 1723153323Srodrigc struct pt_regs *regs) 1724153323Srodrigc{ 1725153323Srodrigc unsigned long addr; 1726153323Srodrigc int nextarg = 1; 1727153323Srodrigc long offset = 0; 1728153323Srodrigc int diag; 1729153323Srodrigc 1730153323Srodrigc if (argc != 1) 1731153323Srodrigc return KDB_ARGCOUNT; 1732153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1733153323Srodrigc if (diag) 1734153323Srodrigc return diag; 1735153323Srodrigc 1736153323Srodrigc xfsidbg_xqm_diskdq((xfs_disk_dquot_t *) addr); 1737153323Srodrigc return 0; 1738153323Srodrigc} 1739153323Srodrigc 1740153323Srodrigcstatic int kdbm_xfs_xqm_dqattached_inos( 1741153323Srodrigc int argc, 1742153323Srodrigc const char **argv, 1743153323Srodrigc const char **envp, 1744153323Srodrigc struct pt_regs *regs) 1745153323Srodrigc{ 1746153323Srodrigc unsigned long addr; 1747153323Srodrigc int nextarg = 1; 1748153323Srodrigc long offset = 0; 1749153323Srodrigc int diag; 1750153323Srodrigc 1751153323Srodrigc if (argc != 1) 1752153323Srodrigc return KDB_ARGCOUNT; 1753153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1754153323Srodrigc if (diag) 1755153323Srodrigc return diag; 1756153323Srodrigc 1757153323Srodrigc xfsidbg_xqm_dqattached_inos((xfs_mount_t *) addr); 1758153323Srodrigc return 0; 1759153323Srodrigc} 1760153323Srodrigc 1761153323Srodrigcstatic int kdbm_xfs_xqm_dquot( 1762153323Srodrigc int argc, 1763153323Srodrigc const char **argv, 1764153323Srodrigc const char **envp, 1765153323Srodrigc struct pt_regs *regs) 1766153323Srodrigc{ 1767153323Srodrigc unsigned long addr; 1768153323Srodrigc int nextarg = 1; 1769153323Srodrigc long offset = 0; 1770153323Srodrigc int diag; 1771153323Srodrigc 1772153323Srodrigc if (argc != 1) 1773153323Srodrigc return KDB_ARGCOUNT; 1774153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1775153323Srodrigc if (diag) 1776153323Srodrigc return diag; 1777153323Srodrigc 1778153323Srodrigc xfsidbg_xqm_dquot((xfs_dquot_t *) addr); 1779153323Srodrigc return 0; 1780153323Srodrigc} 1781153323Srodrigc 1782153323Srodrigc#ifdef CONFIG_XFS_QUOTA 1783153323Srodrigcstatic int kdbm_xfs_xqm( 1784153323Srodrigc int argc, 1785153323Srodrigc const char **argv, 1786153323Srodrigc const char **envp, 1787153323Srodrigc struct pt_regs *regs) 1788153323Srodrigc{ 1789153323Srodrigc if (argc != 0) 1790153323Srodrigc return KDB_ARGCOUNT; 1791153323Srodrigc 1792153323Srodrigc xfsidbg_xqm(); 1793153323Srodrigc return 0; 1794153323Srodrigc} 1795153323Srodrigc 1796153323Srodrigcstatic int kdbm_xfs_xqm_freelist( 1797153323Srodrigc int argc, 1798153323Srodrigc const char **argv, 1799153323Srodrigc const char **envp, 1800153323Srodrigc struct pt_regs *regs) 1801153323Srodrigc{ 1802153323Srodrigc if (argc != 0) 1803153323Srodrigc return KDB_ARGCOUNT; 1804153323Srodrigc 1805153323Srodrigc xfsidbg_xqm_freelist(); 1806153323Srodrigc return 0; 1807153323Srodrigc} 1808153323Srodrigc 1809153323Srodrigcstatic int kdbm_xfs_xqm_htab( 1810153323Srodrigc int argc, 1811153323Srodrigc const char **argv, 1812153323Srodrigc const char **envp, 1813153323Srodrigc struct pt_regs *regs) 1814153323Srodrigc{ 1815153323Srodrigc if (argc != 0) 1816153323Srodrigc return KDB_ARGCOUNT; 1817153323Srodrigc 1818153323Srodrigc xfsidbg_xqm_htab(); 1819153323Srodrigc return 0; 1820153323Srodrigc} 1821153323Srodrigc#endif 1822153323Srodrigc 1823153323Srodrigcstatic int kdbm_xfs_xqm_mplist( 1824153323Srodrigc int argc, 1825153323Srodrigc const char **argv, 1826153323Srodrigc const char **envp, 1827153323Srodrigc struct pt_regs *regs) 1828153323Srodrigc{ 1829153323Srodrigc unsigned long addr; 1830153323Srodrigc int nextarg = 1; 1831153323Srodrigc long offset = 0; 1832153323Srodrigc int diag; 1833153323Srodrigc 1834153323Srodrigc if (argc != 1) 1835153323Srodrigc return KDB_ARGCOUNT; 1836153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1837153323Srodrigc if (diag) 1838153323Srodrigc return diag; 1839153323Srodrigc 1840153323Srodrigc xfsidbg_xqm_mplist((xfs_mount_t *) addr); 1841153323Srodrigc return 0; 1842153323Srodrigc} 1843153323Srodrigc 1844153323Srodrigcstatic int kdbm_xfs_xqm_qinfo( 1845153323Srodrigc int argc, 1846153323Srodrigc const char **argv, 1847153323Srodrigc const char **envp, 1848153323Srodrigc struct pt_regs *regs) 1849153323Srodrigc{ 1850153323Srodrigc unsigned long addr; 1851153323Srodrigc int nextarg = 1; 1852153323Srodrigc long offset = 0; 1853153323Srodrigc int diag; 1854153323Srodrigc 1855153323Srodrigc if (argc != 1) 1856153323Srodrigc return KDB_ARGCOUNT; 1857153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1858153323Srodrigc if (diag) 1859153323Srodrigc return diag; 1860153323Srodrigc 1861153323Srodrigc xfsidbg_xqm_qinfo((xfs_mount_t *) addr); 1862153323Srodrigc return 0; 1863153323Srodrigc} 1864153323Srodrigc 1865153323Srodrigcstatic int kdbm_xfs_xqm_tpdqinfo( 1866153323Srodrigc int argc, 1867153323Srodrigc const char **argv, 1868153323Srodrigc const char **envp, 1869153323Srodrigc struct pt_regs *regs) 1870153323Srodrigc{ 1871153323Srodrigc unsigned long addr; 1872153323Srodrigc int nextarg = 1; 1873153323Srodrigc long offset = 0; 1874153323Srodrigc int diag; 1875153323Srodrigc 1876153323Srodrigc if (argc != 1) 1877153323Srodrigc return KDB_ARGCOUNT; 1878153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1879153323Srodrigc if (diag) 1880153323Srodrigc return diag; 1881153323Srodrigc 1882153323Srodrigc xfsidbg_xqm_tpdqinfo((xfs_trans_t *) addr); 1883153323Srodrigc return 0; 1884153323Srodrigc} 1885153323Srodrigc 1886153323Srodrigcstatic int kdbm_xfs_xsb( 1887153323Srodrigc int argc, 1888153323Srodrigc const char **argv, 1889153323Srodrigc const char **envp, 1890153323Srodrigc struct pt_regs *regs) 1891153323Srodrigc{ 1892153323Srodrigc unsigned long addr; 1893153323Srodrigc unsigned long convert=0; 1894153323Srodrigc int nextarg = 1; 1895153323Srodrigc long offset = 0; 1896153323Srodrigc int diag; 1897153323Srodrigc 1898153323Srodrigc if (argc != 1 && argc!=2) 1899153323Srodrigc return KDB_ARGCOUNT; 1900153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1901153323Srodrigc if (diag) 1902153323Srodrigc return diag; 1903153323Srodrigc if (argc==2) { 1904153323Srodrigc /* extra argument - conversion flag */ 1905153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &convert, &offset, NULL, regs); 1906153323Srodrigc if (diag) 1907153323Srodrigc return diag; 1908153323Srodrigc } 1909153323Srodrigc 1910159451Srodrigc if (convert) 1911159451Srodrigc xfsidbg_xsb_convert((xfs_sb_t *) addr); 1912159451Srodrigc else 1913159451Srodrigc xfsidbg_xsb((xfs_sb_t *) addr); 1914153323Srodrigc return 0; 1915153323Srodrigc} 1916153323Srodrigc 1917153323Srodrigcstatic int kdbm_xfs_xtp( 1918153323Srodrigc int argc, 1919153323Srodrigc const char **argv, 1920153323Srodrigc const char **envp, 1921153323Srodrigc struct pt_regs *regs) 1922153323Srodrigc{ 1923153323Srodrigc unsigned long addr; 1924153323Srodrigc int nextarg = 1; 1925153323Srodrigc long offset = 0; 1926153323Srodrigc int diag; 1927153323Srodrigc 1928153323Srodrigc if (argc != 1) 1929153323Srodrigc return KDB_ARGCOUNT; 1930153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1931153323Srodrigc if (diag) 1932153323Srodrigc return diag; 1933153323Srodrigc 1934153323Srodrigc xfsidbg_xtp((xfs_trans_t *) addr); 1935153323Srodrigc return 0; 1936153323Srodrigc} 1937153323Srodrigc 1938153323Srodrigcstatic int kdbm_xfs_xtrans_res( 1939153323Srodrigc int argc, 1940153323Srodrigc const char **argv, 1941153323Srodrigc const char **envp, 1942153323Srodrigc struct pt_regs *regs) 1943153323Srodrigc{ 1944153323Srodrigc unsigned long addr; 1945153323Srodrigc int nextarg = 1; 1946153323Srodrigc long offset = 0; 1947153323Srodrigc int diag; 1948153323Srodrigc 1949153323Srodrigc if (argc != 1) 1950153323Srodrigc return KDB_ARGCOUNT; 1951153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 1952153323Srodrigc if (diag) 1953153323Srodrigc return diag; 1954153323Srodrigc 1955153323Srodrigc xfsidbg_xtrans_res((xfs_mount_t *) addr); 1956153323Srodrigc return 0; 1957153323Srodrigc} 1958153323Srodrigc 1959153323Srodrigc/* 1960153323Srodrigc * Vnode descriptor dump. 1961153323Srodrigc * This table is a string version of all the flags defined in vnode.h. 1962153323Srodrigc */ 1963153323Srodrigcchar *tab_vflags[] = { 1964153323Srodrigc /* local only flags */ 1965153323Srodrigc "VINACT", /* 0x01 */ 1966153323Srodrigc "VRECLM", /* 0x02 */ 1967153323Srodrigc "VWAIT", /* 0x04 */ 1968153323Srodrigc "VMODIFIED", /* 0x08 */ 1969153323Srodrigc "INVALID0x10", /* 0x10 */ 1970153323Srodrigc "INVALID0x20", /* 0x20 */ 1971153323Srodrigc "INVALID0x40", /* 0x40 */ 1972153323Srodrigc "INVALID0x80", /* 0x80 */ 1973153323Srodrigc "INVALID0x100", /* 0x100 */ 1974153323Srodrigc "INVALID0x200", /* 0x200 */ 1975153323Srodrigc "INVALID0x400", /* 0x400 */ 1976153323Srodrigc "INVALID0x800", /* 0x800 */ 1977153323Srodrigc "INVALID0x1000", /* 0x1000 */ 1978153323Srodrigc "INVALID0x2000", /* 0x2000 */ 1979153323Srodrigc "INVALID0x4000", /* 0x4000 */ 1980153323Srodrigc "INVALID0x8000", /* 0x8000 */ 1981153323Srodrigc "INVALID0x10000", /* 0x10000 */ 1982153323Srodrigc "INVALID0x20000", /* 0x20000 */ 1983153323Srodrigc "INVALID0x40000", /* 0x40000 */ 1984153323Srodrigc "INVALID0x80000", /* 0x80000 */ 1985153323Srodrigc "VROOT", /* 0x100000 */ 1986153323Srodrigc "INVALID0x200000", /* 0x200000 */ 1987153323Srodrigc "INVALID00x400000", /* 0x400000 */ 1988153323Srodrigc "INVALID0x800000", /* 0x800000 */ 1989153323Srodrigc "INVALID0x1000000", /* 0x1000000 */ 1990153323Srodrigc "INVALID0x2000000", /* 0x2000000 */ 1991153323Srodrigc "VSHARE", /* 0x4000000 */ 1992153323Srodrigc "INVALID0x8000000", /* 0x8000000 */ 1993153323Srodrigc "VENF_LOCKING", /* 0x10000000 */ 1994153323Srodrigc "VOPLOCK", /* 0x20000000 */ 1995153323Srodrigc "VPURGE", /* 0x40000000 */ 1996153323Srodrigc "INVALID0x80000000", /* 0x80000000 */ 1997159451Srodrigc NULL 1998153323Srodrigc}; 1999153323Srodrigc 2000153323Srodrigcstatic void 2001153323Srodrigcprintflags(register uint64_t flags, 2002153323Srodrigc register char **strings, 2003153323Srodrigc register char *name) 2004153323Srodrigc{ 2005153323Srodrigc register uint64_t mask = 1; 2006153323Srodrigc 2007153323Srodrigc if (name) 2008153323Srodrigc kdb_printf("%s 0x%llx <", name, (unsigned long long)flags); 2009153323Srodrigc 2010153323Srodrigc while (flags != 0 && *strings) { 2011153323Srodrigc if (mask & flags) { 2012153323Srodrigc kdb_printf("%s ", *strings); 2013153323Srodrigc flags &= ~mask; 2014153323Srodrigc } 2015153323Srodrigc mask <<= 1; 2016153323Srodrigc strings++; 2017153323Srodrigc } 2018153323Srodrigc 2019153323Srodrigc if (name) 2020153323Srodrigc kdb_printf("> "); 2021153323Srodrigc 2022153323Srodrigc return; 2023153323Srodrigc} 2024153323Srodrigc 2025153323Srodrigc 2026153323Srodrigcstatic void printbhv(bhv_desc_t *bdp) 2027153323Srodrigc{ 2028159451Srodrigc int maxbhv = 20; /* if you get 20 bhvs you're in trouble already */ 2029153323Srodrigc kdb_symtab_t symtab; 2030153323Srodrigc 2031153323Srodrigc if (bdp == NULL) { 2032153323Srodrigc kdb_printf("NULL bhv\n"); 2033153323Srodrigc return; 2034153323Srodrigc } 2035153323Srodrigc 2036153323Srodrigc kdb_printf("bhv at 0x%p\n", bdp); 2037159451Srodrigc while (bdp && maxbhv--) { 2038153323Srodrigc if (kdbnearsym((unsigned long)bdp->bd_ops, &symtab)) 2039153323Srodrigc kdb_printf(" ops %s", symtab.sym_name); 2040153323Srodrigc else 2041153323Srodrigc kdb_printf(" ops %s/0x%p", "???", (void *)bdp->bd_ops); 2042153323Srodrigc 2043153323Srodrigc kdb_printf(" vobj 0x%p pdata 0x%p next 0x%p\n", 2044153323Srodrigc bdp->bd_vobj, bdp->bd_pdata, bdp->bd_next); 2045153323Srodrigc 2046153323Srodrigc bdp = bdp->bd_next; 2047153323Srodrigc } 2048153323Srodrigc} 2049153323Srodrigc 2050153323Srodrigc 2051153323Srodrigcstatic void printvnode(xfs_vnode_t *vp, unsigned long addr) 2052153323Srodrigc{ 2053159451Srodrigc kdb_printf("vnode: 0x%lx\n", addr); 2054153323Srodrigc kdb_printf(" v_bh 0x%p\n", &vp->v_bh); 2055153323Srodrigc 2056153323Srodrigc printbhv(vp->v_fbhv); 2057153323Srodrigc 2058153323Srodrigc printflags((__psunsigned_t)vp->v_flag, tab_vflags, "flag ="); 2059153323Srodrigc kdb_printf("\n"); 2060153323Srodrigc 2061153323Srodrigc#ifdef XFS_VNODE_TRACE 2062153323Srodrigc kdb_printf(" v_trace 0x%p\n", vp->v_trace); 2063153323Srodrigc#endif /* XFS_VNODE_TRACE */ 2064153323Srodrigc 2065153323Srodrigc kdb_printf(" v_vfsp 0x%p v_number 0x%llx\n", 2066153323Srodrigc vp->v_vfsp, (unsigned long long)vp->v_number); 2067153323Srodrigc} 2068153323Srodrigc 2069153323Srodrigcstatic int kdbm_vnode( 2070153323Srodrigc int argc, 2071153323Srodrigc const char **argv, 2072153323Srodrigc const char **envp, 2073153323Srodrigc struct pt_regs *regs) 2074153323Srodrigc{ 2075153323Srodrigc unsigned long addr; 2076153323Srodrigc int nextarg = 1; 2077153323Srodrigc long offset = 0; 2078153323Srodrigc int diag; 2079153323Srodrigc xfs_vnode_t vp; 2080153323Srodrigc 2081153323Srodrigc if (argc != 1) 2082153323Srodrigc return KDB_ARGCOUNT; 2083153323Srodrigc 2084153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2085153323Srodrigc 2086153323Srodrigc if (diag) 2087153323Srodrigc return diag; 2088153323Srodrigc 2089153323Srodrigc if ((diag = kdb_getarea(vp, addr))) 2090153323Srodrigc return diag; 2091153323Srodrigc 2092153323Srodrigc printvnode(&vp, addr); 2093153323Srodrigc 2094153323Srodrigc return 0; 2095153323Srodrigc} 2096153323Srodrigc 2097153323Srodrigcstatic void 2098153323Srodrigcprint_vfs(xfs_vfs_t *vfs, unsigned long addr) 2099153323Srodrigc{ 2100153323Srodrigc kdb_printf("vfsp at 0x%lx", addr); 2101153323Srodrigc kdb_printf(" vfs_flag 0x%x\n", vfs->vfs_flag); 2102153323Srodrigc kdb_printf(" vfs_mp 0x%p", vfs->vfs_mp); 2103153323Srodrigc kdb_printf(" vfs_bh 0x%p\n", &vfs->vfs_bh); 2104153323Srodrigc 2105153323Srodrigc printbhv(vfs->vfs_fbhv); 2106153323Srodrigc} 2107153323Srodrigc 2108153323Srodrigcstatic int kdbm_bhv( 2109153323Srodrigc int argc, 2110153323Srodrigc const char **argv, 2111153323Srodrigc const char **envp, 2112153323Srodrigc struct pt_regs *regs) 2113153323Srodrigc{ 2114153323Srodrigc unsigned long addr; 2115153323Srodrigc int nextarg = 1; 2116153323Srodrigc long offset = 0; 2117153323Srodrigc int diag; 2118153323Srodrigc bhv_desc_t *bh; 2119153323Srodrigc 2120153323Srodrigc if (argc != 1) 2121153323Srodrigc return KDB_ARGCOUNT; 2122153323Srodrigc 2123153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2124153323Srodrigc 2125153323Srodrigc if (diag) 2126153323Srodrigc return diag; 2127153323Srodrigc 2128153323Srodrigc bh = (bhv_desc_t *)addr; 2129153323Srodrigc 2130153323Srodrigc printbhv(bh); 2131153323Srodrigc 2132153323Srodrigc return 0; 2133153323Srodrigc} 2134153323Srodrigc 2135153323Srodrigcstatic int kdbm_vfs( 2136153323Srodrigc int argc, 2137153323Srodrigc const char **argv, 2138153323Srodrigc const char **envp, 2139153323Srodrigc struct pt_regs *regs) 2140153323Srodrigc{ 2141153323Srodrigc unsigned long addr; 2142153323Srodrigc int nextarg = 1; 2143153323Srodrigc long offset = 0; 2144153323Srodrigc int diag; 2145153323Srodrigc xfs_vfs_t vfs; 2146153323Srodrigc 2147153323Srodrigc if (argc != 1) 2148153323Srodrigc return KDB_ARGCOUNT; 2149153323Srodrigc 2150153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2151153323Srodrigc 2152153323Srodrigc if (diag) 2153153323Srodrigc return diag; 2154153323Srodrigc 2155153323Srodrigc if ((diag = kdb_getarea(vfs, addr))) 2156153323Srodrigc return diag; 2157153323Srodrigc 2158153323Srodrigc print_vfs(&vfs, addr); 2159153323Srodrigc 2160153323Srodrigc return 0; 2161153323Srodrigc} 2162153323Srodrigc 2163153323Srodrigc 2164153323Srodrigc#ifdef XFS_VNODE_TRACE 2165153323Srodrigc/* 2166153323Srodrigc * Print a vnode trace entry. 2167153323Srodrigc */ 2168153323Srodrigcstatic int 2169153323Srodrigcvn_trace_pr_entry(ktrace_entry_t *ktep) 2170153323Srodrigc{ 2171153323Srodrigc char funcname[128]; 2172153323Srodrigc kdb_symtab_t symtab; 2173153323Srodrigc 2174153323Srodrigc 2175153323Srodrigc if ((__psint_t)ktep->val[0] == 0) 2176153323Srodrigc return 0; 2177153323Srodrigc 2178153323Srodrigc if (kdbnearsym((unsigned int)ktep->val[8], &symtab)) { 2179153323Srodrigc unsigned long offval; 2180153323Srodrigc 2181153323Srodrigc offval = (unsigned int)ktep->val[8] - symtab.sym_start; 2182153323Srodrigc 2183153323Srodrigc if (offval) 2184153323Srodrigc sprintf(funcname, "%s+0x%lx", symtab.sym_name, offval); 2185153323Srodrigc else 2186153323Srodrigc sprintf(funcname, "%s", symtab.sym_name); 2187153323Srodrigc } else 2188153323Srodrigc funcname[0] = '\0'; 2189153323Srodrigc 2190153323Srodrigc 2191153323Srodrigc switch ((__psint_t)ktep->val[0]) { 2192153323Srodrigc case VNODE_KTRACE_ENTRY: 2193153323Srodrigc kdb_printf("entry to %s i_count = %d", 2194153323Srodrigc (char *)ktep->val[1], 2195153323Srodrigc (__psint_t)ktep->val[3]); 2196153323Srodrigc break; 2197153323Srodrigc 2198153323Srodrigc case VNODE_KTRACE_EXIT: 2199153323Srodrigc kdb_printf("exit from %s i_count = %d", 2200153323Srodrigc (char *)ktep->val[1], 2201153323Srodrigc (__psint_t)ktep->val[3]); 2202153323Srodrigc break; 2203153323Srodrigc 2204153323Srodrigc case VNODE_KTRACE_HOLD: 2205153323Srodrigc if ((__psint_t)ktep->val[3] != 1) 2206153323Srodrigc kdb_printf("hold @%s:%d(%s) i_count %d => %d ", 2207153323Srodrigc (char *)ktep->val[1], 2208153323Srodrigc (__psint_t)ktep->val[2], 2209153323Srodrigc funcname, 2210153323Srodrigc (__psint_t)ktep->val[3] - 1, 2211153323Srodrigc (__psint_t)ktep->val[3]); 2212153323Srodrigc else 2213153323Srodrigc kdb_printf("get @%s:%d(%s) i_count = %d", 2214153323Srodrigc (char *)ktep->val[1], 2215153323Srodrigc (__psint_t)ktep->val[2], 2216153323Srodrigc funcname, 2217153323Srodrigc (__psint_t)ktep->val[3]); 2218153323Srodrigc break; 2219153323Srodrigc 2220153323Srodrigc case VNODE_KTRACE_REF: 2221153323Srodrigc kdb_printf("ref @%s:%d(%s) i_count = %d", 2222153323Srodrigc (char *)ktep->val[1], 2223153323Srodrigc (__psint_t)ktep->val[2], 2224153323Srodrigc funcname, 2225153323Srodrigc (__psint_t)ktep->val[3]); 2226153323Srodrigc break; 2227153323Srodrigc 2228153323Srodrigc case VNODE_KTRACE_RELE: 2229153323Srodrigc if ((__psint_t)ktep->val[3] != 1) 2230153323Srodrigc kdb_printf("rele @%s:%d(%s) i_count %d => %d ", 2231153323Srodrigc (char *)ktep->val[1], 2232153323Srodrigc (__psint_t)ktep->val[2], 2233153323Srodrigc funcname, 2234153323Srodrigc (__psint_t)ktep->val[3], 2235153323Srodrigc (__psint_t)ktep->val[3] - 1); 2236153323Srodrigc else 2237153323Srodrigc kdb_printf("free @%s:%d(%s) i_count = %d", 2238153323Srodrigc (char *)ktep->val[1], 2239153323Srodrigc (__psint_t)ktep->val[2], 2240153323Srodrigc funcname, 2241153323Srodrigc (__psint_t)ktep->val[3]); 2242153323Srodrigc break; 2243153323Srodrigc 2244153323Srodrigc default: 2245153323Srodrigc kdb_printf("unknown vntrace record\n"); 2246153323Srodrigc return 1; 2247153323Srodrigc } 2248153323Srodrigc 2249153323Srodrigc kdb_printf("\n"); 2250153323Srodrigc 2251153323Srodrigc kdb_printf(" cpu = %d pid = %d ", 2252153323Srodrigc (__psint_t)ktep->val[6], (pid_t)ktep->val[7]); 2253153323Srodrigc 2254153323Srodrigc printflags((__psunsigned_t)ktep->val[5], tab_vflags, "flag ="); 2255153323Srodrigc 2256153323Srodrigc if (kdbnearsym((unsigned int)ktep->val[4], &symtab)) { 2257153323Srodrigc unsigned long offval; 2258153323Srodrigc 2259153323Srodrigc offval = (unsigned int)ktep->val[4] - symtab.sym_start; 2260153323Srodrigc 2261153323Srodrigc if (offval) 2262153323Srodrigc kdb_printf(" ra = %s+0x%lx", symtab.sym_name, offval); 2263153323Srodrigc else 2264153323Srodrigc kdb_printf(" ra = %s", symtab.sym_name); 2265153323Srodrigc } else 2266153323Srodrigc kdb_printf(" ra = ?? 0x%p", (void *)ktep->val[4]); 2267153323Srodrigc 2268153323Srodrigc return 1; 2269153323Srodrigc} 2270153323Srodrigc 2271153323Srodrigc 2272153323Srodrigc/* 2273153323Srodrigc * Print out the trace buffer attached to the given vnode. 2274153323Srodrigc */ 2275153323Srodrigcstatic int kdbm_vntrace( 2276153323Srodrigc int argc, 2277153323Srodrigc const char **argv, 2278153323Srodrigc const char **envp, 2279153323Srodrigc struct pt_regs *regs) 2280153323Srodrigc{ 2281153323Srodrigc int diag; 2282153323Srodrigc int nextarg = 1; 2283153323Srodrigc long offset = 0; 2284153323Srodrigc unsigned long addr; 2285153323Srodrigc xfs_vnode_t *vp; 2286153323Srodrigc ktrace_entry_t *ktep; 2287153323Srodrigc ktrace_snap_t kts; 2288153323Srodrigc 2289153323Srodrigc 2290153323Srodrigc if (argc != 1) 2291153323Srodrigc return KDB_ARGCOUNT; 2292153323Srodrigc 2293153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2294153323Srodrigc 2295153323Srodrigc if (diag) 2296153323Srodrigc return diag; 2297153323Srodrigc 2298153323Srodrigc vp = (xfs_vnode_t *)addr; 2299153323Srodrigc 2300153323Srodrigc if (vp->v_trace == NULL) { 2301153323Srodrigc kdb_printf("The vnode trace buffer is not initialized\n"); 2302153323Srodrigc 2303153323Srodrigc return 0; 2304153323Srodrigc } 2305153323Srodrigc 2306153323Srodrigc kdb_printf("vntrace vp 0x%p\n", vp); 2307153323Srodrigc 2308153323Srodrigc ktep = ktrace_first(vp->v_trace, &kts); 2309153323Srodrigc 2310153323Srodrigc while (ktep != NULL) { 2311153323Srodrigc if (vn_trace_pr_entry(ktep)) 2312153323Srodrigc kdb_printf("\n"); 2313153323Srodrigc 2314153323Srodrigc ktep = ktrace_next(vp->v_trace, &kts); 2315153323Srodrigc } 2316153323Srodrigc 2317153323Srodrigc return 0; 2318153323Srodrigc} 2319153323Srodrigc/* 2320153323Srodrigc * Print out the trace buffer attached to the given vnode. 2321153323Srodrigc */ 2322153323Srodrigcstatic int kdbm_vntraceaddr( 2323153323Srodrigc int argc, 2324153323Srodrigc const char **argv, 2325153323Srodrigc const char **envp, 2326153323Srodrigc struct pt_regs *regs) 2327153323Srodrigc{ 2328153323Srodrigc int diag; 2329153323Srodrigc int nextarg = 1; 2330153323Srodrigc long offset = 0; 2331153323Srodrigc unsigned long addr; 2332153323Srodrigc struct ktrace *kt; 2333153323Srodrigc ktrace_entry_t *ktep; 2334153323Srodrigc ktrace_snap_t kts; 2335153323Srodrigc 2336153323Srodrigc 2337153323Srodrigc if (argc != 1) 2338153323Srodrigc return KDB_ARGCOUNT; 2339153323Srodrigc 2340153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2341153323Srodrigc 2342153323Srodrigc if (diag) 2343153323Srodrigc return diag; 2344153323Srodrigc 2345153323Srodrigc kt = (struct ktrace *)addr; 2346153323Srodrigc 2347153323Srodrigc kdb_printf("vntraceaddr kt 0x%p\n", kt); 2348153323Srodrigc 2349153323Srodrigc ktep = ktrace_first(kt, &kts); 2350153323Srodrigc 2351153323Srodrigc while (ktep != NULL) { 2352153323Srodrigc if (vn_trace_pr_entry(ktep)) 2353153323Srodrigc kdb_printf("\n"); 2354153323Srodrigc 2355153323Srodrigc ktep = ktrace_next(kt, &kts); 2356153323Srodrigc } 2357153323Srodrigc 2358153323Srodrigc return 0; 2359153323Srodrigc} 2360153323Srodrigc#endif /* XFS_VNODE_TRACE */ 2361153323Srodrigc 2362153323Srodrigc#ifdef __linux__ 2363153323Srodrigcstatic void printinode(struct inode *ip) 2364153323Srodrigc{ 2365153323Srodrigc unsigned long addr; 2366153323Srodrigc 2367153323Srodrigc 2368153323Srodrigc if (ip == NULL) 2369153323Srodrigc return; 2370153323Srodrigc 2371153323Srodrigc kdb_printf(" i_ino = %lu i_count = %u i_size %Ld\n", 2372153323Srodrigc ip->i_ino, atomic_read(&ip->i_count), 2373153323Srodrigc ip->i_size); 2374153323Srodrigc#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) 2375153323Srodrigc kdb_printf( 2376153323Srodrigc " i_mode = 0x%x i_nlink = %d i_rdev = 0x%x i_state = 0x%lx\n", 2377153323Srodrigc ip->i_mode, ip->i_nlink, 2378153323Srodrigc kdev_t_to_nr(ip->i_rdev), ip->i_state); 2379153323Srodrigc kdb_printf(" i_hash.nxt = 0x%p i_hash.pprv = 0x%p\n", 2380153323Srodrigc ip->i_hash.next, ip->i_hash.prev); 2381153323Srodrigc#else 2382153323Srodrigc kdb_printf( 2383153323Srodrigc " i_mode = 0x%x i_nlink = %d i_rdev = 0x%x i_state = 0x%lx\n", 2384153323Srodrigc ip->i_mode, ip->i_nlink, 2385153323Srodrigc ip->i_rdev, ip->i_state); 2386153323Srodrigc kdb_printf(" i_hash.nxt = 0x%p i_hash.pprv = 0x%p\n", 2387153323Srodrigc ip->i_hash.next, ip->i_hash.pprev); 2388153323Srodrigc#endif 2389153323Srodrigc kdb_printf(" i_list.nxt = 0x%p i_list.prv = 0x%p\n", 2390153323Srodrigc ip->i_list.next, ip->i_list.prev); 2391153323Srodrigc kdb_printf(" i_dentry.nxt = 0x%p i_dentry.prv = 0x%p\n", 2392153323Srodrigc ip->i_dentry.next, 2393153323Srodrigc ip->i_dentry.prev); 2394153323Srodrigc 2395153323Srodrigc addr = (unsigned long)ip; 2396153323Srodrigc 2397153323Srodrigc kdb_printf(" i_sb = 0x%p i_op = 0x%p i_data = 0x%lx nrpages = %lu\n", 2398153323Srodrigc ip->i_sb, ip->i_op, 2399153323Srodrigc addr + offsetof(struct inode, i_data), 2400153323Srodrigc ip->i_data.nrpages); 2401153323Srodrigc 2402159451Srodrigc kdb_printf(" vnode ptr 0x%p\n", vn_from_inode(ip)); 2403153323Srodrigc} 2404153323Srodrigc 2405153323Srodrigc#endif 2406153323Srodrigc 2407153323Srodrigc 2408153323Srodrigcstatic int kdbm_vn( 2409153323Srodrigc int argc, 2410153323Srodrigc const char **argv, 2411153323Srodrigc const char **envp, 2412153323Srodrigc struct pt_regs *regs) 2413153323Srodrigc{ 2414153323Srodrigc int diag; 2415153323Srodrigc int nextarg = 1; 2416153323Srodrigc long offset = 0; 2417153323Srodrigc unsigned long addr; 2418153323Srodrigc#ifdef __linux__ 2419153323Srodrigc struct inode *ip; 2420153323Srodrigc#endif 2421153323Srodrigc xfs_vnode_t vp; 2422153323Srodrigc#ifdef XFS_VNODE_TRACE 2423153323Srodrigc ktrace_entry_t *ktep; 2424153323Srodrigc ktrace_snap_t kts; 2425153323Srodrigc#endif 2426153323Srodrigc 2427153323Srodrigc if (argc != 1) 2428153323Srodrigc return KDB_ARGCOUNT; 2429153323Srodrigc 2430153323Srodrigc diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs); 2431153323Srodrigc if (diag) 2432153323Srodrigc return diag; 2433153323Srodrigc 2434153323Srodrigc if ((diag = kdb_getarea(vp, addr))) 2435153323Srodrigc return diag; 2436153323Srodrigc 2437153323Srodrigc#ifdef __linux__ 2438159451Srodrigc ip = vn_to_inode((vnode_t *)addr); 2439153323Srodrigc kdb_printf("--> Inode @ 0x%p\n", ip); 2440153323Srodrigc printinode(ip); 2441153323Srodrigc#endif 2442153323Srodrigc 2443153323Srodrigc kdb_printf("--> Vnode @ 0x%lx\n", addr); 2444153323Srodrigc printvnode(&vp, addr); 2445153323Srodrigc 2446153323Srodrigc#ifdef XFS_VNODE_TRACE 2447153323Srodrigc kdb_printf("--> Vntrace @ 0x%lx/0x%p\n", addr, vp.v_trace); 2448153323Srodrigc if (vp.v_trace == NULL) 2449153323Srodrigc return 0; 2450153323Srodrigc ktep = ktrace_first(vp.v_trace, &kts); 2451153323Srodrigc while (ktep != NULL) { 2452153323Srodrigc if (vn_trace_pr_entry(ktep)) 2453153323Srodrigc kdb_printf("\n"); 2454153323Srodrigc 2455153323Srodrigc ktep = ktrace_next(vp.v_trace, &kts); 2456153323Srodrigc } 2457153323Srodrigc#endif /* XFS_VNODE_TRACE */ 2458153323Srodrigc return 0; 2459153323Srodrigc} 2460153323Srodrigc 2461153323Srodrigc 2462153323Srodrigc#ifdef __linux__ 2463153323Srodrigc 2464159451Srodrigcstatic char *bp_flag_vals[] = { 2465153323Srodrigc/* 0 */ "READ", "WRITE", "MAPPED", "PARTIAL", "ASYNC", 2466159451Srodrigc/* 5 */ "NONE", "DELWRI", "STALE", "FS_MANAGED", "FS_DATAIOD", 2467159451Srodrigc/* 10 */ "FORCEIO", "FLUSH", "READ_AHEAD", "DIRECTIO", "LOCK", 2468159451Srodrigc/* 15 */ "TRYLOCK", "DONT_BLOCK", "PAGE_CACHE", "KMEM_ALLOC", "RUN_QUEUES", 2469159451Srodrigc/* 20 */ "PRIVATE_BH", "DELWRI_Q", 2470153323Srodrigc NULL }; 2471153323Srodrigc 2472153323Srodrigc#endif 2473153323Srodrigc 2474153323Srodrigcstatic char *iomap_flag_vals[] = { 2475153323Srodrigc "EOF", "HOLE", "DELAY", "INVALID0x08", 2476153323Srodrigc "INVALID0x10", "UNWRITTEN", "NEW", "INVALID0x80", 2477153323Srodrigc NULL }; 2478153323Srodrigc 2479153323Srodrigc 2480153323Srodrigcstatic char *map_flags(unsigned long flags, char *mapping[]) 2481153323Srodrigc{ 2482153323Srodrigc static char buffer[256]; 2483153323Srodrigc int index; 2484153323Srodrigc int offset = 12; 2485153323Srodrigc 2486153323Srodrigc buffer[0] = '\0'; 2487153323Srodrigc 2488153323Srodrigc for (index = 0; flags && mapping[index]; flags >>= 1, index++) { 2489153323Srodrigc if (flags & 1) { 2490153323Srodrigc if ((offset + strlen(mapping[index]) + 1) >= 80) { 2491153323Srodrigc strcat(buffer, "\n "); 2492153323Srodrigc offset = 12; 2493153323Srodrigc } else if (offset > 12) { 2494153323Srodrigc strcat(buffer, " "); 2495153323Srodrigc offset++; 2496153323Srodrigc } 2497153323Srodrigc strcat(buffer, mapping[index]); 2498153323Srodrigc offset += strlen(mapping[index]); 2499153323Srodrigc } 2500153323Srodrigc } 2501153323Srodrigc 2502153323Srodrigc return (buffer); 2503153323Srodrigc} 2504153323Srodrigc 2505153323Srodrigc#ifdef __linux__ 2506153323Srodrigc 2507159451Srodrigcstatic char *bp_flags(xfs_buf_flags_t bp_flag) 2508153323Srodrigc{ 2509159451Srodrigc return(map_flags((unsigned long) bp_flag, bp_flag_vals)); 2510153323Srodrigc} 2511153323Srodrigc 2512153323Srodrigcstatic int 2513159451Srodrigckdbm_bp_flags(int argc, const char **argv, const char **envp, struct pt_regs *regs) 2514153323Srodrigc{ 2515153323Srodrigc unsigned long flags; 2516153323Srodrigc int diag; 2517153323Srodrigc 2518153323Srodrigc if (argc != 1) 2519153323Srodrigc return KDB_ARGCOUNT; 2520153323Srodrigc 2521153323Srodrigc diag = kdbgetularg(argv[1], &flags); 2522153323Srodrigc if (diag) 2523153323Srodrigc return diag; 2524153323Srodrigc 2525159451Srodrigc kdb_printf("bp flags 0x%lx = %s\n", flags, bp_flags(flags)); 2526153323Srodrigc 2527153323Srodrigc return 0; 2528153323Srodrigc} 2529153323Srodrigc 2530153323Srodrigcstatic void 2531159451Srodrigcprint_xfs_buf( 2532159451Srodrigc xfs_buf_t *bp, 2533159451Srodrigc unsigned long addr) 2534153323Srodrigc{ 2535159451Srodrigc unsigned long age = (xfs_buf_age_centisecs * HZ) / 100; 2536159451Srodrigc 2537153323Srodrigc kdb_printf("xfs_buf_t at 0x%lx\n", addr); 2538159451Srodrigc kdb_printf(" b_flags %s\n", bp_flags(bp->b_flags)); 2539159451Srodrigc kdb_printf(" b_target 0x%p b_hold %d b_next 0x%p b_prev 0x%p\n", 2540159451Srodrigc bp->b_target, bp->b_hold.counter, 2541159451Srodrigc list_entry(bp->b_list.next, xfs_buf_t, b_list), 2542159451Srodrigc list_entry(bp->b_list.prev, xfs_buf_t, b_list)); 2543159451Srodrigc kdb_printf(" b_hash 0x%p b_hash_next 0x%p b_hash_prev 0x%p\n", 2544159451Srodrigc bp->b_hash, 2545159451Srodrigc list_entry(bp->b_hash_list.next, xfs_buf_t, b_hash_list), 2546159451Srodrigc list_entry(bp->b_hash_list.prev, xfs_buf_t, b_hash_list)); 2547159451Srodrigc kdb_printf(" b_file_offset 0x%llx b_buffer_length 0x%llx b_addr 0x%p\n", 2548159451Srodrigc (unsigned long long) bp->b_file_offset, 2549159451Srodrigc (unsigned long long) bp->b_buffer_length, 2550159451Srodrigc bp->b_addr); 2551159451Srodrigc kdb_printf(" b_bn 0x%llx b_count_desired 0x%lx b_locked %d\n", 2552159451Srodrigc (unsigned long long)bp->b_bn, 2553159451Srodrigc (unsigned long) bp->b_count_desired, (int)bp->b_locked); 2554159451Srodrigc kdb_printf(" b_queuetime %ld (now=%ld/age=%ld) b_io_remaining %d\n", 2555159451Srodrigc bp->b_queuetime, jiffies, bp->b_queuetime + age, 2556159451Srodrigc bp->b_io_remaining.counter); 2557159451Srodrigc kdb_printf(" b_page_count %u b_offset 0x%x b_pages 0x%p b_error %u\n", 2558159451Srodrigc bp->b_page_count, bp->b_offset, 2559159451Srodrigc bp->b_pages, bp->b_error); 2560159451Srodrigc kdb_printf(" b_iodonesema (%d,%d) b_sema (%d,%d) b_pincount (%d)\n", 2561159451Srodrigc bp->b_iodonesema.count.counter, 2562159451Srodrigc bp->b_iodonesema.sleepers, 2563159451Srodrigc bp->b_sema.count.counter, bp->b_sema.sleepers, 2564159451Srodrigc bp->b_pin_count.counter); 2565159451Srodrigc#ifdef XFS_BUF_LOCK_TRACKING 2566159451Srodrigc kdb_printf(" last holder %d\n", bp->b_last_holder); 2567153323Srodrigc#endif 2568159451Srodrigc if (bp->b_fspriv || bp->b_fspriv2) { 2569159451Srodrigc kdb_printf( " b_fspriv 0x%p b_fspriv2 0x%p\n", 2570159451Srodrigc bp->b_fspriv, bp->b_fspriv2); 2571153323Srodrigc } 2572153323Srodrigc} 2573153323Srodrigc 2574153323Srodrigcstatic int 2575159451Srodrigckdbm_bp(int argc, const char **argv, const char **envp, struct pt_regs *regs) 2576153323Srodrigc{ 2577153323Srodrigc xfs_buf_t bp; 2578153323Srodrigc unsigned long addr; 2579153323Srodrigc long offset=0; 2580153323Srodrigc int nextarg; 2581153323Srodrigc int diag; 2582153323Srodrigc 2583153323Srodrigc if (argc != 1) 2584153323Srodrigc return KDB_ARGCOUNT; 2585153323Srodrigc 2586153323Srodrigc nextarg = 1; 2587153323Srodrigc if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs)) || 2588153323Srodrigc (diag = kdb_getarea(bp, addr))) 2589153323Srodrigc return diag; 2590153323Srodrigc 2591159451Srodrigc print_xfs_buf(&bp, addr); 2592153323Srodrigc 2593153323Srodrigc return 0; 2594153323Srodrigc} 2595153323Srodrigc 2596153323Srodrigcstatic int 2597159451Srodrigckdbm_bpdelay(int argc, const char **argv, const char **envp, 2598153323Srodrigc struct pt_regs *regs) 2599153323Srodrigc{ 2600153323Srodrigc#ifdef DEBUG 2601159451Srodrigc extern struct list_head xfs_buftarg_list; 2602153323Srodrigc struct list_head *curr, *next; 2603159451Srodrigc xfs_buftarg_t *tp, *n; 2604159451Srodrigc xfs_buf_t bp; 2605159451Srodrigc unsigned long addr, verbose = 0; 2606159451Srodrigc int diag, count = 0; 2607153323Srodrigc 2608153323Srodrigc if (argc > 1) 2609153323Srodrigc return KDB_ARGCOUNT; 2610153323Srodrigc 2611153323Srodrigc if (argc == 1) { 2612153323Srodrigc if ((diag = kdbgetularg(argv[1], &verbose))) { 2613153323Srodrigc return diag; 2614153323Srodrigc } 2615153323Srodrigc } 2616153323Srodrigc 2617153323Srodrigc if (!verbose) { 2618159451Srodrigc kdb_printf("index bp pin queuetime\n"); 2619153323Srodrigc } 2620153323Srodrigc 2621153323Srodrigc 2622159451Srodrigc list_for_each_entry_safe(tp, n, &xfs_buftarg_list, bt_list) { 2623159451Srodrigc list_for_each_safe(curr, next, &tp->bt_delwrite_queue) { 2624159451Srodrigc addr = (unsigned long)list_entry(curr, xfs_buf_t, b_list); 2625159451Srodrigc if ((diag = kdb_getarea(bp, addr))) 2626159451Srodrigc return diag; 2627159451Srodrigc 2628159451Srodrigc if (verbose) { 2629159451Srodrigc print_xfs_buf(&bp, addr); 2630159451Srodrigc } else { 2631159451Srodrigc kdb_printf("%4d 0x%lx %d %ld\n", 2632159451Srodrigc count++, addr, 2633159451Srodrigc bp.b_pin_count.counter, 2634159451Srodrigc bp.b_queuetime); 2635159451Srodrigc } 2636153323Srodrigc } 2637153323Srodrigc } 2638153323Srodrigc#else 2639159451Srodrigc kdb_printf("bt_delwrite_queue inaccessible (non-debug)\n"); 2640153323Srodrigc#endif 2641153323Srodrigc return 0; 2642153323Srodrigc} 2643153323Srodrigc#endif 2644153323Srodrigc 2645153323Srodrigcstatic int 2646153323Srodrigckdbm_iomap(int argc, const char **argv, const char **envp, 2647153323Srodrigc struct pt_regs *regs) 2648153323Srodrigc{ 2649153323Srodrigc xfs_iomap_t iomap; 2650153323Srodrigc unsigned long addr; 2651153323Srodrigc long offset=0; 2652153323Srodrigc int nextarg; 2653153323Srodrigc int diag; 2654153323Srodrigc 2655153323Srodrigc if (argc != 1) 2656153323Srodrigc return KDB_ARGCOUNT; 2657153323Srodrigc 2658153323Srodrigc nextarg = 1; 2659159451Srodrigc if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs))) 2660159451Srodrigc return diag; 2661159451Srodrigc if ((diag = kdb_getarea(iomap, addr))) 2662159451Srodrigc return diag; 2663153323Srodrigc 2664153323Srodrigc kdb_printf("iomap_t at 0x%lx\n", addr); 2665159451Srodrigc kdb_printf(" bn 0x%llx offset 0x%Lx delta 0x%lx bsize 0x%llx\n", 2666153323Srodrigc (long long) iomap.iomap_bn, iomap.iomap_offset, 2667153323Srodrigc (unsigned long)iomap.iomap_delta, (long long)iomap.iomap_bsize); 2668159451Srodrigc kdb_printf(" iomap_flags %s\n", 2669159451Srodrigc map_flags(iomap.iomap_flags, iomap_flag_vals)); 2670153323Srodrigc 2671159451Srodrigc return 0; 2672159451Srodrigc} 2673153323Srodrigc 2674159451Srodrigcstatic int 2675159451Srodrigckdbm_i2vnode(int argc, const char **argv, const char **envp, 2676159451Srodrigc struct pt_regs *regs) 2677159451Srodrigc{ 2678159451Srodrigc struct vnode vp; 2679159451Srodrigc struct inode *ip; 2680159451Srodrigc unsigned long addr; 2681159451Srodrigc long offset=0; 2682159451Srodrigc int nextarg; 2683159451Srodrigc int diag; 2684159451Srodrigc 2685159451Srodrigc if (argc != 1) 2686159451Srodrigc return KDB_ARGCOUNT; 2687159451Srodrigc 2688159451Srodrigc nextarg = 1; 2689159451Srodrigc if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL, regs))) 2690159451Srodrigc return diag; 2691159451Srodrigc ip = (struct inode *)addr; 2692159451Srodrigc if ((diag = kdb_getarea(vp, (unsigned long)vn_from_inode(ip)))) 2693159451Srodrigc return diag; 2694159451Srodrigc 2695159451Srodrigc kdb_printf("--> Inode @ 0x%p\n", ip); 2696159451Srodrigc printinode(ip); 2697159451Srodrigc 2698159451Srodrigc kdb_printf("--> Vnode @ 0x%p\n", vn_from_inode(ip)); 2699159451Srodrigc printvnode(&vp, (unsigned long)vn_from_inode(ip)); 2700159451Srodrigc 2701153323Srodrigc return 0; 2702153323Srodrigc} 2703153323Srodrigc 2704159451Srodrigc#ifdef XFS_BUF_TRACE 2705159451Srodrigcstatic int xfs_buf_trace_entry(ktrace_entry_t *ktep) 2706153323Srodrigc{ 2707153323Srodrigc unsigned long long daddr; 2708153323Srodrigc 2709153323Srodrigc daddr = ((unsigned long long)(unsigned long)ktep->val[8] << 32) 2710153323Srodrigc | ((unsigned long long)(unsigned long)ktep->val[9]); 2711153323Srodrigc 2712159451Srodrigc kdb_printf("bp 0x%p [%s] (hold %lu lock %ld) data 0x%p", 2713153323Srodrigc ktep->val[0], 2714153323Srodrigc (char *)ktep->val[1], 2715153323Srodrigc (unsigned long)ktep->val[3], 2716153323Srodrigc (long)ktep->val[4], 2717153323Srodrigc ktep->val[6]); 2718153323Srodrigc kdb_symbol_print((unsigned long)ktep->val[7], NULL, 2719153323Srodrigc KDB_SP_SPACEB|KDB_SP_PAREN|KDB_SP_NEWLINE); 2720153323Srodrigc kdb_printf(" offset 0x%llx size 0x%lx task 0x%p\n", 2721153323Srodrigc daddr, (long)ktep->val[10], ktep->val[5]); 2722159451Srodrigc kdb_printf(" flags: %s\n", bp_flags((int)(long)ktep->val[2])); 2723153323Srodrigc return 1; 2724153323Srodrigc} 2725153323Srodrigc 2726153323Srodrigcstatic int 2727159451Srodrigckdbm_bptrace_offset(int argc, const char **argv, const char **envp, 2728153323Srodrigc struct pt_regs *regs) 2729153323Srodrigc{ 2730153323Srodrigc long mask = 0; 2731159451Srodrigc unsigned long got_offset = 0, offset = 0; 2732153323Srodrigc int diag; 2733153323Srodrigc ktrace_entry_t *ktep; 2734153323Srodrigc ktrace_snap_t kts; 2735153323Srodrigc 2736153323Srodrigc if (argc > 2) 2737153323Srodrigc return KDB_ARGCOUNT; 2738153323Srodrigc 2739153323Srodrigc if (argc > 0) { 2740153323Srodrigc diag = kdbgetularg(argv[1], &offset); 2741153323Srodrigc if (diag) 2742153323Srodrigc return diag; 2743159451Srodrigc got_offset = 1; /* allows tracing offset zero */ 2744153323Srodrigc } 2745153323Srodrigc 2746153323Srodrigc if (argc > 1) { 2747153323Srodrigc diag = kdbgetularg(argv[1], &mask); /* sign extent mask */ 2748153323Srodrigc if (diag) 2749153323Srodrigc return diag; 2750153323Srodrigc } 2751153323Srodrigc 2752159451Srodrigc ktep = ktrace_first(xfs_buf_trace_buf, &kts); 2753159451Srodrigc do { 2754153323Srodrigc unsigned long long daddr; 2755153323Srodrigc 2756159451Srodrigc if (ktep == NULL) 2757159451Srodrigc break; 2758153323Srodrigc daddr = ((unsigned long long)(unsigned long)ktep->val[8] << 32) 2759153323Srodrigc | ((unsigned long long)(unsigned long)ktep->val[9]); 2760159451Srodrigc if (got_offset && ((daddr & ~mask) != offset)) 2761153323Srodrigc continue; 2762159451Srodrigc if (xfs_buf_trace_entry(ktep)) 2763153323Srodrigc kdb_printf("\n"); 2764159451Srodrigc } while ((ktep = ktrace_next(xfs_buf_trace_buf, &kts)) != NULL); 2765153323Srodrigc return 0; 2766153323Srodrigc} 2767153323Srodrigc 2768153323Srodrigcstatic int 2769159451Srodrigckdbm_bptrace(int argc, const char **argv, const char **envp, 2770153323Srodrigc struct pt_regs *regs) 2771153323Srodrigc{ 2772153323Srodrigc unsigned long addr = 0; 2773153323Srodrigc int diag, nextarg; 2774153323Srodrigc long offset = 0; 2775153323Srodrigc char *event_match = NULL; 2776153323Srodrigc ktrace_entry_t *ktep; 2777153323Srodrigc ktrace_snap_t kts; 2778153323Srodrigc 2779153323Srodrigc if (argc > 1) 2780153323Srodrigc return KDB_ARGCOUNT; 2781153323Srodrigc 2782153323Srodrigc if (argc == 1) { 2783153323Srodrigc if (isupper(argv[1][0]) || islower(argv[1][0])) { 2784153323Srodrigc event_match = (char *)argv[1]; 2785153323Srodrigc kdb_printf("event match on \"%s\"\n", event_match); 2786153323Srodrigc argc = 0; 2787153323Srodrigc } else { 2788153323Srodrigc nextarg = 1; 2789153323Srodrigc diag = kdbgetaddrarg(argc, argv, 2790153323Srodrigc &nextarg, &addr, &offset, NULL, regs); 2791153323Srodrigc if (diag) { 2792153323Srodrigc kdb_printf("non-numeric arg: %s\n", argv[1]); 2793153323Srodrigc return diag; 2794153323Srodrigc } 2795153323Srodrigc } 2796153323Srodrigc } 2797153323Srodrigc 2798159451Srodrigc ktep = ktrace_first(xfs_buf_trace_buf, &kts); 2799159451Srodrigc do { 2800159451Srodrigc if (ktep == NULL) 2801159451Srodrigc break; 2802153323Srodrigc if (addr && (ktep->val[0] != (void *)addr)) 2803153323Srodrigc continue; 2804153323Srodrigc if (event_match && strcmp((char *)ktep->val[1], event_match)) 2805153323Srodrigc continue; 2806159451Srodrigc if (xfs_buf_trace_entry(ktep)) 2807153323Srodrigc qprintf("\n"); 2808159451Srodrigc } while ((ktep = ktrace_next(xfs_buf_trace_buf, &kts)) != NULL); 2809159451Srodrigc 2810153323Srodrigc return 0; 2811153323Srodrigc} 2812153323Srodrigc#endif 2813153323Srodrigc 2814153323Srodrigcstruct xif { 2815153323Srodrigc char *name; 2816153323Srodrigc int (*func)(int, const char **, const char **, struct pt_regs *); 2817153323Srodrigc char *args; 2818153323Srodrigc char *help; 2819153323Srodrigc}; 2820153323Srodrigc 2821153323Srodrigcstatic struct xif xfsidbg_funcs[] = { 2822153323Srodrigc { "bhv", kdbm_bhv, "<bhv>", "Dump bhv chain"}, 2823153323Srodrigc { "vn", kdbm_vn, "<vnode>", "Dump inode/vnode/trace"}, 2824153323Srodrigc { "vnode", kdbm_vnode, "<vnode>", "Dump vnode"}, 2825153323Srodrigc { "vfs", kdbm_vfs, "<vfs>", "Dump vfs"}, 2826153323Srodrigc#ifdef XFS_VNODE_TRACE 2827153323Srodrigc { "vntrace", kdbm_vntrace, "<vntrace>", "Dump vnode Trace"}, 2828153323Srodrigc { "vntraceaddr", kdbm_vntraceaddr, "<vntrace>", 2829153323Srodrigc "Dump vnode Trace by Address"}, 2830153323Srodrigc#endif 2831153323Srodrigc { "xagf", kdbm_xfs_xagf, "<agf>", 2832153323Srodrigc "Dump XFS allocation group freespace" }, 2833153323Srodrigc { "xagi", kdbm_xfs_xagi, "<agi>", 2834153323Srodrigc "Dump XFS allocation group inode" }, 2835153323Srodrigc { "xail", kdbm_xfs_xaildump, "<xfs_mount_t>", 2836153323Srodrigc "Dump XFS AIL for a mountpoint" }, 2837153323Srodrigc#ifdef XFS_ALLOC_TRACE 2838153323Srodrigc { "xalatrc", kdbm_xfs_xalatrace, "<count>", 2839153323Srodrigc "Dump XFS alloc count trace" }, 2840153323Srodrigc { "xalbtrc", kdbm_xfs_xalbtrace, "<xfs_agblock_t>", 2841153323Srodrigc "Dump XFS alloc block trace" }, 2842153323Srodrigc { "xalgtrc", kdbm_xfs_xalgtrace, "<xfs_agnumber_t>", 2843153323Srodrigc "Dump XFS alloc alloc-group trace" }, 2844153323Srodrigc#endif 2845153323Srodrigc 2846153323Srodrigc { "xalloc", kdbm_xfs_xalloc, "<xfs_alloc_arg_t>", 2847153323Srodrigc "Dump XFS allocation args structure" }, 2848153323Srodrigc#ifdef XFS_ALLOC_TRACE 2849153323Srodrigc { "xalmtrc", kdbm_xfs_xalmtrace, "<xfs_mount_t>", 2850153323Srodrigc "Dump XFS alloc mount-point trace" }, 2851153323Srodrigc { "xalttrc", kdbm_xfs_xalttrace, "<tag>", 2852153323Srodrigc "Dump XFS alloc trace by tag number" }, 2853153323Srodrigc#endif 2854153323Srodrigc { "xarg", kdbm_xfs_xarg, "<value>", 2855153323Srodrigc "Input XFS argument for next function" }, 2856153323Srodrigc { "xattrcx", kdbm_xfs_xattrcontext, "<xfs_attr_list_context_t>", 2857153323Srodrigc "Dump XFS attr_list context struct"}, 2858153323Srodrigc { "xattrlf", kdbm_xfs_xattrleaf, "<xfs_attr_leafblock_t>", 2859153323Srodrigc "Dump XFS attribute leaf block"}, 2860153323Srodrigc { "xattrsf", kdbm_xfs_xattrsf, "<xfs_attr_shortform_t>", 2861153323Srodrigc "Dump XFS attribute shortform"}, 2862153323Srodrigc#ifdef XFS_ATTR_TRACE 2863153323Srodrigc { "xattrtr", kdbm_xfs_xattrtrace, "<count>", 2864153323Srodrigc "Dump XFS attribute attr_list() trace" }, 2865153323Srodrigc#endif 2866153323Srodrigc { "xbirec", kdbm_xfs_xbirec, "<xfs_bmbt_irec_t", 2867153323Srodrigc "Dump XFS bmap incore record"}, 2868153323Srodrigc#ifdef XFS_BLI_TRACE 2869153323Srodrigc { "xblitrc", kdbm_xfs_xblitrace, "<xfs_buf_log_item_t>", 2870153323Srodrigc "Dump XFS buf log item trace" }, 2871153323Srodrigc#endif 2872153323Srodrigc { "xbmalla", kdbm_xfs_xbmalla, "<xfs_bmalloca_t>", 2873153323Srodrigc "Dump XFS bmalloc args structure"}, 2874153323Srodrigc#ifdef XFS_BMAP_TRACE 2875153323Srodrigc { "xbmatrc", kdbm_xfs_xbmatrace, "<count>", 2876153323Srodrigc "Dump XFS bmap btree count trace" }, 2877153323Srodrigc { "xbmitrc", kdbm_xfs_xbmitrace, "<xfs_inode_t>", 2878153323Srodrigc "Dump XFS bmap btree per-inode trace" }, 2879153323Srodrigc { "xbmstrc", kdbm_xfs_xbmstrace, "<xfs_inode_t>", 2880153323Srodrigc "Dump XFS bmap btree inode trace" }, 2881153323Srodrigc#endif 2882153323Srodrigc { "xbrec", kdbm_xfs_xbrec, "<xfs_bmbt_rec_64_t>", 2883153323Srodrigc "Dump XFS bmap record"}, 2884153323Srodrigc { "xbroot", kdbm_xfs_xbroot, "<xfs_inode_t>", 2885153323Srodrigc "Dump XFS bmap btree root (data)"}, 2886153323Srodrigc { "xbroota", kdbm_xfs_xbroota, "<xfs_inode_t>", 2887153323Srodrigc "Dump XFS bmap btree root (attr)"}, 2888153323Srodrigc { "xbtcur", kdbm_xfs_xbtcur, "<xfs_btree_cur_t>", 2889153323Srodrigc "Dump XFS btree cursor"}, 2890153323Srodrigc { "xbuf", kdbm_xfs_xbuf, "<xfs_buf_t>", 2891153323Srodrigc "Dump XFS data from a buffer"}, 2892153323Srodrigc#ifdef XFS_BMAP_TRACE 2893153323Srodrigc { "xbxatrc", kdbm_xfs_xbxatrace, "<count>", 2894153323Srodrigc "Dump XFS bmap extent count trace" }, 2895153323Srodrigc { "xbxitrc", kdbm_xfs_xbxitrace, "<xfs_inode_t>", 2896153323Srodrigc "Dump XFS bmap extent per-inode trace" }, 2897153323Srodrigc { "xbxstrc", kdbm_xfs_xbxstrace, "<xfs_inode_t>", 2898153323Srodrigc "Dump XFS bmap extent inode trace" }, 2899153323Srodrigc#endif 2900153323Srodrigc { "xchash", kdbm_xfs_xchash, "<xfs_mount_t>", 2901153323Srodrigc "Dump XFS cluster hash"}, 2902153323Srodrigc { "xchlist", kdbm_xfs_xchashlist, "<xfs_chashlist_t>", 2903153323Srodrigc "Dump XFS cluster hash list"}, 2904153323Srodrigc { "xchksum", kdbm_xfs_xchksum, "<addr>", "Dump chksum" }, 2905153323Srodrigc#ifdef XFS_DIR2_TRACE 2906153323Srodrigc { "xd2atrc", kdbm_xfs_xdir2atrace, "<count>", 2907153323Srodrigc "Dump XFS directory v2 count trace" }, 2908153323Srodrigc#endif 2909153323Srodrigc { "xd2free", kdbm_xfs_xdir2free, "<xfs_dir2_free_t>", 2910153323Srodrigc "Dump XFS directory v2 freemap"}, 2911153323Srodrigc#ifdef XFS_DIR2_TRACE 2912153323Srodrigc { "xd2itrc", kdbm_xfs_xdir2itrace, "<xfs_inode_t>", 2913153323Srodrigc "Dump XFS directory v2 per-inode trace" }, 2914153323Srodrigc#endif 2915153323Srodrigc { "xdaargs", kdbm_xfs_xdaargs, "<xfs_da_args_t>", 2916153323Srodrigc "Dump XFS dir/attr args structure"}, 2917153323Srodrigc { "xdabuf", kdbm_xfs_xdabuf, "<xfs_dabuf_t>", 2918153323Srodrigc "Dump XFS dir/attr buf structure"}, 2919153323Srodrigc { "xdanode", kdbm_xfs_xdanode, "<xfs_da_intnode_t>", 2920153323Srodrigc "Dump XFS dir/attr node block"}, 2921153323Srodrigc { "xdastat", kdbm_xfs_xdastate, "<xfs_da_state_t>", 2922153323Srodrigc "Dump XFS dir/attr state_blk struct"}, 2923153323Srodrigc { "xdelay", kdbm_xfs_delayed_blocks, "<xfs_mount_t>", 2924153323Srodrigc "Dump delayed block totals"}, 2925153323Srodrigc { "xdirlf", kdbm_xfs_xdirleaf, "<xfs_dir_leafblock_t>", 2926153323Srodrigc "Dump XFS directory leaf block"}, 2927153323Srodrigc { "xdirsf", kdbm_xfs_xdirsf, "<xfs_dir_shortform_t>", 2928153323Srodrigc "Dump XFS directory shortform"}, 2929153323Srodrigc { "xdir2sf", kdbm_xfs_xdir2sf, "<xfs_dir2_sf_t>", 2930153323Srodrigc "Dump XFS directory v2 shortform"}, 2931153323Srodrigc#ifdef XFS_DIR_TRACE 2932153323Srodrigc { "xdirtrc", kdbm_xfs_xdirtrace, "<count>", 2933153323Srodrigc "Dump XFS directory getdents() trace" }, 2934153323Srodrigc#endif 2935153323Srodrigc { "xdiskdq", kdbm_xfs_xqm_diskdq, "<xfs_disk_dquot_t>", 2936153323Srodrigc "Dump XFS ondisk dquot (quota) struct"}, 2937153323Srodrigc { "xdqatt", kdbm_xfs_xqm_dqattached_inos, "<xfs_mount_t>", 2938153323Srodrigc "All incore inodes with dquots"}, 2939153323Srodrigc { "xdqinfo", kdbm_xfs_xqm_tpdqinfo, "<xfs_trans_t>", 2940153323Srodrigc "Dump dqinfo structure of a trans"}, 2941153323Srodrigc#ifdef XFS_DQUOT_TRACE 2942153323Srodrigc { "xdqtrace",kdbm_xfs_xqm_dqtrace, "<xfs_dquot_t>", 2943153323Srodrigc "Dump trace of a given dquot" }, 2944153323Srodrigc#endif 2945153323Srodrigc { "xdquot", kdbm_xfs_xqm_dquot, "<xfs_dquot_t>", 2946153323Srodrigc "Dump XFS dquot (quota) structure"}, 2947153323Srodrigc { "xexlist", kdbm_xfs_xexlist, "<xfs_inode_t>", 2948153323Srodrigc "Dump XFS bmap extents in inode"}, 2949153323Srodrigc { "xflist", kdbm_xfs_xflist, "<xfs_bmap_free_t>", 2950159451Srodrigc "Dump XFS to-be-freed extent records"}, 2951153323Srodrigc { "xhelp", kdbm_xfs_xhelp, "", 2952153323Srodrigc "Print idbg-xfs help"}, 2953153323Srodrigc { "xicall", kdbm_xfs_xiclogall, "<xlog_in_core_t>", 2954153323Srodrigc "Dump All XFS in-core logs"}, 2955153323Srodrigc { "xiclog", kdbm_xfs_xiclog, "<xlog_in_core_t>", 2956153323Srodrigc "Dump XFS in-core log"}, 2957153323Srodrigc#ifdef XFS_LOG_TRACE 2958153323Srodrigc { "xictrc", kdbm_xfs_xiclogtrace, "<xlog_in_core_t>", 2959153323Srodrigc "Dump XFS in-core log trace" }, 2960153323Srodrigc#endif 2961153323Srodrigc { "xihash", kdbm_xfs_xihash, "<xfs_mount_t>", 2962153323Srodrigc "Dump XFS inode hash statistics"}, 2963153323Srodrigc#ifdef XFS_ILOCK_TRACE 2964153323Srodrigc { "xilocktrc",kdbm_xfs_xilock_trace, "<xfs_inode_t>", 2965153323Srodrigc "Dump XFS ilock trace" }, 2966153323Srodrigc { "xailcktrc",kdbm_xfs_xailock_trace,"<count>", 2967153323Srodrigc "Dump XFS global ilock trace" }, 2968153323Srodrigc#endif 2969153323Srodrigc { "xinodes", kdbm_xfs_xinodes, "<xfs_mount_t>", 2970153323Srodrigc "Dump XFS inodes per mount"}, 2971153323Srodrigc { "xquiesce",kdbm_xfs_xinodes_quiesce, "<xfs_mount_t>", 2972153323Srodrigc "Dump non-quiesced XFS inodes per mount"}, 2973153323Srodrigc#ifdef XFS_LOG_TRACE 2974153323Srodrigc { "xl_grtr", kdbm_xfs_xlog_granttrace, "<xlog_t>", 2975153323Srodrigc "Dump XFS log grant trace" }, 2976153323Srodrigc#endif 2977153323Srodrigc { "xl_rcit", kdbm_xfs_xlog_ritem, "<xlog_recover_item_t>", 2978153323Srodrigc "Dump XFS recovery item"}, 2979153323Srodrigc { "xl_rctr", kdbm_xfs_xlog_rtrans, "<xlog_recover_t>", 2980153323Srodrigc "Dump XFS recovery transaction"}, 2981153323Srodrigc { "xl_rctr2",kdbm_xfs_xlog_rtrans_entire, "<xlog_recover_t>", 2982153323Srodrigc "Dump entire recovery transaction"}, 2983153323Srodrigc { "xl_tic", kdbm_xfs_xlog_tic, "<xlog_ticket_t>", 2984153323Srodrigc "Dump XFS log ticket"}, 2985153323Srodrigc { "xlog", kdbm_xfs_xlog, "<xlog_t>", 2986153323Srodrigc "Dump XFS log"}, 2987153323Srodrigc { "xlogcb", kdbm_xfs_xiclogcb, "<xlog_in_core_t>", 2988153323Srodrigc "Dump XFS in-core log callbacks"}, 2989153323Srodrigc { "xlogitm", kdbm_xfs_xlogitem, "<xfs_log_item_t>", 2990153323Srodrigc "Dump XFS log item structure"}, 2991153323Srodrigc { "xmount", kdbm_xfs_xmount, "<xfs_mount_t>", 2992153323Srodrigc "Dump XFS mount structure"}, 2993153323Srodrigc { "xnode", kdbm_xfs_xnode, "<xfs_inode_t>", 2994153323Srodrigc "Dump XFS inode"}, 2995153323Srodrigc { "xiocore", kdbm_xfs_xcore, "<xfs_iocore_t>", 2996153323Srodrigc "Dump XFS iocore"}, 2997153323Srodrigc { "xperag", kdbm_xfs_xperag, "<xfs_mount_t>", 2998153323Srodrigc "Dump XFS per-allocation group data"}, 2999153323Srodrigc { "xqinfo", kdbm_xfs_xqm_qinfo, "<xfs_mount_t>", 3000153323Srodrigc "Dump mount->m_quotainfo structure"}, 3001153323Srodrigc#ifdef CONFIG_XFS_QUOTA 3002153323Srodrigc { "xqm", kdbm_xfs_xqm, "", 3003153323Srodrigc "Dump XFS quota manager structure"}, 3004153323Srodrigc { "xqmfree", kdbm_xfs_xqm_freelist, "", 3005153323Srodrigc "Dump XFS global freelist of dquots"}, 3006153323Srodrigc { "xqmhtab", kdbm_xfs_xqm_htab, "", 3007153323Srodrigc "Dump XFS hashtable of dquots"}, 3008153323Srodrigc#endif /* CONFIG_XFS_QUOTA */ 3009153323Srodrigc { "xqmplist",kdbm_xfs_xqm_mplist, "<xfs_mount_t>", 3010153323Srodrigc "Dump XFS all dquots of a f/s"}, 3011153323Srodrigc#ifdef XFS_RW_TRACE 3012153323Srodrigc { "xrwtrc", kdbm_xfs_xrwtrace, "<xfs_inode_t>", 3013153323Srodrigc "Dump XFS inode read/write trace" }, 3014153323Srodrigc#endif 3015153323Srodrigc { "xsb", kdbm_xfs_xsb, "<xfs_sb_t> <cnv>", 3016153323Srodrigc "Dump XFS superblock"}, 3017153323Srodrigc { "xtp", kdbm_xfs_xtp, "<xfs_trans_t>", 3018153323Srodrigc "Dump XFS transaction structure"}, 3019153323Srodrigc { "xtrres", kdbm_xfs_xtrans_res, "<xfs_mount_t>", 3020153323Srodrigc "Dump XFS reservation values"}, 3021159451Srodrigc { NULL, NULL, NULL } 3022153323Srodrigc}; 3023153323Srodrigc 3024159451Srodrigcstatic struct xif xfsbuf_funcs[] = { 3025159451Srodrigc { "bp", kdbm_bp, "<vaddr>", "Display xfs_buf_t" }, 3026159451Srodrigc { "bpflags", kdbm_bp_flags, "<flags>", "Display xfs_buf flags" }, 3027159451Srodrigc { "xiomap", kdbm_iomap, "<xfs_iomap_t *>", "Display IOmap" }, 3028159451Srodrigc { "i2vnode", kdbm_i2vnode, "<inode *>", "Display Vnode" }, 3029159451Srodrigc { "bpdelay", kdbm_bpdelay, "0|1", "Display delwri buffers" }, 3030159451Srodrigc#ifdef XFS_BUF_TRACE 3031159451Srodrigc { "bptrace", kdbm_bptrace, "<vaddr>|<count>", "xfs_buf_t trace" }, 3032159451Srodrigc { "bpoffset",kdbm_bptrace_offset, "<daddr> [<mask>]","xfs_buf_t trace" }, 3033153323Srodrigc#endif 3034159451Srodrigc { NULL, NULL, NULL } 3035153323Srodrigc}; 3036153323Srodrigc 3037153323Srodrigcstatic int 3038153323Srodrigcxfsidbg_init(void) 3039153323Srodrigc{ 3040153323Srodrigc struct xif *p; 3041153323Srodrigc 3042153323Srodrigc for (p = xfsidbg_funcs; p->name; p++) 3043153323Srodrigc kdb_register(p->name, p->func, p->args, p->help, 0); 3044159451Srodrigc for (p = xfsbuf_funcs; p->name; p++) 3045153323Srodrigc kdb_register(p->name, p->func, p->args, p->help, 0); 3046153323Srodrigc return 0; 3047153323Srodrigc} 3048153323Srodrigc 3049153323Srodrigcstatic void 3050153323Srodrigcxfsidbg_exit(void) 3051153323Srodrigc{ 3052153323Srodrigc struct xif *p; 3053153323Srodrigc 3054153323Srodrigc for (p = xfsidbg_funcs; p->name; p++) 3055153323Srodrigc kdb_unregister(p->name); 3056159451Srodrigc for (p = xfsbuf_funcs; p->name; p++) 3057153323Srodrigc kdb_unregister(p->name); 3058153323Srodrigc} 3059153323Srodrigc 3060153323Srodrigc/* 3061153323Srodrigc * Argument to xfs_alloc routines, for allocation type. 3062153323Srodrigc */ 3063153323Srodrigcstatic char *xfs_alloctype[] = { 3064153323Srodrigc "any_ag", "first_ag", "start_ag", "this_ag", 3065153323Srodrigc "start_bno", "near_bno", "this_bno" 3066153323Srodrigc}; 3067153323Srodrigc 3068153323Srodrigc/* 3069153323Srodrigc * Static functions. 3070153323Srodrigc */ 3071153323Srodrigc 3072153323Srodrigc#ifdef XFS_ALLOC_TRACE 3073153323Srodrigc/* 3074153323Srodrigc * Print xfs alloc trace buffer entry. 3075153323Srodrigc */ 3076153323Srodrigcstatic int 3077153323Srodrigcxfs_alloc_trace_entry(ktrace_entry_t *ktep) 3078153323Srodrigc{ 3079153323Srodrigc static char *modagf_flags[] = { 3080153323Srodrigc "magicnum", 3081153323Srodrigc "versionnum", 3082153323Srodrigc "seqno", 3083153323Srodrigc "length", 3084153323Srodrigc "roots", 3085153323Srodrigc "levels", 3086153323Srodrigc "flfirst", 3087153323Srodrigc "fllast", 3088153323Srodrigc "flcount", 3089153323Srodrigc "freeblks", 3090153323Srodrigc "longest", 3091153323Srodrigc NULL 3092153323Srodrigc }; 3093153323Srodrigc 3094153323Srodrigc if (((__psint_t)ktep->val[0] & 0xffff) == 0) 3095153323Srodrigc return 0; 3096153323Srodrigc switch ((long)ktep->val[0] & 0xffffL) { 3097153323Srodrigc case XFS_ALLOC_KTRACE_ALLOC: 3098153323Srodrigc kdb_printf("alloc %s[%s %ld] mp 0x%p\n", 3099153323Srodrigc (char *)ktep->val[1], 3100153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3101153323Srodrigc (long)ktep->val[0] >> 16, 3102153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3103153323Srodrigc kdb_printf( 3104153323Srodrigc "agno %ld agbno %ld minlen %ld maxlen %ld mod %ld prod %ld minleft %ld\n", 3105153323Srodrigc (long)ktep->val[4], 3106153323Srodrigc (long)ktep->val[5], 3107153323Srodrigc (long)ktep->val[6], 3108153323Srodrigc (long)ktep->val[7], 3109153323Srodrigc (long)ktep->val[8], 3110153323Srodrigc (long)ktep->val[9], 3111153323Srodrigc (long)ktep->val[10]); 3112153323Srodrigc kdb_printf("total %ld alignment %ld len %ld type %s otype %s\n", 3113153323Srodrigc (long)ktep->val[11], 3114153323Srodrigc (long)ktep->val[12], 3115153323Srodrigc (long)ktep->val[13], 3116153323Srodrigc xfs_alloctype[((__psint_t)ktep->val[14]) >> 16], 3117153323Srodrigc xfs_alloctype[((__psint_t)ktep->val[14]) & 0xffff]); 3118153323Srodrigc kdb_printf("wasdel %d wasfromfl %d isfl %d userdata %d\n", 3119153323Srodrigc ((__psint_t)ktep->val[15] & (1 << 3)) != 0, 3120153323Srodrigc ((__psint_t)ktep->val[15] & (1 << 2)) != 0, 3121153323Srodrigc ((__psint_t)ktep->val[15] & (1 << 1)) != 0, 3122153323Srodrigc ((__psint_t)ktep->val[15] & (1 << 0)) != 0); 3123153323Srodrigc break; 3124153323Srodrigc case XFS_ALLOC_KTRACE_FREE: 3125153323Srodrigc kdb_printf("free %s[%s %ld] mp 0x%p\n", 3126153323Srodrigc (char *)ktep->val[1], 3127153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3128153323Srodrigc (long)ktep->val[0] >> 16, 3129153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3130153323Srodrigc kdb_printf("agno %ld agbno %ld len %ld isfl %d\n", 3131153323Srodrigc (long)ktep->val[4], 3132153323Srodrigc (long)ktep->val[5], 3133153323Srodrigc (long)ktep->val[6], 3134153323Srodrigc (__psint_t)ktep->val[7] != 0); 3135153323Srodrigc break; 3136153323Srodrigc case XFS_ALLOC_KTRACE_MODAGF: 3137153323Srodrigc kdb_printf("modagf %s[%s %ld] mp 0x%p\n", 3138153323Srodrigc (char *)ktep->val[1], 3139153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3140153323Srodrigc (long)ktep->val[0] >> 16, 3141153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3142153323Srodrigc printflags((__psint_t)ktep->val[4], modagf_flags, "modified"); 3143153323Srodrigc kdb_printf("seqno %lu length %lu roots b %lu c %lu\n", 3144153323Srodrigc (unsigned long)ktep->val[5], 3145153323Srodrigc (unsigned long)ktep->val[6], 3146153323Srodrigc (unsigned long)ktep->val[7], 3147153323Srodrigc (unsigned long)ktep->val[8]); 3148153323Srodrigc kdb_printf("levels b %lu c %lu flfirst %lu fllast %lu flcount %lu\n", 3149153323Srodrigc (unsigned long)ktep->val[9], 3150153323Srodrigc (unsigned long)ktep->val[10], 3151153323Srodrigc (unsigned long)ktep->val[11], 3152153323Srodrigc (unsigned long)ktep->val[12], 3153153323Srodrigc (unsigned long)ktep->val[13]); 3154153323Srodrigc kdb_printf("freeblks %lu longest %lu\n", 3155153323Srodrigc (unsigned long)ktep->val[14], 3156153323Srodrigc (unsigned long)ktep->val[15]); 3157153323Srodrigc break; 3158153323Srodrigc 3159153323Srodrigc case XFS_ALLOC_KTRACE_UNBUSY: 3160153323Srodrigc kdb_printf("unbusy %s [%s %ld] mp 0x%p\n", 3161153323Srodrigc (char *)ktep->val[1], 3162153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3163153323Srodrigc (long)ktep->val[0] >> 16, 3164153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3165153323Srodrigc kdb_printf(" agno %lu slot %lu tp 0x%p\n", 3166153323Srodrigc (unsigned long)ktep->val[4], 3167153323Srodrigc (unsigned long)ktep->val[7], 3168153323Srodrigc (xfs_trans_t *)ktep->val[8]); 3169153323Srodrigc break; 3170153323Srodrigc case XFS_ALLOC_KTRACE_BUSY: 3171153323Srodrigc kdb_printf("busy %s [%s %ld] mp 0x%p\n", 3172153323Srodrigc (char *)ktep->val[1], 3173153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3174153323Srodrigc (long)ktep->val[0] >> 16, 3175153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3176153323Srodrigc kdb_printf(" agno %lu agbno %lu len %lu slot %lu tp 0x%p\n", 3177153323Srodrigc (unsigned long)ktep->val[4], 3178153323Srodrigc (unsigned long)ktep->val[5], 3179153323Srodrigc (unsigned long)ktep->val[6], 3180153323Srodrigc (unsigned long)ktep->val[7], 3181153323Srodrigc (xfs_trans_t *)ktep->val[8]); 3182153323Srodrigc break; 3183153323Srodrigc case XFS_ALLOC_KTRACE_BUSYSEARCH: 3184153323Srodrigc kdb_printf("busy-search %s [%s %ld] mp 0x%p\n", 3185153323Srodrigc (char *)ktep->val[1], 3186153323Srodrigc ktep->val[2] ? (char *)ktep->val[2] : "", 3187153323Srodrigc (long)ktep->val[0] >> 16, 3188153323Srodrigc (xfs_mount_t *)ktep->val[3]); 3189153323Srodrigc kdb_printf(" agno %ld agbno %ld len %ld slot %ld tp 0x%p\n", 3190153323Srodrigc (unsigned long)ktep->val[4], 3191153323Srodrigc (unsigned long)ktep->val[5], 3192153323Srodrigc (unsigned long)ktep->val[6], 3193153323Srodrigc (unsigned long)ktep->val[7], 3194153323Srodrigc (xfs_trans_t *)ktep->val[8]); 3195153323Srodrigc break; 3196153323Srodrigc default: 3197153323Srodrigc kdb_printf("unknown alloc trace record\n"); 3198153323Srodrigc break; 3199153323Srodrigc } 3200153323Srodrigc return 1; 3201153323Srodrigc} 3202153323Srodrigc#endif /* XFS_ALLOC_TRACE */ 3203153323Srodrigc 3204153323Srodrigc#ifdef XFS_ATTR_TRACE 3205153323Srodrigc/* 3206153323Srodrigc * Print an attribute trace buffer entry. 3207153323Srodrigc */ 3208153323Srodrigcstatic int 3209153323Srodrigcxfs_attr_trace_entry(ktrace_entry_t *ktep) 3210153323Srodrigc{ 3211153323Srodrigc static char *attr_arg_flags[] = { 3212153323Srodrigc "DONTFOLLOW", /* 0x0001 */ 3213153323Srodrigc "ROOT", /* 0x0002 */ 3214153323Srodrigc "TRUSTED", /* 0x0004 */ 3215153323Srodrigc "SECURE", /* 0x0008 */ 3216153323Srodrigc "CREATE", /* 0x0010 */ 3217153323Srodrigc "REPLACE", /* 0x0020 */ 3218153323Srodrigc "?", /* 0x0040 */ 3219153323Srodrigc "?", /* 0x0080 */ 3220153323Srodrigc "SYSTEM", /* 0x0100 */ 3221153323Srodrigc "?", /* 0x0200 */ 3222153323Srodrigc "?", /* 0x0400 */ 3223153323Srodrigc "?", /* 0x0800 */ 3224153323Srodrigc "KERNOTIME", /* 0x1000 */ 3225153323Srodrigc "KERNOVAL", /* 0x2000 */ 3226153323Srodrigc "KERNAMELS", /* 0x4000 */ 3227153323Srodrigc "KERNFULLS", /* 0x8000 */ 3228153323Srodrigc NULL 3229153323Srodrigc }; 3230153323Srodrigc 3231153323Srodrigc if (!ktep->val[0]) 3232153323Srodrigc return 0; 3233153323Srodrigc 3234153323Srodrigc qprintf("-- %s: cursor h/b/o 0x%lx/0x%lx/%lu, dupcnt %lu, dp 0x%p\n", 3235153323Srodrigc (char *)ktep->val[1], 3236153323Srodrigc (unsigned long)ktep->val[3], 3237153323Srodrigc (unsigned long)ktep->val[4], 3238153323Srodrigc (unsigned long)ktep->val[5], 3239153323Srodrigc (unsigned long)ktep->val[11], 3240153323Srodrigc (xfs_inode_t *)ktep->val[2]); 3241153323Srodrigc qprintf(" alist 0x%p, size %lu, count %lu, firstu %lu, Llen %lu", 3242153323Srodrigc (attrlist_t *)ktep->val[6], 3243153323Srodrigc (unsigned long)ktep->val[7], 3244153323Srodrigc (unsigned long)ktep->val[8], 3245153323Srodrigc (unsigned long)ktep->val[9], 3246153323Srodrigc (unsigned long)ktep->val[10]); 3247153323Srodrigc printflags((__psunsigned_t)(ktep->val[12]), attr_arg_flags, ", flags"); 3248153323Srodrigc qprintf("\n"); 3249153323Srodrigc 3250153323Srodrigc switch ((__psint_t)ktep->val[0]) { 3251153323Srodrigc case XFS_ATTR_KTRACE_L_C: 3252153323Srodrigc break; 3253153323Srodrigc case XFS_ATTR_KTRACE_L_CN: 3254153323Srodrigc qprintf(" node: count %lu, 1st hash 0x%lx, last hash 0x%lx\n", 3255153323Srodrigc (unsigned long)ktep->val[13], 3256153323Srodrigc (unsigned long)ktep->val[14], 3257153323Srodrigc (unsigned long)ktep->val[15]); 3258153323Srodrigc break; 3259153323Srodrigc case XFS_ATTR_KTRACE_L_CB: 3260153323Srodrigc qprintf(" btree: hash 0x%lx, blkno 0x%lx\n", 3261153323Srodrigc (unsigned long)ktep->val[13], 3262153323Srodrigc (unsigned long)ktep->val[14]); 3263153323Srodrigc break; 3264153323Srodrigc case XFS_ATTR_KTRACE_L_CL: 3265153323Srodrigc qprintf(" leaf: count %ld, 1st hash 0x%lx, last hash 0x%lx\n", 3266153323Srodrigc (unsigned long)ktep->val[13], 3267153323Srodrigc (unsigned long)ktep->val[14], 3268153323Srodrigc (unsigned long)ktep->val[15]); 3269153323Srodrigc break; 3270153323Srodrigc default: 3271153323Srodrigc qprintf(" unknown attr trace record format\n"); 3272153323Srodrigc break; 3273153323Srodrigc } 3274153323Srodrigc return 1; 3275153323Srodrigc} 3276153323Srodrigc#endif /* XFS_ATTR_TRACE */ 3277153323Srodrigc 3278153323Srodrigc#ifdef XFS_BMAP_TRACE 3279153323Srodrigc/* 3280153323Srodrigc * Print xfs bmap extent trace buffer entry. 3281153323Srodrigc */ 3282153323Srodrigcstatic int 3283153323Srodrigcxfs_bmap_trace_entry(ktrace_entry_t *ktep) 3284153323Srodrigc{ 3285153323Srodrigc xfs_dfsbno_t b; 3286153323Srodrigc xfs_dfilblks_t c; 3287153323Srodrigc xfs_inode_t *ip; 3288153323Srodrigc xfs_ino_t ino; 3289153323Srodrigc xfs_dfiloff_t o; 3290153323Srodrigc int flag; 3291153323Srodrigc int opcode; 3292153323Srodrigc static char *ops[] = { "del", "ins", "pre", "post" }; 3293153323Srodrigc xfs_bmbt_rec_32_t r; 3294153323Srodrigc int whichfork; 3295153323Srodrigc 3296153323Srodrigc opcode = ((__psint_t)ktep->val[0]) & 0xffff; 3297153323Srodrigc if (opcode == 0) 3298153323Srodrigc return 0; 3299153323Srodrigc whichfork = ((__psint_t)ktep->val[0]) >> 16; 3300153323Srodrigc ip = (xfs_inode_t *)ktep->val[3]; 3301153323Srodrigc ino = ((xfs_ino_t)(unsigned long)ktep->val[6] << 32) | 3302153323Srodrigc ((xfs_ino_t)(unsigned long)ktep->val[7]); 3303153323Srodrigc qprintf("%s %s:%s ip %p ino %s %cf\n", 3304153323Srodrigc ops[opcode - 1], (char *)ktep->val[1], 3305153323Srodrigc (char *)ktep->val[2], ip, xfs_fmtino(ino, ip->i_mount), 3306153323Srodrigc "da"[whichfork]); 3307153323Srodrigc r.l0 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[8]; 3308153323Srodrigc r.l1 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[9]; 3309153323Srodrigc r.l2 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[10]; 3310153323Srodrigc r.l3 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[11]; 3311153323Srodrigc xfs_convert_extent(&r, &o, &b, &c, &flag); 3312153323Srodrigc qprintf(" idx %ld offset %lld block %s", 3313153323Srodrigc (long)ktep->val[4], o, 3314153323Srodrigc xfs_fmtfsblock((xfs_fsblock_t)b, ip->i_mount)); 3315153323Srodrigc qprintf(" count %lld flag %d\n", c, flag); 3316153323Srodrigc if ((__psint_t)ktep->val[5] != 2) 3317153323Srodrigc return 1; 3318153323Srodrigc r.l0 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[12]; 3319153323Srodrigc r.l1 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[13]; 3320153323Srodrigc r.l2 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[14]; 3321153323Srodrigc r.l3 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[15]; 3322153323Srodrigc xfs_convert_extent(&r, &o, &b, &c, &flag); 3323153323Srodrigc qprintf(" offset %lld block %s", o, 3324153323Srodrigc xfs_fmtfsblock((xfs_fsblock_t)b, ip->i_mount)); 3325153323Srodrigc qprintf(" count %lld flag %d\n", c, flag); 3326153323Srodrigc return 1; 3327153323Srodrigc} 3328153323Srodrigc 3329153323Srodrigc/* 3330153323Srodrigc * Print xfs bmap btree trace buffer entry. 3331153323Srodrigc */ 3332153323Srodrigcstatic int 3333153323Srodrigcxfs_bmbt_trace_entry( 3334153323Srodrigc ktrace_entry_t *ktep) 3335153323Srodrigc{ 3336153323Srodrigc int line; 3337153323Srodrigc xfs_bmbt_rec_32_t r; 3338153323Srodrigc xfs_bmbt_irec_t s; 3339153323Srodrigc int type; 3340153323Srodrigc int whichfork; 3341153323Srodrigc 3342153323Srodrigc type = (__psint_t)ktep->val[0] & 0xff; 3343153323Srodrigc if (type == 0) 3344153323Srodrigc return 0; 3345153323Srodrigc whichfork = ((__psint_t)ktep->val[0] >> 8) & 0xff; 3346153323Srodrigc line = ((__psint_t)ktep->val[0] >> 16) & 0xffff; 3347153323Srodrigc qprintf("%s[%s@%d] ip 0x%p %cf cur 0x%p\n", 3348153323Srodrigc (char *)ktep->val[1], 3349153323Srodrigc (char *)ktep->val[2], 3350153323Srodrigc line, 3351153323Srodrigc (xfs_inode_t *)ktep->val[3], 3352153323Srodrigc "da"[whichfork], 3353153323Srodrigc (xfs_btree_cur_t *)ktep->val[4]); 3354153323Srodrigc switch (type) { 3355153323Srodrigc case XFS_BMBT_KTRACE_ARGBI: 3356153323Srodrigc qprintf(" buf 0x%p i %ld\n", 3357153323Srodrigc (xfs_buf_t *)ktep->val[5], 3358153323Srodrigc (long)ktep->val[6]); 3359153323Srodrigc break; 3360153323Srodrigc case XFS_BMBT_KTRACE_ARGBII: 3361153323Srodrigc qprintf(" buf 0x%p i0 %ld i1 %ld\n", 3362153323Srodrigc (xfs_buf_t *)ktep->val[5], 3363153323Srodrigc (long)ktep->val[6], 3364153323Srodrigc (long)ktep->val[7]); 3365153323Srodrigc break; 3366153323Srodrigc case XFS_BMBT_KTRACE_ARGFFFI: 3367153323Srodrigc qprintf(" o 0x%x%08x b 0x%x%08x i 0x%x%08x j %ld\n", 3368153323Srodrigc (unsigned int)(long)ktep->val[5], 3369153323Srodrigc (unsigned int)(long)ktep->val[6], 3370153323Srodrigc (unsigned int)(long)ktep->val[7], 3371153323Srodrigc (unsigned int)(long)ktep->val[8], 3372153323Srodrigc (unsigned int)(long)ktep->val[9], 3373153323Srodrigc (unsigned int)(long)ktep->val[10], 3374153323Srodrigc (long)ktep->val[11]); 3375153323Srodrigc break; 3376153323Srodrigc case XFS_BMBT_KTRACE_ARGI: 3377153323Srodrigc qprintf(" i 0x%lx\n", 3378153323Srodrigc (long)ktep->val[5]); 3379153323Srodrigc break; 3380153323Srodrigc case XFS_BMBT_KTRACE_ARGIFK: 3381153323Srodrigc qprintf(" i 0x%lx f 0x%x%08x o 0x%x%08x\n", 3382153323Srodrigc (long)ktep->val[5], 3383153323Srodrigc (unsigned int)(long)ktep->val[6], 3384153323Srodrigc (unsigned int)(long)ktep->val[7], 3385153323Srodrigc (unsigned int)(long)ktep->val[8], 3386153323Srodrigc (unsigned int)(long)ktep->val[9]); 3387153323Srodrigc break; 3388153323Srodrigc case XFS_BMBT_KTRACE_ARGIFR: 3389153323Srodrigc qprintf(" i 0x%lx f 0x%x%08x ", 3390153323Srodrigc (long)ktep->val[5], 3391153323Srodrigc (unsigned int)(long)ktep->val[6], 3392153323Srodrigc (unsigned int)(long)ktep->val[7]); 3393153323Srodrigc s.br_startoff = (xfs_fileoff_t) 3394153323Srodrigc (((xfs_dfiloff_t)(unsigned long)ktep->val[8] << 32) | 3395153323Srodrigc (xfs_dfiloff_t)(unsigned long)ktep->val[9]); 3396153323Srodrigc s.br_startblock = (xfs_fsblock_t) 3397153323Srodrigc (((xfs_dfsbno_t)(unsigned long)ktep->val[10] << 32) | 3398153323Srodrigc (xfs_dfsbno_t)(unsigned long)ktep->val[11]); 3399153323Srodrigc s.br_blockcount = (xfs_filblks_t) 3400153323Srodrigc (((xfs_dfilblks_t)(unsigned long)ktep->val[12] << 32) | 3401153323Srodrigc (xfs_dfilblks_t)(unsigned long)ktep->val[13]); 3402153323Srodrigc xfsidbg_xbirec(&s); 3403153323Srodrigc break; 3404153323Srodrigc case XFS_BMBT_KTRACE_ARGIK: 3405153323Srodrigc qprintf(" i 0x%lx o 0x%x%08x\n", 3406153323Srodrigc (long)ktep->val[5], 3407153323Srodrigc (unsigned int)(long)ktep->val[6], 3408153323Srodrigc (unsigned int)(long)ktep->val[7]); 3409153323Srodrigc break; 3410153323Srodrigc case XFS_BMBT_KTRACE_CUR: 3411153323Srodrigc qprintf(" nlevels %ld flags %ld allocated %ld ", 3412153323Srodrigc ((long)ktep->val[5] >> 24) & 0xff, 3413153323Srodrigc ((long)ktep->val[5] >> 16) & 0xff, 3414153323Srodrigc (long)ktep->val[5] & 0xffff); 3415153323Srodrigc r.l0 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[6]; 3416153323Srodrigc r.l1 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[7]; 3417153323Srodrigc r.l2 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[8]; 3418153323Srodrigc r.l3 = (xfs_bmbt_rec_base_t)(unsigned long)ktep->val[9]; 3419153323Srodrigc xfsidbg_xbrec((xfs_bmbt_rec_64_t *)&r); 3420153323Srodrigc qprintf(" bufs 0x%p 0x%p 0x%p 0x%p ", 3421153323Srodrigc (xfs_buf_t *)ktep->val[10], 3422153323Srodrigc (xfs_buf_t *)ktep->val[11], 3423153323Srodrigc (xfs_buf_t *)ktep->val[12], 3424153323Srodrigc (xfs_buf_t *)ktep->val[13]); 3425153323Srodrigc qprintf("ptrs %ld %ld %ld %ld\n", 3426153323Srodrigc (long)ktep->val[14] >> 16, 3427153323Srodrigc (long)ktep->val[14] & 0xffff, 3428153323Srodrigc (long)ktep->val[15] >> 16, 3429153323Srodrigc (long)ktep->val[15] & 0xffff); 3430153323Srodrigc break; 3431153323Srodrigc default: 3432153323Srodrigc qprintf("unknown bmbt trace record\n"); 3433153323Srodrigc break; 3434153323Srodrigc } 3435153323Srodrigc return 1; 3436153323Srodrigc} 3437153323Srodrigc#endif 3438153323Srodrigc 3439153323Srodrigc/* 3440153323Srodrigc * Print an xfs in-inode bmap btree root. 3441153323Srodrigc */ 3442153323Srodrigcstatic void 3443153323Srodrigcxfs_broot(xfs_inode_t *ip, xfs_ifork_t *f) 3444153323Srodrigc{ 3445153323Srodrigc xfs_bmbt_block_t *broot; 3446153323Srodrigc int format; 3447153323Srodrigc int i; 3448153323Srodrigc xfs_bmbt_key_t *kp; 3449153323Srodrigc xfs_bmbt_ptr_t *pp; 3450153323Srodrigc 3451153323Srodrigc format = f == &ip->i_df ? ip->i_d.di_format : ip->i_d.di_aformat; 3452153323Srodrigc if ((f->if_flags & XFS_IFBROOT) == 0 || 3453153323Srodrigc format != XFS_DINODE_FMT_BTREE) { 3454153323Srodrigc kdb_printf("inode 0x%p not btree format\n", ip); 3455153323Srodrigc return; 3456153323Srodrigc } 3457153323Srodrigc broot = f->if_broot; 3458153323Srodrigc kdb_printf("block @0x%p magic %x level %d numrecs %d\n", 3459159451Srodrigc broot, 3460159451Srodrigc be32_to_cpu(broot->bb_magic), 3461159451Srodrigc be16_to_cpu(broot->bb_level), 3462159451Srodrigc be16_to_cpu(broot->bb_numrecs)); 3463153323Srodrigc kp = XFS_BMAP_BROOT_KEY_ADDR(broot, 1, f->if_broot_bytes); 3464153323Srodrigc pp = XFS_BMAP_BROOT_PTR_ADDR(broot, 1, f->if_broot_bytes); 3465159451Srodrigc for (i = 1; i <= be16_to_cpu(broot->bb_numrecs); i++) 3466153323Srodrigc kdb_printf("\t%d: startoff %Ld ptr %Lx %s\n", 3467153323Srodrigc i, INT_GET(kp[i - 1].br_startoff, ARCH_CONVERT), INT_GET(pp[i - 1], ARCH_CONVERT), 3468153323Srodrigc xfs_fmtfsblock(INT_GET(pp[i - 1], ARCH_CONVERT), ip->i_mount)); 3469153323Srodrigc} 3470153323Srodrigc 3471153323Srodrigc/* 3472153323Srodrigc * Print allocation btree block. 3473153323Srodrigc */ 3474153323Srodrigcstatic void 3475153323Srodrigcxfs_btalloc(xfs_alloc_block_t *bt, int bsz) 3476153323Srodrigc{ 3477153323Srodrigc int i; 3478153323Srodrigc 3479153323Srodrigc kdb_printf("magic 0x%x level %d numrecs %d leftsib 0x%x rightsib 0x%x\n", 3480159451Srodrigc be32_to_cpu(bt->bb_magic), 3481159451Srodrigc be16_to_cpu(bt->bb_level), 3482159451Srodrigc be16_to_cpu(bt->bb_numrecs), 3483159451Srodrigc be32_to_cpu(bt->bb_leftsib), 3484159451Srodrigc be32_to_cpu(bt->bb_rightsib)); 3485159451Srodrigc if (!bt->bb_level) { 3486159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3487153323Srodrigc xfs_alloc_rec_t *r; 3488153323Srodrigc 3489153323Srodrigc r = XFS_BTREE_REC_ADDR(bsz, xfs_alloc, bt, i, 0); 3490153323Srodrigc kdb_printf("rec %d startblock 0x%x blockcount %d\n", 3491159451Srodrigc i, 3492159451Srodrigc be32_to_cpu(r->ar_startblock), 3493159451Srodrigc be32_to_cpu(r->ar_blockcount)); 3494153323Srodrigc } 3495153323Srodrigc } else { 3496153323Srodrigc int mxr; 3497153323Srodrigc 3498153323Srodrigc mxr = XFS_BTREE_BLOCK_MAXRECS(bsz, xfs_alloc, 0); 3499159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3500153323Srodrigc xfs_alloc_key_t *k; 3501153323Srodrigc xfs_alloc_ptr_t *p; 3502153323Srodrigc 3503153323Srodrigc k = XFS_BTREE_KEY_ADDR(bsz, xfs_alloc, bt, i, mxr); 3504153323Srodrigc p = XFS_BTREE_PTR_ADDR(bsz, xfs_alloc, bt, i, mxr); 3505153323Srodrigc kdb_printf("key %d startblock 0x%x blockcount %d ptr 0x%x\n", 3506159451Srodrigc i, 3507159451Srodrigc be32_to_cpu(k->ar_startblock), 3508159451Srodrigc be32_to_cpu(k->ar_blockcount), 3509159451Srodrigc be32_to_cpu(*p)); 3510153323Srodrigc } 3511153323Srodrigc } 3512153323Srodrigc} 3513153323Srodrigc 3514153323Srodrigc/* 3515153323Srodrigc * Print a bmap btree block. 3516153323Srodrigc */ 3517153323Srodrigcstatic void 3518153323Srodrigcxfs_btbmap(xfs_bmbt_block_t *bt, int bsz) 3519153323Srodrigc{ 3520153323Srodrigc int i; 3521153323Srodrigc 3522159451Srodrigc kdb_printf("magic 0x%x level %d numrecs %d leftsib %Lx rightsib %Lx\n", 3523159451Srodrigc be32_to_cpu(bt->bb_magic), 3524159451Srodrigc be16_to_cpu(bt->bb_level), 3525159451Srodrigc be16_to_cpu(bt->bb_numrecs), 3526159451Srodrigc be64_to_cpu(bt->bb_leftsib), 3527159451Srodrigc be64_to_cpu(bt->bb_rightsib)); 3528159451Srodrigc if (!bt->bb_level) { 3529159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3530153323Srodrigc xfs_bmbt_rec_t *r; 3531153323Srodrigc xfs_bmbt_irec_t irec; 3532153323Srodrigc 3533153323Srodrigc r = (xfs_bmbt_rec_t *)XFS_BTREE_REC_ADDR(bsz, 3534153323Srodrigc xfs_bmbt, bt, i, 0); 3535153323Srodrigc 3536153323Srodrigc xfs_bmbt_disk_get_all((xfs_bmbt_rec_t *)r, &irec); 3537153323Srodrigc kdb_printf("rec %d startoff %Ld startblock %Lx blockcount %Ld flag %d\n", 3538153323Srodrigc i, irec.br_startoff, 3539153323Srodrigc (__uint64_t)irec.br_startblock, 3540153323Srodrigc irec.br_blockcount, irec.br_state); 3541153323Srodrigc } 3542153323Srodrigc } else { 3543153323Srodrigc int mxr; 3544153323Srodrigc 3545153323Srodrigc mxr = XFS_BTREE_BLOCK_MAXRECS(bsz, xfs_bmbt, 0); 3546159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3547153323Srodrigc xfs_bmbt_key_t *k; 3548153323Srodrigc xfs_bmbt_ptr_t *p; 3549153323Srodrigc 3550153323Srodrigc k = XFS_BTREE_KEY_ADDR(bsz, xfs_bmbt, bt, i, mxr); 3551153323Srodrigc p = XFS_BTREE_PTR_ADDR(bsz, xfs_bmbt, bt, i, mxr); 3552153323Srodrigc kdb_printf("key %d startoff %Ld ", 3553153323Srodrigc i, INT_GET(k->br_startoff, ARCH_CONVERT)); 3554153323Srodrigc kdb_printf("ptr %Lx\n", INT_GET(*p, ARCH_CONVERT)); 3555153323Srodrigc } 3556153323Srodrigc } 3557153323Srodrigc} 3558153323Srodrigc 3559153323Srodrigc/* 3560153323Srodrigc * Print an inode btree block. 3561153323Srodrigc */ 3562153323Srodrigcstatic void 3563153323Srodrigcxfs_btino(xfs_inobt_block_t *bt, int bsz) 3564153323Srodrigc{ 3565153323Srodrigc int i; 3566153323Srodrigc 3567153323Srodrigc kdb_printf("magic 0x%x level %d numrecs %d leftsib 0x%x rightsib 0x%x\n", 3568159451Srodrigc be32_to_cpu(bt->bb_magic), 3569159451Srodrigc be16_to_cpu(bt->bb_level), 3570159451Srodrigc be16_to_cpu(bt->bb_numrecs), 3571159451Srodrigc be32_to_cpu(bt->bb_leftsib), 3572159451Srodrigc be32_to_cpu(bt->bb_rightsib)); 3573159451Srodrigc if (!bt->bb_level) { 3574159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3575153323Srodrigc xfs_inobt_rec_t *r; 3576153323Srodrigc 3577153323Srodrigc r = XFS_BTREE_REC_ADDR(bsz, xfs_inobt, bt, i, 0); 3578153323Srodrigc kdb_printf("rec %d startino 0x%x freecount %d, free %Lx\n", 3579153323Srodrigc i, INT_GET(r->ir_startino, ARCH_CONVERT), 3580153323Srodrigc INT_GET(r->ir_freecount, ARCH_CONVERT), 3581153323Srodrigc INT_GET(r->ir_free, ARCH_CONVERT)); 3582153323Srodrigc } 3583153323Srodrigc } else { 3584153323Srodrigc int mxr; 3585153323Srodrigc 3586153323Srodrigc mxr = XFS_BTREE_BLOCK_MAXRECS(bsz, xfs_inobt, 0); 3587159451Srodrigc for (i = 1; i <= be16_to_cpu(bt->bb_numrecs); i++) { 3588153323Srodrigc xfs_inobt_key_t *k; 3589153323Srodrigc xfs_inobt_ptr_t *p; 3590153323Srodrigc 3591153323Srodrigc k = XFS_BTREE_KEY_ADDR(bsz, xfs_inobt, bt, i, mxr); 3592153323Srodrigc p = XFS_BTREE_PTR_ADDR(bsz, xfs_inobt, bt, i, mxr); 3593153323Srodrigc kdb_printf("key %d startino 0x%x ptr 0x%x\n", 3594153323Srodrigc i, INT_GET(k->ir_startino, ARCH_CONVERT), 3595159451Srodrigc be32_to_cpu(*p)); 3596153323Srodrigc } 3597153323Srodrigc } 3598153323Srodrigc} 3599153323Srodrigc 3600153323Srodrigc/* 3601153323Srodrigc * Print a buf log item. 3602153323Srodrigc */ 3603153323Srodrigcstatic void 3604153323Srodrigcxfs_buf_item_print(xfs_buf_log_item_t *blip, int summary) 3605153323Srodrigc{ 3606153323Srodrigc static char *bli_flags[] = { 3607153323Srodrigc "hold", /* 0x1 */ 3608153323Srodrigc "dirty", /* 0x2 */ 3609153323Srodrigc "stale", /* 0x4 */ 3610153323Srodrigc "logged", /* 0x8 */ 3611153323Srodrigc "ialloc", /* 0x10 */ 3612153323Srodrigc "inode_stale", /* 0x20 */ 3613159451Srodrigc NULL 3614153323Srodrigc }; 3615153323Srodrigc static char *blf_flags[] = { 3616153323Srodrigc "inode", /* 0x1 */ 3617153323Srodrigc "cancel", /* 0x2 */ 3618159451Srodrigc NULL 3619153323Srodrigc }; 3620153323Srodrigc 3621153323Srodrigc if (summary) { 3622153323Srodrigc kdb_printf("buf 0x%p blkno 0x%Lx ", blip->bli_buf, 3623153323Srodrigc blip->bli_format.blf_blkno); 3624153323Srodrigc printflags(blip->bli_flags, bli_flags, "flags:"); 3625153323Srodrigc kdb_printf("\n "); 3626153323Srodrigc xfsidbg_xbuf_real(blip->bli_buf, 1); 3627153323Srodrigc return; 3628153323Srodrigc } 3629153323Srodrigc kdb_printf("buf 0x%p recur %d refcount %d flags:", 3630153323Srodrigc blip->bli_buf, blip->bli_recur, 3631153323Srodrigc atomic_read(&blip->bli_refcount)); 3632153323Srodrigc printflags(blip->bli_flags, bli_flags, NULL); 3633153323Srodrigc kdb_printf("\n"); 3634153323Srodrigc kdb_printf("size %d blkno 0x%Lx len 0x%x map size %d map 0x%p\n", 3635153323Srodrigc blip->bli_format.blf_size, blip->bli_format.blf_blkno, 3636153323Srodrigc (uint) blip->bli_format.blf_len, blip->bli_format.blf_map_size, 3637153323Srodrigc &(blip->bli_format.blf_data_map[0])); 3638153323Srodrigc kdb_printf("blf flags: "); 3639153323Srodrigc printflags((uint)blip->bli_format.blf_flags, blf_flags, NULL); 3640153323Srodrigc#ifdef XFS_TRANS_DEBUG 3641153323Srodrigc kdb_printf("orig 0x%x logged 0x%x", 3642153323Srodrigc blip->bli_orig, blip->bli_logged); 3643153323Srodrigc#endif 3644153323Srodrigc kdb_printf("\n"); 3645153323Srodrigc} 3646153323Srodrigc 3647153323Srodrigc#ifdef XFS_BMAP_TRACE 3648153323Srodrigc/* 3649153323Srodrigc * Convert an external extent descriptor to internal form. 3650153323Srodrigc */ 3651153323Srodrigcstatic void 3652153323Srodrigcxfs_convert_extent(xfs_bmbt_rec_32_t *rp, xfs_dfiloff_t *op, xfs_dfsbno_t *sp, 3653153323Srodrigc xfs_dfilblks_t *cp, int *fp) 3654153323Srodrigc{ 3655153323Srodrigc xfs_dfiloff_t o; 3656153323Srodrigc xfs_dfsbno_t s; 3657153323Srodrigc xfs_dfilblks_t c; 3658153323Srodrigc int flag; 3659153323Srodrigc 3660153323Srodrigc flag = (((xfs_dfiloff_t)rp->l0) >> 31) & 1; 3661153323Srodrigc o = ((((xfs_dfiloff_t)rp->l0) & 0x7fffffff) << 23) | 3662153323Srodrigc (((xfs_dfiloff_t)rp->l1) >> 9); 3663153323Srodrigc s = (((xfs_dfsbno_t)(rp->l1 & 0x000001ff)) << 43) | 3664153323Srodrigc (((xfs_dfsbno_t)rp->l2) << 11) | 3665153323Srodrigc (((xfs_dfsbno_t)rp->l3) >> 21); 3666153323Srodrigc c = (xfs_dfilblks_t)(rp->l3 & 0x001fffff); 3667153323Srodrigc *op = o; 3668153323Srodrigc *sp = s; 3669153323Srodrigc *cp = c; 3670153323Srodrigc *fp = flag; 3671153323Srodrigc} 3672153323Srodrigc#endif 3673153323Srodrigc 3674153323Srodrigc#ifdef XFS_RW_TRACE 3675153323Srodrigc/* 3676153323Srodrigc * Print itrunc entry trace. 3677153323Srodrigc */ 3678153323Srodrigcstatic void 3679153323Srodrigcxfs_ctrunc_trace_entry(ktrace_entry_t *ktep) 3680153323Srodrigc{ 3681153323Srodrigc qprintf("ip 0x%p cpu %ld\n", 3682153323Srodrigc (xfs_inode_t *)(unsigned long)ktep->val[1], (long)ktep->val[2]); 3683153323Srodrigc} 3684153323Srodrigc#endif 3685153323Srodrigc 3686153323Srodrigc/* 3687153323Srodrigc * Print an xfs_da_state_path structure. 3688153323Srodrigc */ 3689153323Srodrigcstatic void 3690153323Srodrigcxfs_dastate_path(xfs_da_state_path_t *p) 3691153323Srodrigc{ 3692153323Srodrigc int i; 3693153323Srodrigc 3694153323Srodrigc kdb_printf("active %d\n", p->active); 3695153323Srodrigc for (i = 0; i < XFS_DA_NODE_MAXDEPTH; i++) { 3696153323Srodrigc kdb_printf(" blk %d bp 0x%p blkno 0x%x", 3697153323Srodrigc i, p->blk[i].bp, p->blk[i].blkno); 3698153323Srodrigc kdb_printf(" index %d hashval 0x%x ", 3699153323Srodrigc p->blk[i].index, (uint_t)p->blk[i].hashval); 3700153323Srodrigc switch(p->blk[i].magic) { 3701153323Srodrigc case XFS_DA_NODE_MAGIC: kdb_printf("NODE\n"); break; 3702153323Srodrigc case XFS_DIR_LEAF_MAGIC: kdb_printf("DIR\n"); break; 3703153323Srodrigc case XFS_ATTR_LEAF_MAGIC: kdb_printf("ATTR\n"); break; 3704153323Srodrigc case XFS_DIR2_LEAFN_MAGIC: kdb_printf("DIR2\n"); break; 3705153323Srodrigc default: kdb_printf("type ?\n"); break; 3706153323Srodrigc } 3707153323Srodrigc } 3708153323Srodrigc} 3709153323Srodrigc 3710153323Srodrigc#ifdef XFS_DIR_TRACE 3711153323Srodrigc/* 3712153323Srodrigc * Print a xfs directory trace buffer entry. 3713153323Srodrigc */ 3714153323Srodrigcstatic int 3715153323Srodrigcxfs_dir_trace_entry(ktrace_entry_t *ktep) 3716153323Srodrigc{ 3717153323Srodrigc xfs_mount_t *mp; 3718153323Srodrigc __uint32_t hash; 3719153323Srodrigc xfs_off_t cookie; 3720153323Srodrigc 3721153323Srodrigc if (!ktep->val[0] || !ktep->val[1]) 3722153323Srodrigc return 0; 3723153323Srodrigc 3724153323Srodrigc mp = (xfs_mount_t *)ktep->val[3]; 3725153323Srodrigc cookie = (__psunsigned_t)ktep->val[4]; 3726153323Srodrigc cookie <<= 32; 3727153323Srodrigc cookie |= (__psunsigned_t)ktep->val[5]; 3728153323Srodrigc qprintf("%s -- dp=0x%p b/e/h=%ld/%ld/0x%08lx resid=0x%lx ", 3729153323Srodrigc (char *)ktep->val[1], 3730153323Srodrigc (xfs_inode_t *)ktep->val[2], 3731153323Srodrigc (long)XFS_DA_COOKIE_BNO(mp, cookie), 3732153323Srodrigc (long)XFS_DA_COOKIE_ENTRY(mp, cookie), 3733153323Srodrigc (unsigned long)XFS_DA_COOKIE_HASH(mp, cookie), 3734153323Srodrigc (long)ktep->val[6]); 3735153323Srodrigc 3736153323Srodrigc switch ((__psint_t)ktep->val[0]) { 3737153323Srodrigc case XFS_DIR_KTRACE_G_DU: 3738153323Srodrigc break; 3739153323Srodrigc case XFS_DIR_KTRACE_G_DUB: 3740153323Srodrigc qprintf("bno=%ld", (long)ktep->val[7]); 3741153323Srodrigc break; 3742153323Srodrigc case XFS_DIR_KTRACE_G_DUN: 3743153323Srodrigc qprintf("forw=%ld, cnt=%ld, 0x%08lx - 0x%08lx", 3744153323Srodrigc (long)ktep->val[7], 3745153323Srodrigc (long)ktep->val[8], 3746153323Srodrigc (unsigned long)ktep->val[9], 3747153323Srodrigc (unsigned long)ktep->val[10]); 3748153323Srodrigc break; 3749153323Srodrigc case XFS_DIR_KTRACE_G_DUL: 3750153323Srodrigc qprintf("forw=%ld, cnt=%ld, 0x%08lx - 0x%08lx", 3751153323Srodrigc (long)ktep->val[7], 3752153323Srodrigc (long)ktep->val[8], 3753153323Srodrigc (unsigned long)ktep->val[9], 3754153323Srodrigc (unsigned long)ktep->val[10]); 3755153323Srodrigc break; 3756153323Srodrigc case XFS_DIR_KTRACE_G_DUE: 3757153323Srodrigc qprintf("entry hashval 0x%08lx", (unsigned long)ktep->val[7]); 3758153323Srodrigc break; 3759153323Srodrigc case XFS_DIR_KTRACE_G_DUC: 3760153323Srodrigc cookie = (__psunsigned_t)ktep->val[7]; 3761153323Srodrigc cookie <<= 32; 3762153323Srodrigc cookie |= (__psunsigned_t)ktep->val[8]; 3763153323Srodrigc hash = XFS_DA_COOKIE_HASH(mp, cookie); 3764153323Srodrigc qprintf("b/e/h=%ld/%ld/0x%08x", 3765153323Srodrigc (long)XFS_DA_COOKIE_BNO(mp, cookie), 3766153323Srodrigc (long)XFS_DA_COOKIE_ENTRY(mp, cookie), 3767153323Srodrigc hash); 3768153323Srodrigc break; 3769153323Srodrigc default: 3770153323Srodrigc qprintf("unknown dir trace record format"); 3771153323Srodrigc break; 3772153323Srodrigc } 3773153323Srodrigc return 1; 3774153323Srodrigc} 3775153323Srodrigc#endif 3776153323Srodrigc 3777153323Srodrigc#ifdef XFS_DIR2_TRACE 3778153323Srodrigc/* 3779153323Srodrigc * Print a xfs v2 directory trace buffer entry. 3780153323Srodrigc */ 3781153323Srodrigcstatic int 3782153323Srodrigcxfs_dir2_trace_entry(ktrace_entry_t *ktep) 3783153323Srodrigc{ 3784153323Srodrigc char *cp; 3785153323Srodrigc int i; 3786153323Srodrigc int len; 3787153323Srodrigc 3788153323Srodrigc if (!ktep->val[0]) 3789153323Srodrigc return 0; 3790153323Srodrigc cp = (char *)&ktep->val[10]; 3791153323Srodrigc qprintf("%s: '", (char *)ktep->val[1]); 3792153323Srodrigc len = min((__psint_t)ktep->val[9], (__psint_t)sizeof(ktep->val[10])*6); 3793153323Srodrigc for (i = 0; i < len; i++) 3794153323Srodrigc qprintf("%c", cp[i]); 3795153323Srodrigc qprintf("'(%ld)", (long)ktep->val[9]); 3796153323Srodrigc if ((__psunsigned_t)ktep->val[0] != XFS_DIR2_KTRACE_ARGS_BIBII) 3797153323Srodrigc qprintf(" hashval 0x%llx inumber %lld dp 0x%p tp 0x%p check %d", 3798153323Srodrigc (__uint64_t)(unsigned long)ktep->val[2], 3799153323Srodrigc (__int64_t)(unsigned long)ktep->val[3], 3800153323Srodrigc ktep->val[4], ktep->val[5], 3801153323Srodrigc (int)(__psint_t)ktep->val[6]); 3802153323Srodrigc switch ((__psunsigned_t)ktep->val[0]) { 3803153323Srodrigc case XFS_DIR2_KTRACE_ARGS: 3804153323Srodrigc break; 3805153323Srodrigc case XFS_DIR2_KTRACE_ARGS_B: 3806153323Srodrigc qprintf(" bp 0x%p", ktep->val[7]); 3807153323Srodrigc break; 3808153323Srodrigc case XFS_DIR2_KTRACE_ARGS_BB: 3809153323Srodrigc qprintf(" lbp 0x%p dbp 0x%p", ktep->val[7], ktep->val[8]); 3810153323Srodrigc break; 3811153323Srodrigc case XFS_DIR2_KTRACE_ARGS_BIBII: 3812153323Srodrigc qprintf(" dp 0x%p tp 0x%p srcbp 0x%p srci %d dstbp 0x%p dsti %d count %d", 3813153323Srodrigc ktep->val[2], ktep->val[3], ktep->val[4], 3814153323Srodrigc (int)(__psint_t)ktep->val[5], ktep->val[6], 3815153323Srodrigc (int)(__psint_t)ktep->val[7], 3816153323Srodrigc (int)(__psint_t)ktep->val[8]); 3817153323Srodrigc break; 3818153323Srodrigc case XFS_DIR2_KTRACE_ARGS_DB: 3819153323Srodrigc qprintf(" db 0x%x bp 0x%p", 3820153323Srodrigc (xfs_dir2_db_t)(unsigned long)ktep->val[7], 3821153323Srodrigc ktep->val[8]); 3822153323Srodrigc break; 3823153323Srodrigc case XFS_DIR2_KTRACE_ARGS_I: 3824153323Srodrigc qprintf(" i 0x%lx", (unsigned long)ktep->val[7]); 3825153323Srodrigc break; 3826153323Srodrigc case XFS_DIR2_KTRACE_ARGS_S: 3827153323Srodrigc qprintf(" s 0x%x", (int)(__psint_t)ktep->val[7]); 3828153323Srodrigc break; 3829153323Srodrigc case XFS_DIR2_KTRACE_ARGS_SB: 3830153323Srodrigc qprintf(" s 0x%x bp 0x%p", (int)(__psint_t)ktep->val[7], 3831153323Srodrigc ktep->val[8]); 3832153323Srodrigc break; 3833153323Srodrigc default: 3834153323Srodrigc qprintf("unknown dirv2 trace record format"); 3835153323Srodrigc break; 3836153323Srodrigc } 3837153323Srodrigc return 1; 3838153323Srodrigc} 3839153323Srodrigc#endif 3840153323Srodrigc 3841153323Srodrigc/* 3842153323Srodrigc * Print an efd log item. 3843153323Srodrigc */ 3844153323Srodrigcstatic void 3845153323Srodrigcxfs_efd_item_print(xfs_efd_log_item_t *efdp, int summary) 3846153323Srodrigc{ 3847153323Srodrigc int i; 3848153323Srodrigc xfs_extent_t *ep; 3849153323Srodrigc 3850153323Srodrigc if (summary) { 3851153323Srodrigc kdb_printf("Extent Free Done: ID 0x%Lx nextents %d (at 0x%p)\n", 3852153323Srodrigc efdp->efd_format.efd_efi_id, 3853153323Srodrigc efdp->efd_format.efd_nextents, efdp); 3854153323Srodrigc return; 3855153323Srodrigc } 3856153323Srodrigc kdb_printf("size %d nextents %d next extent %d efip 0x%p\n", 3857153323Srodrigc efdp->efd_format.efd_size, efdp->efd_format.efd_nextents, 3858153323Srodrigc efdp->efd_next_extent, efdp->efd_efip); 3859153323Srodrigc kdb_printf("efi_id 0x%Lx\n", efdp->efd_format.efd_efi_id); 3860153323Srodrigc kdb_printf("efd extents:\n"); 3861153323Srodrigc ep = &(efdp->efd_format.efd_extents[0]); 3862153323Srodrigc for (i = 0; i < efdp->efd_next_extent; i++, ep++) { 3863153323Srodrigc kdb_printf(" block %Lx len %d\n", 3864153323Srodrigc ep->ext_start, ep->ext_len); 3865153323Srodrigc } 3866153323Srodrigc} 3867153323Srodrigc 3868153323Srodrigc/* 3869153323Srodrigc * Print an efi log item. 3870153323Srodrigc */ 3871153323Srodrigcstatic void 3872153323Srodrigcxfs_efi_item_print(xfs_efi_log_item_t *efip, int summary) 3873153323Srodrigc{ 3874153323Srodrigc int i; 3875153323Srodrigc xfs_extent_t *ep; 3876153323Srodrigc static char *efi_flags[] = { 3877153323Srodrigc "recovered", /* 0x1 */ 3878153323Srodrigc "committed", /* 0x2 */ 3879153323Srodrigc "cancelled", /* 0x4 */ 3880159451Srodrigc NULL, 3881153323Srodrigc }; 3882153323Srodrigc 3883153323Srodrigc if (summary) { 3884153323Srodrigc kdb_printf("Extent Free Intention: ID 0x%Lx nextents %d (at 0x%p)\n", 3885153323Srodrigc efip->efi_format.efi_id, 3886153323Srodrigc efip->efi_format.efi_nextents, efip); 3887153323Srodrigc return; 3888153323Srodrigc } 3889153323Srodrigc kdb_printf("size %d nextents %d next extent %d\n", 3890153323Srodrigc efip->efi_format.efi_size, efip->efi_format.efi_nextents, 3891153323Srodrigc efip->efi_next_extent); 3892153323Srodrigc kdb_printf("id %Lx", efip->efi_format.efi_id); 3893153323Srodrigc printflags(efip->efi_flags, efi_flags, "flags :"); 3894153323Srodrigc kdb_printf("\n"); 3895153323Srodrigc kdb_printf("efi extents:\n"); 3896153323Srodrigc ep = &(efip->efi_format.efi_extents[0]); 3897153323Srodrigc for (i = 0; i < efip->efi_next_extent; i++, ep++) { 3898153323Srodrigc kdb_printf(" block %Lx len %d\n", 3899153323Srodrigc ep->ext_start, ep->ext_len); 3900153323Srodrigc } 3901153323Srodrigc} 3902153323Srodrigc 3903153323Srodrigc/* 3904153323Srodrigc * Format inode "format" into a static buffer & return it. 3905153323Srodrigc */ 3906153323Srodrigcstatic char * 3907153323Srodrigcxfs_fmtformat(xfs_dinode_fmt_t f) 3908153323Srodrigc{ 3909153323Srodrigc static char *t[] = { 3910153323Srodrigc "dev", 3911153323Srodrigc "local", 3912153323Srodrigc "extents", 3913153323Srodrigc "btree", 3914153323Srodrigc "uuid" 3915153323Srodrigc }; 3916153323Srodrigc 3917153323Srodrigc return t[f]; 3918153323Srodrigc} 3919153323Srodrigc 3920153323Srodrigc/* 3921153323Srodrigc * Format fsblock number into a static buffer & return it. 3922153323Srodrigc */ 3923159451Srodrigcchar * 3924153323Srodrigcxfs_fmtfsblock(xfs_fsblock_t bno, xfs_mount_t *mp) 3925153323Srodrigc{ 3926153323Srodrigc static char rval[50]; 3927153323Srodrigc 3928153323Srodrigc if (bno == NULLFSBLOCK) 3929153323Srodrigc sprintf(rval, "NULLFSBLOCK"); 3930153323Srodrigc else if (ISNULLSTARTBLOCK(bno)) 3931153323Srodrigc sprintf(rval, "NULLSTARTBLOCK(%Ld)", STARTBLOCKVAL(bno)); 3932153323Srodrigc else if (mp) 3933153323Srodrigc sprintf(rval, "%Ld[%x:%x]", (xfs_dfsbno_t)bno, 3934153323Srodrigc XFS_FSB_TO_AGNO(mp, bno), XFS_FSB_TO_AGBNO(mp, bno)); 3935153323Srodrigc else 3936153323Srodrigc sprintf(rval, "%Ld", (xfs_dfsbno_t)bno); 3937153323Srodrigc return rval; 3938153323Srodrigc} 3939153323Srodrigc 3940153323Srodrigc/* 3941153323Srodrigc * Format inode number into a static buffer & return it. 3942153323Srodrigc */ 3943153323Srodrigcstatic char * 3944153323Srodrigcxfs_fmtino(xfs_ino_t ino, xfs_mount_t *mp) 3945153323Srodrigc{ 3946153323Srodrigc static char rval[50]; 3947153323Srodrigc 3948153323Srodrigc if (mp) 3949153323Srodrigc sprintf(rval, "%llu[%x:%x:%x]", 3950153323Srodrigc (unsigned long long) ino, 3951153323Srodrigc XFS_INO_TO_AGNO(mp, ino), 3952153323Srodrigc XFS_INO_TO_AGBNO(mp, ino), 3953153323Srodrigc XFS_INO_TO_OFFSET(mp, ino)); 3954153323Srodrigc else 3955153323Srodrigc sprintf(rval, "%llu", (unsigned long long) ino); 3956153323Srodrigc return rval; 3957153323Srodrigc} 3958153323Srodrigc 3959153323Srodrigc/* 3960153323Srodrigc * Format an lsn for printing into a static buffer & return it. 3961153323Srodrigc */ 3962153323Srodrigcstatic char * 3963153323Srodrigcxfs_fmtlsn(xfs_lsn_t *lsnp) 3964153323Srodrigc{ 3965153323Srodrigc uint *wordp; 3966153323Srodrigc uint *word2p; 3967153323Srodrigc static char buf[20]; 3968153323Srodrigc 3969153323Srodrigc wordp = (uint *)lsnp; 3970153323Srodrigc word2p = wordp++; 3971153323Srodrigc sprintf(buf, "[%u:%u]", *wordp, *word2p); 3972153323Srodrigc 3973153323Srodrigc return buf; 3974153323Srodrigc} 3975153323Srodrigc 3976153323Srodrigc/* 3977153323Srodrigc * Format file mode into a static buffer & return it. 3978153323Srodrigc */ 3979153323Srodrigcstatic char * 3980153323Srodrigcxfs_fmtmode(int m) 3981153323Srodrigc{ 3982153323Srodrigc static char rval[16]; 3983153323Srodrigc 3984153323Srodrigc sprintf(rval, "%c%c%c%c%c%c%c%c%c%c%c%c%c", 3985153323Srodrigc "?fc?dxb?r?l?S?m?"[(m & S_IFMT) >> 12], 3986153323Srodrigc m & S_ISUID ? 'u' : '-', 3987153323Srodrigc m & S_ISGID ? 'g' : '-', 3988153323Srodrigc m & S_ISVTX ? 'v' : '-', 3989153323Srodrigc m & S_IRUSR ? 'r' : '-', 3990153323Srodrigc m & S_IWUSR ? 'w' : '-', 3991153323Srodrigc m & S_IXUSR ? 'x' : '-', 3992153323Srodrigc m & S_IRGRP ? 'r' : '-', 3993153323Srodrigc m & S_IWGRP ? 'w' : '-', 3994153323Srodrigc m & S_IXGRP ? 'x' : '-', 3995153323Srodrigc m & S_IROTH ? 'r' : '-', 3996153323Srodrigc m & S_IWOTH ? 'w' : '-', 3997153323Srodrigc m & S_IXOTH ? 'x' : '-'); 3998153323Srodrigc return rval; 3999153323Srodrigc} 4000153323Srodrigc 4001153323Srodrigc/* 4002153323Srodrigc * Format a size into a static buffer & return it. 4003153323Srodrigc */ 4004153323Srodrigcstatic char * 4005153323Srodrigcxfs_fmtsize(size_t i) 4006153323Srodrigc{ 4007153323Srodrigc static char rval[20]; 4008153323Srodrigc 4009153323Srodrigc /* size_t is 32 bits in 32-bit kernel, 64 bits in 64-bit kernel */ 4010153323Srodrigc sprintf(rval, "0x%lx", (unsigned long) i); 4011153323Srodrigc return rval; 4012153323Srodrigc} 4013153323Srodrigc 4014153323Srodrigc/* 4015153323Srodrigc * Format a uuid into a static buffer & return it. 4016153323Srodrigc */ 4017153323Srodrigcstatic char * 4018153323Srodrigcxfs_fmtuuid(uuid_t *uu) 4019153323Srodrigc{ 4020153323Srodrigc static char rval[40]; 4021153323Srodrigc char *o = rval; 4022153323Srodrigc char *i = (unsigned char*)uu; 4023153323Srodrigc int b; 4024153323Srodrigc 4025153323Srodrigc for (b=0;b<16;b++) { 4026153323Srodrigc o+=sprintf(o, "%02x", *i++); 4027153323Srodrigc if (b==3||b==5||b==7||b==9) *o++='-'; 4028153323Srodrigc } 4029153323Srodrigc *o='\0'; 4030153323Srodrigc 4031153323Srodrigc return rval; 4032153323Srodrigc} 4033153323Srodrigc 4034153323Srodrigc/* 4035153323Srodrigc * Print an inode log item. 4036153323Srodrigc */ 4037153323Srodrigcstatic void 4038153323Srodrigcxfs_inode_item_print(xfs_inode_log_item_t *ilip, int summary) 4039153323Srodrigc{ 4040153323Srodrigc static char *ili_flags[] = { 4041153323Srodrigc "hold", /* 0x1 */ 4042153323Srodrigc "iolock excl", /* 0x2 */ 4043153323Srodrigc "iolock shrd", /* 0x4 */ 4044159451Srodrigc NULL 4045153323Srodrigc }; 4046153323Srodrigc static char *ilf_fields[] = { 4047153323Srodrigc "core", /* 0x001 */ 4048153323Srodrigc "ddata", /* 0x002 */ 4049153323Srodrigc "dexts", /* 0x004 */ 4050153323Srodrigc "dbroot", /* 0x008 */ 4051153323Srodrigc "dev", /* 0x010 */ 4052153323Srodrigc "uuid", /* 0x020 */ 4053153323Srodrigc "adata", /* 0x040 */ 4054153323Srodrigc "aext", /* 0x080 */ 4055153323Srodrigc "abroot", /* 0x100 */ 4056159451Srodrigc NULL 4057153323Srodrigc }; 4058153323Srodrigc 4059153323Srodrigc if (summary) { 4060153323Srodrigc kdb_printf("inode 0x%p logged %d ", 4061153323Srodrigc ilip->ili_inode, ilip->ili_logged); 4062153323Srodrigc printflags(ilip->ili_flags, ili_flags, "flags:"); 4063153323Srodrigc printflags(ilip->ili_format.ilf_fields, ilf_fields, "format:"); 4064153323Srodrigc printflags(ilip->ili_last_fields, ilf_fields, "lastfield:"); 4065153323Srodrigc kdb_printf("\n"); 4066153323Srodrigc return; 4067153323Srodrigc } 4068153323Srodrigc kdb_printf("inode 0x%p ino 0x%llu pushbuf %d logged %d flags: ", 4069153323Srodrigc ilip->ili_inode, (unsigned long long) ilip->ili_format.ilf_ino, 4070153323Srodrigc ilip->ili_pushbuf_flag, ilip->ili_logged); 4071153323Srodrigc printflags(ilip->ili_flags, ili_flags, NULL); 4072153323Srodrigc kdb_printf("\n"); 4073153323Srodrigc kdb_printf("ilock recur %d iolock recur %d ext buf 0x%p\n", 4074153323Srodrigc ilip->ili_ilock_recur, ilip->ili_iolock_recur, 4075153323Srodrigc ilip->ili_extents_buf); 4076153323Srodrigc#ifdef XFS_TRANS_DEBUG 4077153323Srodrigc kdb_printf("root bytes %d root orig 0x%x\n", 4078153323Srodrigc ilip->ili_root_size, ilip->ili_orig_root); 4079153323Srodrigc#endif 4080153323Srodrigc kdb_printf("size %d ", ilip->ili_format.ilf_size); 4081153323Srodrigc printflags(ilip->ili_format.ilf_fields, ilf_fields, "fields:"); 4082153323Srodrigc printflags(ilip->ili_last_fields, ilf_fields, " last fields: "); 4083153323Srodrigc kdb_printf("\n"); 4084153323Srodrigc kdb_printf(" flush lsn %s last lsn %s\n", 4085153323Srodrigc xfs_fmtlsn(&(ilip->ili_flush_lsn)), 4086153323Srodrigc xfs_fmtlsn(&(ilip->ili_last_lsn))); 4087153323Srodrigc kdb_printf("dsize %d, asize %d, rdev 0x%x\n", 4088153323Srodrigc ilip->ili_format.ilf_dsize, 4089153323Srodrigc ilip->ili_format.ilf_asize, 4090153323Srodrigc ilip->ili_format.ilf_u.ilfu_rdev); 4091153323Srodrigc kdb_printf("blkno 0x%Lx len 0x%x boffset 0x%x\n", 4092153323Srodrigc ilip->ili_format.ilf_blkno, 4093153323Srodrigc ilip->ili_format.ilf_len, 4094153323Srodrigc ilip->ili_format.ilf_boffset); 4095153323Srodrigc} 4096153323Srodrigc 4097153323Srodrigc/* 4098153323Srodrigc * Print a dquot log item. 4099153323Srodrigc */ 4100153323Srodrigc/* ARGSUSED */ 4101153323Srodrigcstatic void 4102153323Srodrigcxfs_dquot_item_print(xfs_dq_logitem_t *lip, int summary) 4103153323Srodrigc{ 4104153323Srodrigc kdb_printf("dquot 0x%p\n", 4105153323Srodrigc lip->qli_dquot); 4106153323Srodrigc 4107153323Srodrigc} 4108153323Srodrigc 4109153323Srodrigc/* 4110153323Srodrigc * Print a quotaoff log item. 4111153323Srodrigc */ 4112153323Srodrigc/* ARGSUSED */ 4113153323Srodrigcstatic void 4114153323Srodrigcxfs_qoff_item_print(xfs_qoff_logitem_t *lip, int summary) 4115153323Srodrigc{ 4116153323Srodrigc kdb_printf("start qoff item 0x%p flags 0x%x\n", 4117153323Srodrigc lip->qql_start_lip, lip->qql_format.qf_flags); 4118153323Srodrigc 4119153323Srodrigc} 4120153323Srodrigc 4121153323Srodrigc/* 4122153323Srodrigc * Print buffer full of inodes. 4123153323Srodrigc */ 4124153323Srodrigcstatic void 4125153323Srodrigcxfs_inodebuf(xfs_buf_t *bp) 4126153323Srodrigc{ 4127153323Srodrigc xfs_dinode_t *di; 4128159451Srodrigc xfs_dinode_core_t dic; 4129153323Srodrigc int n, i; 4130153323Srodrigc 4131153323Srodrigc n = XFS_BUF_COUNT(bp) >> 8; 4132153323Srodrigc for (i = 0; i < n; i++) { 4133153323Srodrigc di = (xfs_dinode_t *)xfs_buf_offset(bp, 4134153323Srodrigc i * 256); 4135159451Srodrigc 4136159451Srodrigc xfs_xlate_dinode_core((xfs_caddr_t)&di->di_core, &dic, 1); 4137159451Srodrigc xfs_prdinode_core(&dic); 4138159451Srodrigc kdb_printf("next_unlinked 0x%x u@0x%p\n", 4139159451Srodrigc INT_GET(di->di_next_unlinked, ARCH_CONVERT), 4140159451Srodrigc &di->di_u); 4141153323Srodrigc } 4142153323Srodrigc} 4143153323Srodrigc 4144153323Srodrigc#ifdef XFS_RW_TRACE 4145153323Srodrigc/* 4146153323Srodrigc * Print iomap entry trace. 4147153323Srodrigc */ 4148153323Srodrigcstatic void 4149153323Srodrigcxfs_iomap_enter_trace_entry(ktrace_entry_t *ktep) 4150153323Srodrigc{ 4151153323Srodrigc qprintf("ip 0x%p size 0x%x%x offset 0x%x%x count 0x%x\n", 4152153323Srodrigc ktep->val[1], 4153153323Srodrigc (unsigned int)(long)ktep->val[2], 4154153323Srodrigc (unsigned int)(long)ktep->val[3], 4155153323Srodrigc (unsigned int)(long)ktep->val[4], 4156153323Srodrigc (unsigned int)(long)ktep->val[5], 4157153323Srodrigc (unsigned int)(long)ktep->val[6]); 4158159451Srodrigc qprintf("io new size 0x%x%x pid=%d\n", 4159153323Srodrigc (unsigned int)(long)ktep->val[7], 4160159451Srodrigc (unsigned int)(long)ktep->val[8], 4161159451Srodrigc (unsigned int)(long)ktep->val[9]); 4162153323Srodrigc} 4163153323Srodrigc 4164153323Srodrigc/* 4165153323Srodrigc * Print iomap map trace. 4166153323Srodrigc */ 4167153323Srodrigcstatic void 4168153323Srodrigcxfs_iomap_map_trace_entry(ktrace_entry_t *ktep) 4169153323Srodrigc{ 4170153323Srodrigc static char *bmapi_flags[] = { 4171153323Srodrigc "read", /* BMAPI_READ */ 4172153323Srodrigc "write", /* BMAPI_WRITE */ 4173153323Srodrigc "allocate", /* BMAPI_ALLOCATE */ 4174153323Srodrigc "unwritten", /* BMAPI_UNWRITTEN */ 4175153323Srodrigc "ignstate", /* BMAPI_IGNSTATE */ 4176153323Srodrigc "direct", /* BMAPI_DIRECT */ 4177153323Srodrigc "mmap", /* BMAPI_MMAP */ 4178153323Srodrigc "sync", /* BMAPI_SYNC */ 4179153323Srodrigc "trylock", /* BMAPI_TRYLOCK */ 4180153323Srodrigc "device", /* BMAPI_DEVICE */ 4181159451Srodrigc NULL 4182153323Srodrigc }; 4183153323Srodrigc 4184153323Srodrigc qprintf("ip 0x%p size 0x%x%x offset 0x%x%x count 0x%x\n", 4185153323Srodrigc ktep->val[1], 4186153323Srodrigc (unsigned int)(long)ktep->val[2], 4187153323Srodrigc (unsigned int)(long)ktep->val[3], 4188153323Srodrigc (unsigned int)(long)ktep->val[4], 4189153323Srodrigc (unsigned int)(long)ktep->val[5], 4190153323Srodrigc (unsigned int)(long)ktep->val[6]); 4191153323Srodrigc printflags((__psint_t)ktep->val[7], bmapi_flags, "bmapi flags"); 4192153323Srodrigc qprintf("iomap off 0x%x%x delta 0x%x bsize 0x%x bno 0x%x\n", 4193153323Srodrigc (unsigned int)(long)ktep->val[8], 4194153323Srodrigc (unsigned int)(long)ktep->val[9], 4195153323Srodrigc (unsigned int)(long)ktep->val[10], 4196153323Srodrigc (unsigned int)(long)ktep->val[11], 4197153323Srodrigc (unsigned int)(long)ktep->val[12]); 4198153323Srodrigc qprintf("imap off 0x%x count 0x%x block 0x%x\n", 4199153323Srodrigc (unsigned int)(long)ktep->val[13], 4200153323Srodrigc (unsigned int)(long)ktep->val[14], 4201153323Srodrigc (unsigned int)(long)ktep->val[15]); 4202153323Srodrigc} 4203153323Srodrigc 4204153323Srodrigc/* 4205153323Srodrigc * Print itrunc entry trace. 4206153323Srodrigc */ 4207153323Srodrigcstatic void 4208153323Srodrigcxfs_itrunc_trace_entry(ktrace_entry_t *ktep) 4209153323Srodrigc{ 4210153323Srodrigc qprintf("ip 0x%p size 0x%x%x flag %ld new size 0x%x%x\n", 4211153323Srodrigc ktep->val[1], 4212153323Srodrigc (unsigned int)(long)ktep->val[2], 4213153323Srodrigc (unsigned int)(long)ktep->val[3], 4214153323Srodrigc (long)ktep->val[4], 4215153323Srodrigc (unsigned int)(long)ktep->val[5], 4216153323Srodrigc (unsigned int)(long)ktep->val[6]); 4217159451Srodrigc qprintf("toss start 0x%x%x toss finish 0x%x%x cpu id %ld pid %d\n", 4218153323Srodrigc (unsigned int)(long)ktep->val[7], 4219153323Srodrigc (unsigned int)(long)ktep->val[8], 4220153323Srodrigc (unsigned int)(long)ktep->val[9], 4221153323Srodrigc (unsigned int)(long)ktep->val[10], 4222159451Srodrigc (long)ktep->val[11], 4223159451Srodrigc (unsigned int)(long)ktep->val[12]); 4224153323Srodrigc} 4225153323Srodrigc 4226153323Srodrigc/* 4227153323Srodrigc * Print bunmap entry trace. 4228153323Srodrigc */ 4229153323Srodrigcstatic void 4230153323Srodrigcxfs_bunmap_trace_entry(ktrace_entry_t *ktep) 4231153323Srodrigc{ 4232153323Srodrigc static char *bunmapi_flags[] = { 4233153323Srodrigc "write", /* 0x01 */ 4234153323Srodrigc "delay", /* 0x02 */ 4235153323Srodrigc "entire", /* 0x04 */ 4236153323Srodrigc "metadata", /* 0x08 */ 4237153323Srodrigc "exact", /* 0x10 */ 4238153323Srodrigc "attrfork", /* 0x20 */ 4239153323Srodrigc "async", /* 0x40 */ 4240153323Srodrigc "rsvblocks", /* 0x80 */ 4241159451Srodrigc NULL 4242153323Srodrigc }; 4243153323Srodrigc 4244153323Srodrigc qprintf("ip 0x%p size 0x%x%x bno 0x%x%x len 0x%x cpu id %ld\n", 4245153323Srodrigc ktep->val[1], 4246153323Srodrigc (unsigned int)(long)ktep->val[2], 4247153323Srodrigc (unsigned int)(long)ktep->val[3], 4248153323Srodrigc (unsigned int)(long)ktep->val[4], 4249153323Srodrigc (unsigned int)(long)ktep->val[5], 4250153323Srodrigc (unsigned int)(long)ktep->val[6], 4251153323Srodrigc (long)ktep->val[8]); 4252159451Srodrigc qprintf("ra 0x%p pid %d ", ktep->val[9], (int)(long)ktep->val[10]); 4253153323Srodrigc printflags((__psint_t)ktep->val[7], bunmapi_flags, "flags"); 4254153323Srodrigc} 4255153323Srodrigc 4256153323Srodrigc/* 4257153323Srodrigc * Print inval_cached_pages entry trace. 4258153323Srodrigc */ 4259153323Srodrigcstatic void 4260153323Srodrigcxfs_inval_cached_trace_entry(ktrace_entry_t *ktep) 4261153323Srodrigc{ 4262159451Srodrigc qprintf("ip 0x%p offset 0x%x%x len 0x%x%x first 0x%x%x last 0x%x%x pid %d\n", 4263153323Srodrigc ktep->val[1], 4264153323Srodrigc (unsigned int)(long)ktep->val[2], 4265153323Srodrigc (unsigned int)(long)ktep->val[3], 4266153323Srodrigc (unsigned int)(long)ktep->val[4], 4267153323Srodrigc (unsigned int)(long)ktep->val[5], 4268153323Srodrigc (unsigned int)(long)ktep->val[6], 4269153323Srodrigc (unsigned int)(long)ktep->val[7], 4270153323Srodrigc (unsigned int)(long)ktep->val[8], 4271159451Srodrigc (unsigned int)(long)ktep->val[9], 4272159451Srodrigc (unsigned int)(long)ktep->val[10]); 4273153323Srodrigc} 4274153323Srodrigc#endif 4275153323Srodrigc 4276153323Srodrigc 4277153323Srodrigc/* 4278153323Srodrigc * Print disk inode core. 4279153323Srodrigc */ 4280153323Srodrigcstatic void 4281159451Srodrigcxfs_prdinode_core(xfs_dinode_core_t *dip) 4282153323Srodrigc{ 4283153323Srodrigc static char *diflags[] = { 4284153323Srodrigc "realtime", /* XFS_DIFLAG_REALTIME */ 4285153323Srodrigc "prealloc", /* XFS_DIFLAG_PREALLOC */ 4286153323Srodrigc "newrtbm", /* XFS_DIFLAG_NEWRTBM */ 4287153323Srodrigc "immutable", /* XFS_DIFLAG_IMMUTABLE */ 4288153323Srodrigc "append", /* XFS_DIFLAG_APPEND */ 4289153323Srodrigc "sync", /* XFS_DIFLAG_SYNC */ 4290153323Srodrigc "noatime", /* XFS_DIFLAG_NOATIME */ 4291153323Srodrigc "nodump", /* XFS_DIFLAG_NODUMP */ 4292159451Srodrigc "rtinherit", /* XFS_DIFLAG_RTINHERIT */ 4293159451Srodrigc "projinherit", /* XFS_DIFLAG_PROJINHERIT */ 4294159451Srodrigc "nosymlinks", /* XFS_DIFLAG_NOSYMLINKS */ 4295159451Srodrigc "extsize", /* XFS_DIFLAG_EXTSIZE */ 4296159451Srodrigc "extszinherit", /* XFS_DIFLAG_EXTSZINHERIT */ 4297153323Srodrigc NULL 4298153323Srodrigc }; 4299153323Srodrigc 4300153323Srodrigc kdb_printf("magic 0x%x mode 0%o (%s) version 0x%x format 0x%x (%s)\n", 4301159451Srodrigc dip->di_magic, dip->di_mode, 4302159451Srodrigc xfs_fmtmode(dip->di_mode), 4303159451Srodrigc dip->di_version, dip->di_format, 4304159451Srodrigc xfs_fmtformat((xfs_dinode_fmt_t)dip->di_format)); 4305153323Srodrigc kdb_printf("nlink %d uid %d gid %d projid %d flushiter %u\n", 4306159451Srodrigc dip->di_nlink, 4307159451Srodrigc dip->di_uid, 4308159451Srodrigc dip->di_gid, 4309159451Srodrigc (uint)dip->di_projid, 4310159451Srodrigc (uint)dip->di_flushiter); 4311153323Srodrigc kdb_printf("atime %u:%u mtime %ud:%u ctime %u:%u\n", 4312159451Srodrigc dip->di_atime.t_sec, dip->di_atime.t_nsec, 4313159451Srodrigc dip->di_mtime.t_sec, dip->di_mtime.t_nsec, 4314159451Srodrigc dip->di_ctime.t_sec, dip->di_ctime.t_nsec); 4315159451Srodrigc kdb_printf("size %Ld ", dip->di_size); 4316153323Srodrigc kdb_printf("nblocks %Ld extsize 0x%x nextents 0x%x anextents 0x%x\n", 4317159451Srodrigc dip->di_nblocks, dip->di_extsize, dip->di_nextents, 4318159451Srodrigc dip->di_anextents); 4319153323Srodrigc kdb_printf("forkoff %d aformat 0x%x (%s) dmevmask 0x%x dmstate 0x%x ", 4320159451Srodrigc dip->di_forkoff, dip->di_aformat, 4321159451Srodrigc xfs_fmtformat((xfs_dinode_fmt_t)dip->di_aformat), 4322159451Srodrigc dip->di_dmevmask, dip->di_dmstate); 4323159451Srodrigc printflags(dip->di_flags, diflags, "flags"); 4324159451Srodrigc kdb_printf("gen 0x%x\n", dip->di_gen); 4325153323Srodrigc} 4326153323Srodrigc 4327153323Srodrigc#ifdef XFS_RW_TRACE 4328153323Srodrigc/* 4329153323Srodrigc * Print read/write entry trace. 4330153323Srodrigc */ 4331153323Srodrigcstatic void 4332153323Srodrigcxfs_rw_enter_trace_entry(ktrace_entry_t *ktep) 4333153323Srodrigc{ 4334153323Srodrigc qprintf("ip 0x%p size 0x%x%x ptr 0x%p size %lu\n", 4335153323Srodrigc ktep->val[1], 4336153323Srodrigc (unsigned int)(long)ktep->val[2], 4337153323Srodrigc (unsigned int)(long)ktep->val[3], 4338153323Srodrigc ktep->val[4], 4339153323Srodrigc (unsigned long)ktep->val[5]); 4340159451Srodrigc qprintf("io offset 0x%x%x ioflags 0x%x new size 0x%x%x pid %d\n", 4341153323Srodrigc (unsigned int)(long)ktep->val[6], 4342153323Srodrigc (unsigned int)(long)ktep->val[7], 4343153323Srodrigc (unsigned int)(long)ktep->val[8], 4344153323Srodrigc (unsigned int)(long)ktep->val[9], 4345159451Srodrigc (unsigned int)(long)ktep->val[10], 4346159451Srodrigc (unsigned int)(long)ktep->val[11]); 4347153323Srodrigc} 4348153323Srodrigc 4349153323Srodrigc/* 4350153323Srodrigc * Print page write/release trace. 4351153323Srodrigc */ 4352153323Srodrigcstatic void 4353153323Srodrigcxfs_page_trace_entry(ktrace_entry_t *ktep) 4354153323Srodrigc{ 4355159451Srodrigc qprintf("ip 0x%p inode 0x%p page 0x%p\n", 4356159451Srodrigc ktep->val[1], ktep->val[2], ktep->val[3]); 4357153323Srodrigc qprintf("mask 0x%x di_size 0x%x%x isize 0x%x%x offset 0x%x%x\n", 4358159451Srodrigc (unsigned int)(long)ktep->val[4], 4359153323Srodrigc (unsigned int)(long)ktep->val[5], 4360153323Srodrigc (unsigned int)(long)ktep->val[6], 4361153323Srodrigc (unsigned int)(long)ktep->val[7], 4362153323Srodrigc (unsigned int)(long)ktep->val[8], 4363153323Srodrigc (unsigned int)(long)ktep->val[9], 4364159451Srodrigc (unsigned int)(long)ktep->val[10]); 4365159451Srodrigc qprintf("delalloc %d unmapped %d unwritten %d pid %d\n", 4366159451Srodrigc (unsigned int)(long)ktep->val[11], 4367153323Srodrigc (unsigned int)(long)ktep->val[12], 4368153323Srodrigc (unsigned int)(long)ktep->val[13], 4369153323Srodrigc (unsigned int)(long)ktep->val[14]); 4370153323Srodrigc} 4371153323Srodrigc 4372153323Srodrigc/* 4373153323Srodrigc * Print read/write trace entry. 4374153323Srodrigc */ 4375153323Srodrigcstatic int 4376153323Srodrigcxfs_rw_trace_entry(ktrace_entry_t *ktep) 4377153323Srodrigc{ 4378153323Srodrigc switch ( (long)ktep->val[0] ) { 4379153323Srodrigc case XFS_READ_ENTER: 4380153323Srodrigc qprintf("READ ENTER:\n"); 4381153323Srodrigc xfs_rw_enter_trace_entry(ktep); 4382153323Srodrigc break; 4383153323Srodrigc case XFS_WRITE_ENTER: 4384153323Srodrigc qprintf("WRITE ENTER:\n"); 4385153323Srodrigc xfs_rw_enter_trace_entry(ktep); 4386153323Srodrigc break; 4387153323Srodrigc case XFS_SENDFILE_ENTER: 4388153323Srodrigc qprintf("SENDFILE ENTER:\n"); 4389153323Srodrigc xfs_rw_enter_trace_entry(ktep); 4390153323Srodrigc break; 4391153323Srodrigc case XFS_IOMAP_READ_ENTER: 4392153323Srodrigc qprintf("IOMAP READ ENTER:\n"); 4393153323Srodrigc xfs_iomap_enter_trace_entry(ktep); 4394153323Srodrigc break; 4395153323Srodrigc case XFS_IOMAP_WRITE_ENTER: 4396153323Srodrigc qprintf("IOMAP WRITE ENTER:\n"); 4397153323Srodrigc xfs_iomap_enter_trace_entry(ktep); 4398153323Srodrigc break; 4399153323Srodrigc case XFS_IOMAP_WRITE_NOSPACE: 4400153323Srodrigc qprintf("IOMAP WRITE NOSPACE:\n"); 4401153323Srodrigc xfs_iomap_enter_trace_entry(ktep); 4402153323Srodrigc break; 4403153323Srodrigc case XFS_IOMAP_READ_MAP: 4404153323Srodrigc qprintf("IOMAP READ MAP:\n"); 4405153323Srodrigc xfs_iomap_map_trace_entry(ktep); 4406153323Srodrigc break; 4407153323Srodrigc case XFS_IOMAP_WRITE_MAP: 4408153323Srodrigc qprintf("IOMAP WRITE MAP:\n"); 4409153323Srodrigc xfs_iomap_map_trace_entry(ktep); 4410153323Srodrigc break; 4411153323Srodrigc case XFS_ITRUNC_START: 4412153323Srodrigc qprintf("ITRUNC START:\n"); 4413153323Srodrigc xfs_itrunc_trace_entry(ktep); 4414153323Srodrigc break; 4415153323Srodrigc case XFS_ITRUNC_FINISH1: 4416153323Srodrigc qprintf("ITRUNC FINISH1:\n"); 4417153323Srodrigc xfs_itrunc_trace_entry(ktep); 4418153323Srodrigc break; 4419153323Srodrigc case XFS_ITRUNC_FINISH2: 4420153323Srodrigc qprintf("ITRUNC FINISH2:\n"); 4421153323Srodrigc xfs_itrunc_trace_entry(ktep); 4422153323Srodrigc break; 4423153323Srodrigc case XFS_CTRUNC1: 4424153323Srodrigc qprintf("CTRUNC1:\n"); 4425153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4426153323Srodrigc break; 4427153323Srodrigc case XFS_CTRUNC2: 4428153323Srodrigc qprintf("CTRUNC2:\n"); 4429153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4430153323Srodrigc break; 4431153323Srodrigc case XFS_CTRUNC3: 4432153323Srodrigc qprintf("CTRUNC3:\n"); 4433153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4434153323Srodrigc break; 4435153323Srodrigc case XFS_CTRUNC4: 4436153323Srodrigc qprintf("CTRUNC4:\n"); 4437153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4438153323Srodrigc break; 4439153323Srodrigc case XFS_CTRUNC5: 4440153323Srodrigc qprintf("CTRUNC5:\n"); 4441153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4442153323Srodrigc break; 4443153323Srodrigc case XFS_CTRUNC6: 4444153323Srodrigc qprintf("CTRUNC6:\n"); 4445153323Srodrigc xfs_ctrunc_trace_entry(ktep); 4446153323Srodrigc break; 4447159451Srodrigc case XFS_BUNMAP: 4448159451Srodrigc qprintf("BUNMAP:\n"); 4449153323Srodrigc xfs_bunmap_trace_entry(ktep); 4450153323Srodrigc break; 4451153323Srodrigc case XFS_INVAL_CACHED: 4452153323Srodrigc qprintf("INVAL CACHED:\n"); 4453153323Srodrigc xfs_inval_cached_trace_entry(ktep); 4454153323Srodrigc break; 4455153323Srodrigc case XFS_DIORD_ENTER: 4456153323Srodrigc qprintf("DIORD ENTER:\n"); 4457153323Srodrigc xfs_rw_enter_trace_entry(ktep); 4458153323Srodrigc break; 4459153323Srodrigc case XFS_DIOWR_ENTER: 4460153323Srodrigc qprintf("DIOWR ENTER:\n"); 4461153323Srodrigc xfs_rw_enter_trace_entry(ktep); 4462153323Srodrigc break; 4463153323Srodrigc case XFS_WRITEPAGE_ENTER: 4464153323Srodrigc qprintf("PAGE WRITE:\n"); 4465153323Srodrigc xfs_page_trace_entry(ktep); 4466153323Srodrigc break; 4467153323Srodrigc case XFS_RELEASEPAGE_ENTER: 4468153323Srodrigc qprintf("PAGE RELEASE:\n"); 4469153323Srodrigc xfs_page_trace_entry(ktep); 4470153323Srodrigc break; 4471159451Srodrigc case XFS_INVALIDPAGE_ENTER: 4472159451Srodrigc qprintf("PAGE INVALIDATE:\n"); 4473159451Srodrigc xfs_page_trace_entry(ktep); 4474159451Srodrigc break; 4475153323Srodrigc case XFS_IOMAP_ALLOC_ENTER: 4476153323Srodrigc qprintf("ALLOC ENTER:\n"); 4477153323Srodrigc xfs_iomap_enter_trace_entry(ktep); 4478153323Srodrigc break; 4479153323Srodrigc case XFS_IOMAP_ALLOC_MAP: 4480153323Srodrigc qprintf("ALLOC MAP:\n"); 4481153323Srodrigc xfs_iomap_map_trace_entry(ktep); 4482153323Srodrigc break; 4483153323Srodrigc case XFS_IOMAP_UNWRITTEN: 4484153323Srodrigc qprintf("UNWRITTEN:\n"); 4485153323Srodrigc xfs_iomap_enter_trace_entry(ktep); 4486153323Srodrigc break; 4487153323Srodrigc 4488153323Srodrigc default: 4489153323Srodrigc qprintf("UNKNOWN RW TRACE\n"); 4490153323Srodrigc return 0; 4491153323Srodrigc } 4492153323Srodrigc 4493153323Srodrigc return 1; 4494153323Srodrigc} 4495153323Srodrigc#endif 4496153323Srodrigc 4497153323Srodrigc/* 4498159451Srodrigc * Print xfs extent records for a fork. 4499153323Srodrigc */ 4500153323Srodrigcstatic void 4501153323Srodrigcxfs_xexlist_fork(xfs_inode_t *ip, int whichfork) 4502153323Srodrigc{ 4503153323Srodrigc int nextents, i; 4504153323Srodrigc xfs_ifork_t *ifp; 4505153323Srodrigc xfs_bmbt_irec_t irec; 4506153323Srodrigc 4507153323Srodrigc ifp = XFS_IFORK_PTR(ip, whichfork); 4508153323Srodrigc if (ifp->if_flags & XFS_IFEXTENTS) { 4509159451Srodrigc nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); 4510153323Srodrigc kdb_printf("inode 0x%p %cf extents 0x%p nextents 0x%x\n", 4511159451Srodrigc ip, "da"[whichfork], xfs_iext_get_ext(ifp, 0), 4512159451Srodrigc nextents); 4513153323Srodrigc for (i = 0; i < nextents; i++) { 4514159451Srodrigc xfs_bmbt_get_all(xfs_iext_get_ext(ifp, i), &irec); 4515153323Srodrigc kdb_printf( 4516153323Srodrigc "%d: startoff %Ld startblock %s blockcount %Ld flag %d\n", 4517153323Srodrigc i, irec.br_startoff, 4518153323Srodrigc xfs_fmtfsblock(irec.br_startblock, ip->i_mount), 4519153323Srodrigc irec.br_blockcount, irec.br_state); 4520153323Srodrigc } 4521153323Srodrigc } 4522153323Srodrigc} 4523153323Srodrigc 4524153323Srodrigcstatic void 4525153323Srodrigcxfs_xnode_fork(char *name, xfs_ifork_t *f) 4526153323Srodrigc{ 4527153323Srodrigc static char *tab_flags[] = { 4528153323Srodrigc "inline", /* XFS_IFINLINE */ 4529153323Srodrigc "extents", /* XFS_IFEXTENTS */ 4530153323Srodrigc "broot", /* XFS_IFBROOT */ 4531153323Srodrigc NULL 4532153323Srodrigc }; 4533153323Srodrigc int *p; 4534153323Srodrigc 4535153323Srodrigc kdb_printf("%s fork", name); 4536153323Srodrigc if (f == NULL) { 4537153323Srodrigc kdb_printf(" empty\n"); 4538153323Srodrigc return; 4539153323Srodrigc } else 4540153323Srodrigc kdb_printf("\n"); 4541153323Srodrigc kdb_printf(" bytes %s ", xfs_fmtsize(f->if_bytes)); 4542153323Srodrigc kdb_printf("real_bytes %s lastex 0x%x u1:%s 0x%p\n", 4543153323Srodrigc xfs_fmtsize(f->if_real_bytes), f->if_lastex, 4544153323Srodrigc f->if_flags & XFS_IFINLINE ? "data" : "extents", 4545153323Srodrigc f->if_flags & XFS_IFINLINE ? 4546153323Srodrigc f->if_u1.if_data : 4547153323Srodrigc (char *)f->if_u1.if_extents); 4548153323Srodrigc kdb_printf(" broot 0x%p broot_bytes %s ext_max %d ", 4549153323Srodrigc f->if_broot, xfs_fmtsize(f->if_broot_bytes), f->if_ext_max); 4550153323Srodrigc printflags(f->if_flags, tab_flags, "flags"); 4551153323Srodrigc kdb_printf("\n"); 4552153323Srodrigc kdb_printf(" u2"); 4553153323Srodrigc for (p = (int *)&f->if_u2; 4554153323Srodrigc p < (int *)((char *)&f->if_u2 + XFS_INLINE_DATA); 4555153323Srodrigc p++) 4556153323Srodrigc kdb_printf(" 0x%x", *p); 4557153323Srodrigc kdb_printf("\n"); 4558153323Srodrigc} 4559153323Srodrigc 4560153323Srodrigc/* 4561153323Srodrigc * Command-level xfs-idbg functions. 4562153323Srodrigc */ 4563153323Srodrigc 4564153323Srodrigc/* 4565153323Srodrigc * Print xfs allocation group freespace header. 4566153323Srodrigc */ 4567153323Srodrigcstatic void 4568153323Srodrigcxfsidbg_xagf(xfs_agf_t *agf) 4569153323Srodrigc{ 4570153323Srodrigc kdb_printf("magicnum 0x%x versionnum 0x%x seqno 0x%x length 0x%x\n", 4571159451Srodrigc be32_to_cpu(agf->agf_magicnum), 4572159451Srodrigc be32_to_cpu(agf->agf_versionnum), 4573159451Srodrigc be32_to_cpu(agf->agf_seqno), 4574159451Srodrigc be32_to_cpu(agf->agf_length)); 4575153323Srodrigc kdb_printf("roots b 0x%x c 0x%x levels b %d c %d\n", 4576159451Srodrigc be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]), 4577159451Srodrigc be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]), 4578159451Srodrigc be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]), 4579159451Srodrigc be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT])); 4580153323Srodrigc kdb_printf("flfirst %d fllast %d flcount %d freeblks %d longest %d\n", 4581159451Srodrigc be32_to_cpu(agf->agf_flfirst), 4582159451Srodrigc be32_to_cpu(agf->agf_fllast), 4583159451Srodrigc be32_to_cpu(agf->agf_flcount), 4584159451Srodrigc be32_to_cpu(agf->agf_freeblks), 4585159451Srodrigc be32_to_cpu(agf->agf_longest)); 4586153323Srodrigc} 4587153323Srodrigc 4588153323Srodrigc/* 4589153323Srodrigc * Print xfs allocation group inode header. 4590153323Srodrigc */ 4591153323Srodrigcstatic void 4592153323Srodrigcxfsidbg_xagi(xfs_agi_t *agi) 4593153323Srodrigc{ 4594153323Srodrigc int i; 4595153323Srodrigc int j; 4596153323Srodrigc 4597153323Srodrigc kdb_printf("magicnum 0x%x versionnum 0x%x seqno 0x%x length 0x%x\n", 4598159451Srodrigc be32_to_cpu(agi->agi_magicnum), 4599159451Srodrigc be32_to_cpu(agi->agi_versionnum), 4600159451Srodrigc be32_to_cpu(agi->agi_seqno), 4601159451Srodrigc be32_to_cpu(agi->agi_length)); 4602153323Srodrigc kdb_printf("count 0x%x root 0x%x level 0x%x\n", 4603159451Srodrigc be32_to_cpu(agi->agi_count), 4604159451Srodrigc be32_to_cpu(agi->agi_root), 4605159451Srodrigc be32_to_cpu(agi->agi_level)); 4606153323Srodrigc kdb_printf("freecount 0x%x newino 0x%x dirino 0x%x\n", 4607159451Srodrigc be32_to_cpu(agi->agi_freecount), 4608159451Srodrigc be32_to_cpu(agi->agi_newino), 4609159451Srodrigc be32_to_cpu(agi->agi_dirino)); 4610153323Srodrigc 4611153323Srodrigc kdb_printf("unlinked buckets\n"); 4612153323Srodrigc for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) { 4613153323Srodrigc for (j = 0; j < 4; j++, i++) { 4614153323Srodrigc kdb_printf("0x%08x ", 4615159451Srodrigc be32_to_cpu(agi->agi_unlinked[i])); 4616153323Srodrigc } 4617153323Srodrigc kdb_printf("\n"); 4618153323Srodrigc } 4619153323Srodrigc} 4620153323Srodrigc 4621153323Srodrigc#ifdef XFS_ALLOC_TRACE 4622153323Srodrigc/* 4623153323Srodrigc * Print out the last "count" entries in the allocation trace buffer. 4624153323Srodrigc */ 4625153323Srodrigcstatic void 4626153323Srodrigcxfsidbg_xalatrace(int count) 4627153323Srodrigc{ 4628153323Srodrigc ktrace_entry_t *ktep; 4629153323Srodrigc ktrace_snap_t kts; 4630153323Srodrigc int nentries; 4631153323Srodrigc int skip_entries; 4632153323Srodrigc 4633153323Srodrigc if (xfs_alloc_trace_buf == NULL) { 4634153323Srodrigc qprintf("The xfs alloc trace buffer is not initialized\n"); 4635153323Srodrigc return; 4636153323Srodrigc } 4637153323Srodrigc nentries = ktrace_nentries(xfs_alloc_trace_buf); 4638153323Srodrigc if (count == -1) { 4639153323Srodrigc count = nentries; 4640153323Srodrigc } 4641153323Srodrigc if ((count <= 0) || (count > nentries)) { 4642153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 4643153323Srodrigc return; 4644153323Srodrigc } 4645153323Srodrigc 4646153323Srodrigc ktep = ktrace_first(xfs_alloc_trace_buf, &kts); 4647153323Srodrigc if (count != nentries) { 4648153323Srodrigc /* 4649153323Srodrigc * Skip the total minus the number to look at minus one 4650153323Srodrigc * for the entry returned by ktrace_first(). 4651153323Srodrigc */ 4652153323Srodrigc skip_entries = nentries - count - 1; 4653153323Srodrigc ktep = ktrace_skip(xfs_alloc_trace_buf, skip_entries, &kts); 4654153323Srodrigc if (ktep == NULL) { 4655153323Srodrigc qprintf("Skipped them all\n"); 4656153323Srodrigc return; 4657153323Srodrigc } 4658153323Srodrigc } 4659153323Srodrigc while (ktep != NULL) { 4660153323Srodrigc if (xfs_alloc_trace_entry(ktep)) 4661153323Srodrigc qprintf("\n"); 4662153323Srodrigc ktep = ktrace_next(xfs_alloc_trace_buf, &kts); 4663153323Srodrigc } 4664153323Srodrigc} 4665153323Srodrigc 4666153323Srodrigc/* 4667153323Srodrigc * Print out all the entries in the alloc trace buf corresponding 4668153323Srodrigc * to the given block number. 4669153323Srodrigc */ 4670153323Srodrigcstatic void 4671153323Srodrigcxfsidbg_xalbtrace(xfs_agblock_t bno) 4672153323Srodrigc{ 4673153323Srodrigc ktrace_entry_t *ktep; 4674153323Srodrigc ktrace_snap_t kts; 4675153323Srodrigc 4676153323Srodrigc if (xfs_alloc_trace_buf == NULL) { 4677153323Srodrigc qprintf("The xfs alloc trace buffer is not initialized\n"); 4678153323Srodrigc return; 4679153323Srodrigc } 4680153323Srodrigc 4681153323Srodrigc ktep = ktrace_first(xfs_alloc_trace_buf, &kts); 4682153323Srodrigc while (ktep != NULL) { 4683153323Srodrigc switch ((__psint_t)ktep->val[0]) { 4684153323Srodrigc case XFS_ALLOC_KTRACE_ALLOC: 4685153323Srodrigc case XFS_ALLOC_KTRACE_FREE: 4686153323Srodrigc if (bno >= (xfs_agblock_t)((__psint_t)ktep->val[5]) && 4687153323Srodrigc bno < (xfs_agblock_t)((__psint_t)ktep->val[5]) + 4688153323Srodrigc (xfs_extlen_t)((__psint_t)ktep->val[13])) { 4689153323Srodrigc (void)xfs_alloc_trace_entry(ktep); 4690153323Srodrigc qprintf("\n"); 4691153323Srodrigc } 4692153323Srodrigc break; 4693153323Srodrigc } 4694153323Srodrigc ktep = ktrace_next(xfs_alloc_trace_buf, &kts); 4695153323Srodrigc } 4696153323Srodrigc} 4697153323Srodrigc 4698153323Srodrigc/* 4699153323Srodrigc * Print out all the entries in the alloc trace buf corresponding 4700153323Srodrigc * to the given allocation group. 4701153323Srodrigc */ 4702153323Srodrigcstatic void 4703153323Srodrigcxfsidbg_xalgtrace(xfs_agnumber_t agno) 4704153323Srodrigc{ 4705153323Srodrigc ktrace_entry_t *ktep; 4706153323Srodrigc ktrace_snap_t kts; 4707153323Srodrigc 4708153323Srodrigc if (xfs_alloc_trace_buf == NULL) { 4709153323Srodrigc qprintf("The xfs alloc trace buffer is not initialized\n"); 4710153323Srodrigc return; 4711153323Srodrigc } 4712153323Srodrigc 4713153323Srodrigc ktep = ktrace_first(xfs_alloc_trace_buf, &kts); 4714153323Srodrigc while (ktep != NULL) { 4715153323Srodrigc if ( (__psint_t)ktep->val[0] && 4716153323Srodrigc ((xfs_agnumber_t)((__psint_t)ktep->val[4])) == agno ) { 4717153323Srodrigc (void)xfs_alloc_trace_entry(ktep); 4718153323Srodrigc qprintf("\n"); 4719153323Srodrigc } 4720153323Srodrigc ktep = ktrace_next(xfs_alloc_trace_buf, &kts); 4721153323Srodrigc } 4722153323Srodrigc} 4723153323Srodrigc#endif 4724153323Srodrigc 4725153323Srodrigc/* 4726153323Srodrigc * Print an allocation argument structure for XFS. 4727153323Srodrigc */ 4728153323Srodrigcstatic void 4729153323Srodrigcxfsidbg_xalloc(xfs_alloc_arg_t *args) 4730153323Srodrigc{ 4731153323Srodrigc kdb_printf("tp 0x%p mp 0x%p agbp 0x%p pag 0x%p fsbno %s\n", 4732153323Srodrigc args->tp, args->mp, args->agbp, args->pag, 4733153323Srodrigc xfs_fmtfsblock(args->fsbno, args->mp)); 4734153323Srodrigc kdb_printf("agno 0x%x agbno 0x%x minlen 0x%x maxlen 0x%x mod 0x%x\n", 4735153323Srodrigc args->agno, args->agbno, args->minlen, args->maxlen, args->mod); 4736153323Srodrigc kdb_printf("prod 0x%x minleft 0x%x total 0x%x alignment 0x%x\n", 4737153323Srodrigc args->prod, args->minleft, args->total, args->alignment); 4738153323Srodrigc kdb_printf("minalignslop 0x%x len 0x%x type %s otype %s wasdel %d\n", 4739153323Srodrigc args->minalignslop, args->len, xfs_alloctype[args->type], 4740153323Srodrigc xfs_alloctype[args->otype], args->wasdel); 4741153323Srodrigc kdb_printf("wasfromfl %d isfl %d userdata %d\n", 4742153323Srodrigc args->wasfromfl, args->isfl, args->userdata); 4743153323Srodrigc} 4744153323Srodrigc 4745153323Srodrigc#ifdef XFS_ALLOC_TRACE 4746153323Srodrigc/* 4747153323Srodrigc * Print out all the entries in the alloc trace buf corresponding 4748153323Srodrigc * to the given mount point. 4749153323Srodrigc */ 4750153323Srodrigcstatic void 4751153323Srodrigcxfsidbg_xalmtrace(xfs_mount_t *mp) 4752153323Srodrigc{ 4753153323Srodrigc ktrace_entry_t *ktep; 4754153323Srodrigc ktrace_snap_t kts; 4755153323Srodrigc 4756153323Srodrigc if (xfs_alloc_trace_buf == NULL) { 4757153323Srodrigc kdb_printf("The xfs alloc trace buffer is not initialized\n"); 4758153323Srodrigc return; 4759153323Srodrigc } 4760153323Srodrigc 4761153323Srodrigc ktep = ktrace_first(xfs_alloc_trace_buf, &kts); 4762153323Srodrigc while (ktep != NULL) { 4763153323Srodrigc if ((__psint_t)ktep->val[0] && 4764153323Srodrigc (xfs_mount_t *)ktep->val[3] == mp) { 4765153323Srodrigc (void)xfs_alloc_trace_entry(ktep); 4766153323Srodrigc kdb_printf("\n"); 4767153323Srodrigc } 4768153323Srodrigc ktep = ktrace_next(xfs_alloc_trace_buf, &kts); 4769153323Srodrigc } 4770153323Srodrigc} 4771153323Srodrigc 4772153323Srodrigc/* 4773153323Srodrigc * Print out all the entries in the alloc trace buf corresponding 4774153323Srodrigc * to the given entry type. 4775153323Srodrigc */ 4776153323Srodrigcstatic void 4777153323Srodrigcxfsidbg_xalttrace(int tag) 4778153323Srodrigc{ 4779153323Srodrigc ktrace_entry_t *ktep; 4780153323Srodrigc ktrace_snap_t kts; 4781153323Srodrigc 4782153323Srodrigc if (xfs_alloc_trace_buf == NULL) { 4783153323Srodrigc qprintf("The xfs alloc trace buffer is not initialized\n"); 4784153323Srodrigc return; 4785153323Srodrigc } 4786153323Srodrigc 4787153323Srodrigc ktep = ktrace_first(xfs_alloc_trace_buf, &kts); 4788153323Srodrigc while (ktep != NULL) { 4789153323Srodrigc if ((__psint_t)ktep->val[0] && 4790153323Srodrigc ((long)ktep->val[0] & 0xffffL) == (long)tag) { 4791153323Srodrigc (void)xfs_alloc_trace_entry(ktep); 4792153323Srodrigc qprintf("\n"); 4793153323Srodrigc } 4794153323Srodrigc ktep = ktrace_next(xfs_alloc_trace_buf, &kts); 4795153323Srodrigc } 4796153323Srodrigc} 4797153323Srodrigc#endif 4798153323Srodrigc 4799159451Srodrigcstatic int xargument = 0; 4800159451Srodrigc 4801153323Srodrigc/* 4802153323Srodrigc * Set xtra argument, used by xchksum. 4803153323Srodrigc */ 4804153323Srodrigcstatic void 4805153323Srodrigcxfsidbg_xarg(int xarg) 4806153323Srodrigc{ 4807153323Srodrigc if (xarg == -1) 4808153323Srodrigc qprintf("xargument: %d\n", xargument); 4809153323Srodrigc else 4810153323Srodrigc xargument = xarg; 4811153323Srodrigc} /* xfsidbg_xarg */ 4812153323Srodrigc 4813153323Srodrigc/* 4814153323Srodrigc * Print an attr_list() context structure. 4815153323Srodrigc */ 4816153323Srodrigcstatic void 4817153323Srodrigcxfsidbg_xattrcontext(xfs_attr_list_context_t *context) 4818153323Srodrigc{ 4819153323Srodrigc static char *attr_arg_flags[] = { 4820153323Srodrigc "DONTFOLLOW", /* 0x0001 */ 4821153323Srodrigc "?", /* 0x0002 */ 4822153323Srodrigc "?", /* 0x0004 */ 4823153323Srodrigc "?", /* 0x0008 */ 4824153323Srodrigc "CREATE", /* 0x0010 */ 4825153323Srodrigc "?", /* 0x0020 */ 4826153323Srodrigc "?", /* 0x0040 */ 4827153323Srodrigc "?", /* 0x0080 */ 4828153323Srodrigc "?", /* 0x0100 */ 4829153323Srodrigc "?", /* 0x0200 */ 4830153323Srodrigc "?", /* 0x0400 */ 4831153323Srodrigc "?", /* 0x0800 */ 4832153323Srodrigc "KERNOTIME", /* 0x1000 */ 4833153323Srodrigc NULL 4834153323Srodrigc }; 4835153323Srodrigc 4836153323Srodrigc kdb_printf("dp 0x%p, dupcnt %d, resynch %d", 4837153323Srodrigc context->dp, context->dupcnt, context->resynch); 4838153323Srodrigc printflags((__psunsigned_t)context->flags, attr_arg_flags, ", flags"); 4839153323Srodrigc kdb_printf("\ncursor h/b/o 0x%x/0x%x/%d -- p/p/i 0x%x/0x%x/0x%x\n", 4840153323Srodrigc context->cursor->hashval, context->cursor->blkno, 4841153323Srodrigc context->cursor->offset, context->cursor->pad1, 4842153323Srodrigc context->cursor->pad2, context->cursor->initted); 4843153323Srodrigc kdb_printf("alist 0x%p, bufsize 0x%x, count %d, firstu 0x%x\n", 4844153323Srodrigc context->alist, context->bufsize, context->count, 4845153323Srodrigc context->firstu); 4846153323Srodrigc} 4847153323Srodrigc 4848153323Srodrigc/* 4849153323Srodrigc * Print attribute leaf block. 4850153323Srodrigc */ 4851153323Srodrigcstatic void 4852153323Srodrigcxfsidbg_xattrleaf(xfs_attr_leafblock_t *leaf) 4853153323Srodrigc{ 4854153323Srodrigc xfs_attr_leaf_hdr_t *h; 4855153323Srodrigc xfs_da_blkinfo_t *i; 4856153323Srodrigc xfs_attr_leaf_map_t *m; 4857153323Srodrigc xfs_attr_leaf_entry_t *e; 4858153323Srodrigc xfs_attr_leaf_name_local_t *l; 4859153323Srodrigc xfs_attr_leaf_name_remote_t *r; 4860153323Srodrigc int j, k; 4861153323Srodrigc 4862153323Srodrigc h = &leaf->hdr; 4863153323Srodrigc i = &h->info; 4864153323Srodrigc kdb_printf("hdr info forw 0x%x back 0x%x magic 0x%x\n", 4865153323Srodrigc i->forw, i->back, i->magic); 4866153323Srodrigc kdb_printf("hdr count %d usedbytes %d firstused %d holes %d\n", 4867153323Srodrigc INT_GET(h->count, ARCH_CONVERT), 4868153323Srodrigc INT_GET(h->usedbytes, ARCH_CONVERT), 4869153323Srodrigc INT_GET(h->firstused, ARCH_CONVERT), h->holes); 4870153323Srodrigc for (j = 0, m = h->freemap; j < XFS_ATTR_LEAF_MAPSIZE; j++, m++) { 4871153323Srodrigc kdb_printf("hdr freemap %d base %d size %d\n", 4872153323Srodrigc j, INT_GET(m->base, ARCH_CONVERT), 4873153323Srodrigc INT_GET(m->size, ARCH_CONVERT)); 4874153323Srodrigc } 4875153323Srodrigc for (j = 0, e = leaf->entries; j < INT_GET(h->count, ARCH_CONVERT); j++, e++) { 4876153323Srodrigc kdb_printf("[%2d] hash 0x%x nameidx %d flags 0x%x", 4877153323Srodrigc j, INT_GET(e->hashval, ARCH_CONVERT), 4878153323Srodrigc INT_GET(e->nameidx, ARCH_CONVERT), e->flags); 4879153323Srodrigc if (e->flags & XFS_ATTR_LOCAL) 4880153323Srodrigc kdb_printf("LOCAL "); 4881153323Srodrigc if (e->flags & XFS_ATTR_ROOT) 4882153323Srodrigc kdb_printf("ROOT "); 4883153323Srodrigc if (e->flags & XFS_ATTR_SECURE) 4884153323Srodrigc kdb_printf("SECURE "); 4885153323Srodrigc if (e->flags & XFS_ATTR_INCOMPLETE) 4886153323Srodrigc kdb_printf("INCOMPLETE "); 4887153323Srodrigc k = ~(XFS_ATTR_LOCAL | XFS_ATTR_ROOT | 4888153323Srodrigc XFS_ATTR_SECURE | XFS_ATTR_INCOMPLETE); 4889153323Srodrigc if ((e->flags & k) != 0) 4890153323Srodrigc kdb_printf("0x%x", e->flags & k); 4891153323Srodrigc kdb_printf(">\n name \""); 4892153323Srodrigc if (e->flags & XFS_ATTR_LOCAL) { 4893153323Srodrigc l = XFS_ATTR_LEAF_NAME_LOCAL(leaf, j); 4894153323Srodrigc for (k = 0; k < l->namelen; k++) 4895153323Srodrigc kdb_printf("%c", l->nameval[k]); 4896153323Srodrigc kdb_printf("\"(%d) value \"", l->namelen); 4897153323Srodrigc for (k = 0; (k < INT_GET(l->valuelen, ARCH_CONVERT)) && (k < 32); k++) 4898153323Srodrigc kdb_printf("%c", l->nameval[l->namelen + k]); 4899153323Srodrigc if (k == 32) 4900153323Srodrigc kdb_printf("..."); 4901153323Srodrigc kdb_printf("\"(%d)\n", 4902153323Srodrigc INT_GET(l->valuelen, ARCH_CONVERT)); 4903153323Srodrigc } else { 4904153323Srodrigc r = XFS_ATTR_LEAF_NAME_REMOTE(leaf, j); 4905153323Srodrigc for (k = 0; k < r->namelen; k++) 4906153323Srodrigc kdb_printf("%c", r->name[k]); 4907153323Srodrigc kdb_printf("\"(%d) value blk 0x%x len %d\n", 4908153323Srodrigc r->namelen, 4909153323Srodrigc INT_GET(r->valueblk, ARCH_CONVERT), 4910153323Srodrigc INT_GET(r->valuelen, ARCH_CONVERT)); 4911153323Srodrigc } 4912153323Srodrigc } 4913153323Srodrigc} 4914153323Srodrigc 4915153323Srodrigc/* 4916153323Srodrigc * Print a shortform attribute list. 4917153323Srodrigc */ 4918153323Srodrigcstatic void 4919153323Srodrigcxfsidbg_xattrsf(xfs_attr_shortform_t *s) 4920153323Srodrigc{ 4921153323Srodrigc xfs_attr_sf_hdr_t *sfh; 4922153323Srodrigc xfs_attr_sf_entry_t *sfe; 4923153323Srodrigc int i, j; 4924153323Srodrigc 4925153323Srodrigc sfh = &s->hdr; 4926153323Srodrigc kdb_printf("hdr count %d\n", INT_GET(sfh->count, ARCH_CONVERT)); 4927153323Srodrigc for (i = 0, sfe = s->list; i < INT_GET(sfh->count, ARCH_CONVERT); i++) { 4928153323Srodrigc kdb_printf("entry %d namelen %d name \"", i, sfe->namelen); 4929153323Srodrigc for (j = 0; j < sfe->namelen; j++) 4930153323Srodrigc kdb_printf("%c", sfe->nameval[j]); 4931153323Srodrigc kdb_printf("\" valuelen %d value \"", INT_GET(sfe->valuelen, ARCH_CONVERT)); 4932153323Srodrigc for (j = 0; (j < INT_GET(sfe->valuelen, ARCH_CONVERT)) && (j < 32); j++) 4933153323Srodrigc kdb_printf("%c", sfe->nameval[sfe->namelen + j]); 4934153323Srodrigc if (j == 32) 4935153323Srodrigc kdb_printf("..."); 4936153323Srodrigc kdb_printf("\"\n"); 4937153323Srodrigc sfe = XFS_ATTR_SF_NEXTENTRY(sfe); 4938153323Srodrigc } 4939153323Srodrigc} 4940153323Srodrigc 4941153323Srodrigc#ifdef XFS_ATTR_TRACE 4942153323Srodrigc/* 4943153323Srodrigc * Print out the last "count" entries in the attribute trace buffer. 4944153323Srodrigc */ 4945153323Srodrigcstatic void 4946153323Srodrigcxfsidbg_xattrtrace(int count) 4947153323Srodrigc{ 4948153323Srodrigc ktrace_entry_t *ktep; 4949153323Srodrigc ktrace_snap_t kts; 4950153323Srodrigc int nentries; 4951153323Srodrigc int skip_entries; 4952153323Srodrigc 4953153323Srodrigc if (xfs_attr_trace_buf == NULL) { 4954153323Srodrigc qprintf("The xfs attribute trace buffer is not initialized\n"); 4955153323Srodrigc return; 4956153323Srodrigc } 4957153323Srodrigc nentries = ktrace_nentries(xfs_attr_trace_buf); 4958153323Srodrigc if (count == -1) { 4959153323Srodrigc count = nentries; 4960153323Srodrigc } 4961153323Srodrigc if ((count <= 0) || (count > nentries)) { 4962153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 4963153323Srodrigc return; 4964153323Srodrigc } 4965153323Srodrigc 4966153323Srodrigc ktep = ktrace_first(xfs_attr_trace_buf, &kts); 4967153323Srodrigc if (count != nentries) { 4968153323Srodrigc /* 4969153323Srodrigc * Skip the total minus the number to look at minus one 4970153323Srodrigc * for the entry returned by ktrace_first(). 4971153323Srodrigc */ 4972153323Srodrigc skip_entries = nentries - count - 1; 4973153323Srodrigc ktep = ktrace_skip(xfs_attr_trace_buf, skip_entries, &kts); 4974153323Srodrigc if (ktep == NULL) { 4975153323Srodrigc qprintf("Skipped them all\n"); 4976153323Srodrigc return; 4977153323Srodrigc } 4978153323Srodrigc } 4979153323Srodrigc while (ktep != NULL) { 4980153323Srodrigc xfs_attr_trace_entry(ktep); 4981153323Srodrigc ktep = ktrace_next(xfs_attr_trace_buf, &kts); 4982153323Srodrigc } 4983153323Srodrigc} 4984153323Srodrigc#endif 4985153323Srodrigc 4986153323Srodrigc/* 4987153323Srodrigc * Print xfs bmap internal record 4988153323Srodrigc */ 4989153323Srodrigcstatic void 4990153323Srodrigcxfsidbg_xbirec(xfs_bmbt_irec_t *r) 4991153323Srodrigc{ 4992153323Srodrigc kdb_printf( 4993153323Srodrigc "startoff %Ld startblock %Lx blockcount %Ld state %Ld\n", 4994153323Srodrigc (__uint64_t)r->br_startoff, 4995153323Srodrigc (__uint64_t)r->br_startblock, 4996153323Srodrigc (__uint64_t)r->br_blockcount, 4997153323Srodrigc (__uint64_t)r->br_state); 4998153323Srodrigc} 4999153323Srodrigc 5000153323Srodrigc#ifdef XFS_BLI_TRACE 5001153323Srodrigc/* 5002153323Srodrigc * Print out the buf log item trace for the given buf log item. 5003153323Srodrigc */ 5004153323Srodrigcstatic void 5005153323Srodrigcxfsidbg_xblitrace(xfs_buf_log_item_t *bip) 5006153323Srodrigc{ 5007153323Srodrigc ktrace_entry_t *ktep; 5008153323Srodrigc ktrace_snap_t kts; 5009153323Srodrigc uint64_t flags; 5010153323Srodrigc static char *xbli_flags[] = { 5011153323Srodrigc "hold", /* 0x01 */ 5012153323Srodrigc "dirty", /* 0x02 */ 5013153323Srodrigc "stale", /* 0x04 */ 5014153323Srodrigc "logged", /* 0x08 */ 5015159451Srodrigc NULL 5016153323Srodrigc }; 5017153323Srodrigc static char *xli_flags[] = { 5018153323Srodrigc "in ail", /* 0x1 */ 5019159451Srodrigc NULL 5020153323Srodrigc }; 5021153323Srodrigc 5022153323Srodrigc if (bip->bli_trace == NULL) { 5023153323Srodrigc qprintf("The bli trace buffer is not initialized\n"); 5024153323Srodrigc return; 5025153323Srodrigc } 5026153323Srodrigc 5027153323Srodrigc ktep = ktrace_first(bip->bli_trace, &kts); 5028153323Srodrigc while (ktep != NULL) { 5029153323Srodrigc qprintf("%s bp 0x%p flags ", 5030153323Srodrigc (char *)ktep->val[0], ktep->val[1]); 5031153323Srodrigc printflags((__psint_t)(ktep->val[2]), xbli_flags, "xbli"); 5032153323Srodrigc qprintf("\n"); 5033153323Srodrigc qprintf("recur %ld refcount %ld blkno 0x%lx bcount 0x%lx\n", 5034153323Srodrigc (long)ktep->val[3], (long)ktep->val[4], 5035153323Srodrigc (unsigned long)ktep->val[5], 5036153323Srodrigc (unsigned long)ktep->val[6]); 5037153323Srodrigc flags = (((uint64_t)(unsigned long)ktep->val[7] << 32) & 5038153323Srodrigc 0xFFFFFFFF00000000ULL) | 5039153323Srodrigc (((uint64_t)(unsigned long)ktep->val[8]) & 5040153323Srodrigc 0x00000000FFFFFFFFULL); 5041153323Srodrigc qprintf("bp flags "); 5042159451Srodrigc printflags(flags, bp_flag_vals, NULL); 5043153323Srodrigc qprintf("\n"); 5044153323Srodrigc qprintf("fspriv 0x%p fspriv2 0x%p pincount %ld iodone 0x%p\n", 5045153323Srodrigc ktep->val[9], ktep->val[10], 5046153323Srodrigc (long)ktep->val[11], ktep->val[12]); 5047153323Srodrigc qprintf("lockval %ld lid 0x%lx log item flags ", 5048153323Srodrigc (long)ktep->val[13], (unsigned long)ktep->val[14]); 5049153323Srodrigc printflags((__psint_t)(ktep->val[15]), xli_flags, "xli"); 5050153323Srodrigc qprintf("\n"); 5051153323Srodrigc 5052153323Srodrigc ktep = ktrace_next(bip->bli_trace, &kts); 5053153323Srodrigc } 5054153323Srodrigc} 5055153323Srodrigc#endif 5056153323Srodrigc 5057153323Srodrigc/* 5058153323Srodrigc * Print a bmap alloc argument structure for XFS. 5059153323Srodrigc */ 5060153323Srodrigcstatic void 5061153323Srodrigcxfsidbg_xbmalla(xfs_bmalloca_t *a) 5062153323Srodrigc{ 5063153323Srodrigc kdb_printf("tp 0x%p ip 0x%p eof %d prevp 0x%p\n", 5064153323Srodrigc a->tp, a->ip, a->eof, a->prevp); 5065153323Srodrigc kdb_printf("gotp 0x%p firstblock %s alen %d total %d\n", 5066153323Srodrigc a->gotp, xfs_fmtfsblock(a->firstblock, a->ip->i_mount), 5067153323Srodrigc a->alen, a->total); 5068153323Srodrigc kdb_printf("off %s wasdel %d userdata %d minlen %d\n", 5069153323Srodrigc xfs_fmtfsblock(a->off, a->ip->i_mount), a->wasdel, 5070153323Srodrigc a->userdata, a->minlen); 5071159451Srodrigc kdb_printf("minleft %d low %d rval %s aeof %d conv %d\n", 5072153323Srodrigc a->minleft, a->low, xfs_fmtfsblock(a->rval, a->ip->i_mount), 5073159451Srodrigc a->aeof, a->conv); 5074153323Srodrigc} 5075153323Srodrigc 5076153323Srodrigc#ifdef XFS_BMAP_TRACE 5077153323Srodrigc/* 5078153323Srodrigc * Print out the last "count" entries in the bmap btree trace buffer. 5079153323Srodrigc * The "a" is for "all" inodes. 5080153323Srodrigc */ 5081153323Srodrigcstatic void 5082153323Srodrigcxfsidbg_xbmatrace(int count) 5083153323Srodrigc{ 5084153323Srodrigc ktrace_entry_t *ktep; 5085153323Srodrigc ktrace_snap_t kts; 5086153323Srodrigc int nentries; 5087153323Srodrigc int skip_entries; 5088153323Srodrigc 5089153323Srodrigc if (xfs_bmbt_trace_buf == NULL) { 5090153323Srodrigc qprintf("The xfs bmap btree trace buffer is not initialized\n"); return; 5091153323Srodrigc } 5092153323Srodrigc nentries = ktrace_nentries(xfs_bmbt_trace_buf); 5093153323Srodrigc if (count == -1) { 5094153323Srodrigc count = nentries; 5095153323Srodrigc } 5096153323Srodrigc if ((count <= 0) || (count > nentries)) { 5097153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 5098153323Srodrigc return; 5099153323Srodrigc } 5100153323Srodrigc 5101153323Srodrigc ktep = ktrace_first(xfs_bmbt_trace_buf, &kts); 5102153323Srodrigc if (count != nentries) { 5103153323Srodrigc /* 5104153323Srodrigc * Skip the total minus the number to look at minus one 5105153323Srodrigc * for the entry returned by ktrace_first(). 5106153323Srodrigc */ 5107153323Srodrigc skip_entries = nentries - count - 1; 5108153323Srodrigc ktep = ktrace_skip(xfs_bmbt_trace_buf, skip_entries, &kts); 5109153323Srodrigc if (ktep == NULL) { 5110153323Srodrigc qprintf("Skipped them all\n"); 5111153323Srodrigc return; 5112153323Srodrigc } 5113153323Srodrigc } 5114153323Srodrigc while (ktep != NULL) { 5115153323Srodrigc if (xfs_bmbt_trace_entry(ktep)) 5116153323Srodrigc qprintf("\n"); 5117153323Srodrigc ktep = ktrace_next(xfs_bmbt_trace_buf, &kts); 5118153323Srodrigc } 5119153323Srodrigc} 5120153323Srodrigc 5121153323Srodrigc/* 5122153323Srodrigc * Print out the bmap btree trace buffer attached to the given inode. 5123153323Srodrigc */ 5124153323Srodrigcstatic void 5125153323Srodrigcxfsidbg_xbmitrace(xfs_inode_t *ip) 5126153323Srodrigc{ 5127153323Srodrigc ktrace_entry_t *ktep; 5128153323Srodrigc ktrace_snap_t kts; 5129153323Srodrigc 5130153323Srodrigc if (ip->i_btrace == NULL) { 5131153323Srodrigc qprintf("The inode trace buffer is not initialized\n"); 5132153323Srodrigc return; 5133153323Srodrigc } 5134153323Srodrigc 5135153323Srodrigc ktep = ktrace_first(ip->i_btrace, &kts); 5136153323Srodrigc while (ktep != NULL) { 5137153323Srodrigc if (xfs_bmbt_trace_entry(ktep)) 5138153323Srodrigc qprintf("\n"); 5139153323Srodrigc ktep = ktrace_next(ip->i_btrace, &kts); 5140153323Srodrigc } 5141153323Srodrigc} 5142153323Srodrigc 5143153323Srodrigc/* 5144153323Srodrigc * Print out all the entries in the bmap btree trace buf corresponding 5145153323Srodrigc * to the given inode. The "s" is for "single" inode. 5146153323Srodrigc */ 5147153323Srodrigcstatic void 5148153323Srodrigcxfsidbg_xbmstrace(xfs_inode_t *ip) 5149153323Srodrigc{ 5150153323Srodrigc ktrace_entry_t *ktep; 5151153323Srodrigc ktrace_snap_t kts; 5152153323Srodrigc 5153153323Srodrigc if (xfs_bmbt_trace_buf == NULL) { 5154153323Srodrigc qprintf("The xfs bmap btree trace buffer is not initialized\n"); return; 5155153323Srodrigc } 5156153323Srodrigc 5157153323Srodrigc ktep = ktrace_first(xfs_bmbt_trace_buf, &kts); 5158153323Srodrigc while (ktep != NULL) { 5159153323Srodrigc if ((xfs_inode_t *)(ktep->val[2]) == ip) { 5160153323Srodrigc if (xfs_bmbt_trace_entry(ktep)) 5161153323Srodrigc qprintf("\n"); 5162153323Srodrigc } 5163153323Srodrigc ktep = ktrace_next(xfs_bmbt_trace_buf, &kts); 5164153323Srodrigc } 5165153323Srodrigc} 5166153323Srodrigc#endif 5167153323Srodrigc 5168153323Srodrigc/* 5169153323Srodrigc * Print xfs bmap record 5170153323Srodrigc */ 5171153323Srodrigcstatic void 5172153323Srodrigcxfsidbg_xbrec(xfs_bmbt_rec_64_t *r) 5173153323Srodrigc{ 5174153323Srodrigc xfs_bmbt_irec_t irec; 5175153323Srodrigc 5176153323Srodrigc xfs_bmbt_get_all((xfs_bmbt_rec_t *)r, &irec); 5177153323Srodrigc kdb_printf("startoff %Ld startblock %Lx blockcount %Ld flag %d\n", 5178153323Srodrigc irec.br_startoff, (__uint64_t)irec.br_startblock, 5179153323Srodrigc irec.br_blockcount, irec.br_state); 5180153323Srodrigc} 5181153323Srodrigc 5182153323Srodrigc/* 5183153323Srodrigc * Print an xfs in-inode bmap btree root (data fork). 5184153323Srodrigc */ 5185153323Srodrigcstatic void 5186153323Srodrigcxfsidbg_xbroot(xfs_inode_t *ip) 5187153323Srodrigc{ 5188153323Srodrigc xfs_broot(ip, &ip->i_df); 5189153323Srodrigc} 5190153323Srodrigc 5191153323Srodrigc/* 5192153323Srodrigc * Print an xfs in-inode bmap btree root (attribute fork). 5193153323Srodrigc */ 5194153323Srodrigcstatic void 5195153323Srodrigcxfsidbg_xbroota(xfs_inode_t *ip) 5196153323Srodrigc{ 5197153323Srodrigc if (ip->i_afp) 5198153323Srodrigc xfs_broot(ip, ip->i_afp); 5199153323Srodrigc} 5200153323Srodrigc 5201153323Srodrigc/* 5202153323Srodrigc * Print xfs btree cursor. 5203153323Srodrigc */ 5204153323Srodrigcstatic void 5205153323Srodrigcxfsidbg_xbtcur(xfs_btree_cur_t *c) 5206153323Srodrigc{ 5207153323Srodrigc int l; 5208153323Srodrigc 5209153323Srodrigc kdb_printf("tp 0x%p mp 0x%p\n", 5210153323Srodrigc c->bc_tp, 5211153323Srodrigc c->bc_mp); 5212153323Srodrigc if (c->bc_btnum == XFS_BTNUM_BMAP) { 5213153323Srodrigc kdb_printf("rec.b "); 5214153323Srodrigc xfsidbg_xbirec(&c->bc_rec.b); 5215153323Srodrigc } else if (c->bc_btnum == XFS_BTNUM_INO) { 5216153323Srodrigc kdb_printf("rec.i startino 0x%x freecount 0x%x free %Lx\n", 5217153323Srodrigc c->bc_rec.i.ir_startino, c->bc_rec.i.ir_freecount, 5218153323Srodrigc c->bc_rec.i.ir_free); 5219153323Srodrigc } else { 5220153323Srodrigc kdb_printf("rec.a startblock 0x%x blockcount 0x%x\n", 5221153323Srodrigc c->bc_rec.a.ar_startblock, 5222153323Srodrigc c->bc_rec.a.ar_blockcount); 5223153323Srodrigc } 5224153323Srodrigc kdb_printf("bufs"); 5225153323Srodrigc for (l = 0; l < c->bc_nlevels; l++) 5226153323Srodrigc kdb_printf(" 0x%p", c->bc_bufs[l]); 5227153323Srodrigc kdb_printf("\n"); 5228153323Srodrigc kdb_printf("ptrs"); 5229153323Srodrigc for (l = 0; l < c->bc_nlevels; l++) 5230153323Srodrigc kdb_printf(" 0x%x", c->bc_ptrs[l]); 5231153323Srodrigc kdb_printf(" ra"); 5232153323Srodrigc for (l = 0; l < c->bc_nlevels; l++) 5233153323Srodrigc kdb_printf(" %d", c->bc_ra[l]); 5234153323Srodrigc kdb_printf("\n"); 5235153323Srodrigc kdb_printf("nlevels %d btnum %s blocklog %d\n", 5236153323Srodrigc c->bc_nlevels, 5237153323Srodrigc c->bc_btnum == XFS_BTNUM_BNO ? "bno" : 5238153323Srodrigc (c->bc_btnum == XFS_BTNUM_CNT ? "cnt" : 5239153323Srodrigc (c->bc_btnum == XFS_BTNUM_BMAP ? "bmap" : "ino")), 5240153323Srodrigc c->bc_blocklog); 5241153323Srodrigc if (c->bc_btnum == XFS_BTNUM_BMAP) { 5242153323Srodrigc kdb_printf("private forksize 0x%x whichfork %d ip 0x%p flags %d\n", 5243153323Srodrigc c->bc_private.b.forksize, 5244153323Srodrigc c->bc_private.b.whichfork, 5245153323Srodrigc c->bc_private.b.ip, 5246153323Srodrigc c->bc_private.b.flags); 5247153323Srodrigc kdb_printf("private firstblock %s flist 0x%p allocated 0x%x\n", 5248153323Srodrigc xfs_fmtfsblock(c->bc_private.b.firstblock, c->bc_mp), 5249153323Srodrigc c->bc_private.b.flist, 5250153323Srodrigc c->bc_private.b.allocated); 5251153323Srodrigc } else if (c->bc_btnum == XFS_BTNUM_INO) { 5252153323Srodrigc kdb_printf("private agbp 0x%p agno 0x%x\n", 5253153323Srodrigc c->bc_private.i.agbp, 5254153323Srodrigc c->bc_private.i.agno); 5255153323Srodrigc } else { 5256153323Srodrigc kdb_printf("private agbp 0x%p agno 0x%x\n", 5257153323Srodrigc c->bc_private.a.agbp, 5258153323Srodrigc c->bc_private.a.agno); 5259153323Srodrigc } 5260153323Srodrigc} 5261153323Srodrigc 5262153323Srodrigc/* 5263153323Srodrigc * Figure out what kind of xfs block the buffer contains, 5264153323Srodrigc * and invoke a print routine. 5265153323Srodrigc */ 5266153323Srodrigcstatic void 5267153323Srodrigcxfsidbg_xbuf(xfs_buf_t *bp) 5268153323Srodrigc{ 5269153323Srodrigc xfsidbg_xbuf_real(bp, 0); 5270153323Srodrigc} 5271153323Srodrigc 5272153323Srodrigc/* 5273153323Srodrigc * Figure out what kind of xfs block the buffer contains, 5274153323Srodrigc * and invoke a print routine (if asked to). 5275153323Srodrigc */ 5276153323Srodrigcstatic void 5277153323Srodrigcxfsidbg_xbuf_real(xfs_buf_t *bp, int summary) 5278153323Srodrigc{ 5279153323Srodrigc void *d; 5280153323Srodrigc xfs_agf_t *agf; 5281153323Srodrigc xfs_agi_t *agi; 5282153323Srodrigc xfs_sb_t *sb; 5283153323Srodrigc xfs_alloc_block_t *bta; 5284153323Srodrigc xfs_bmbt_block_t *btb; 5285153323Srodrigc xfs_inobt_block_t *bti; 5286153323Srodrigc xfs_attr_leafblock_t *aleaf; 5287153323Srodrigc xfs_dir_leafblock_t *dleaf; 5288153323Srodrigc xfs_da_intnode_t *node; 5289153323Srodrigc xfs_dinode_t *di; 5290153323Srodrigc xfs_disk_dquot_t *dqb; 5291153323Srodrigc xfs_dir2_block_t *d2block; 5292153323Srodrigc xfs_dir2_data_t *d2data; 5293153323Srodrigc xfs_dir2_leaf_t *d2leaf; 5294153323Srodrigc xfs_dir2_free_t *d2free; 5295153323Srodrigc 5296153323Srodrigc d = XFS_BUF_PTR(bp); 5297159451Srodrigc if (be32_to_cpu((agf = d)->agf_magicnum) == XFS_AGF_MAGIC) { 5298153323Srodrigc if (summary) { 5299153323Srodrigc kdb_printf("freespace hdr for AG %d (at 0x%p)\n", 5300159451Srodrigc be32_to_cpu(agf->agf_seqno), agf); 5301153323Srodrigc } else { 5302153323Srodrigc kdb_printf("buf 0x%p agf 0x%p\n", bp, agf); 5303153323Srodrigc xfsidbg_xagf(agf); 5304153323Srodrigc } 5305159451Srodrigc } else if (be32_to_cpu((agi = d)->agi_magicnum) == XFS_AGI_MAGIC) { 5306153323Srodrigc if (summary) { 5307153323Srodrigc kdb_printf("Inode hdr for AG %d (at 0x%p)\n", 5308159451Srodrigc be32_to_cpu(agi->agi_seqno), agi); 5309153323Srodrigc } else { 5310153323Srodrigc kdb_printf("buf 0x%p agi 0x%p\n", bp, agi); 5311153323Srodrigc xfsidbg_xagi(agi); 5312153323Srodrigc } 5313159451Srodrigc } else if (be32_to_cpu((bta = d)->bb_magic) == XFS_ABTB_MAGIC) { 5314153323Srodrigc if (summary) { 5315153323Srodrigc kdb_printf("Alloc BNO Btree blk, level %d (at 0x%p)\n", 5316159451Srodrigc be16_to_cpu(bta->bb_level), bta); 5317153323Srodrigc } else { 5318153323Srodrigc kdb_printf("buf 0x%p abtbno 0x%p\n", bp, bta); 5319153323Srodrigc xfs_btalloc(bta, XFS_BUF_COUNT(bp)); 5320153323Srodrigc } 5321159451Srodrigc } else if (be32_to_cpu((bta = d)->bb_magic) == XFS_ABTC_MAGIC) { 5322153323Srodrigc if (summary) { 5323153323Srodrigc kdb_printf("Alloc COUNT Btree blk, level %d (at 0x%p)\n", 5324159451Srodrigc be16_to_cpu(bta->bb_level), bta); 5325153323Srodrigc } else { 5326153323Srodrigc kdb_printf("buf 0x%p abtcnt 0x%p\n", bp, bta); 5327153323Srodrigc xfs_btalloc(bta, XFS_BUF_COUNT(bp)); 5328153323Srodrigc } 5329159451Srodrigc } else if (be32_to_cpu((btb = d)->bb_magic) == XFS_BMAP_MAGIC) { 5330153323Srodrigc if (summary) { 5331153323Srodrigc kdb_printf("Bmap Btree blk, level %d (at 0x%p)\n", 5332159451Srodrigc be16_to_cpu(btb->bb_level), btb); 5333153323Srodrigc } else { 5334153323Srodrigc kdb_printf("buf 0x%p bmapbt 0x%p\n", bp, btb); 5335153323Srodrigc xfs_btbmap(btb, XFS_BUF_COUNT(bp)); 5336153323Srodrigc } 5337159451Srodrigc } else if (be32_to_cpu((bti = d)->bb_magic) == XFS_IBT_MAGIC) { 5338153323Srodrigc if (summary) { 5339153323Srodrigc kdb_printf("Inode Btree blk, level %d (at 0x%p)\n", 5340159451Srodrigc be16_to_cpu(bti->bb_level), bti); 5341153323Srodrigc } else { 5342153323Srodrigc kdb_printf("buf 0x%p inobt 0x%p\n", bp, bti); 5343153323Srodrigc xfs_btino(bti, XFS_BUF_COUNT(bp)); 5344153323Srodrigc } 5345153323Srodrigc } else if (INT_GET((aleaf = d)->hdr.info.magic, ARCH_CONVERT) == XFS_ATTR_LEAF_MAGIC) { 5346153323Srodrigc if (summary) { 5347153323Srodrigc kdb_printf("Attr Leaf, 1st hash 0x%x (at 0x%p)\n", 5348153323Srodrigc INT_GET(aleaf->entries[0].hashval, ARCH_CONVERT), aleaf); 5349153323Srodrigc } else { 5350153323Srodrigc kdb_printf("buf 0x%p attr leaf 0x%p\n", bp, aleaf); 5351153323Srodrigc xfsidbg_xattrleaf(aleaf); 5352153323Srodrigc } 5353153323Srodrigc } else if (INT_GET((dleaf = d)->hdr.info.magic, ARCH_CONVERT) == XFS_DIR_LEAF_MAGIC) { 5354153323Srodrigc if (summary) { 5355153323Srodrigc kdb_printf("Dir Leaf, 1st hash 0x%x (at 0x%p)\n", 5356153323Srodrigc dleaf->entries[0].hashval, dleaf); 5357153323Srodrigc } else { 5358153323Srodrigc kdb_printf("buf 0x%p dir leaf 0x%p\n", bp, dleaf); 5359153323Srodrigc xfsidbg_xdirleaf(dleaf); 5360153323Srodrigc } 5361153323Srodrigc } else if (INT_GET((node = d)->hdr.info.magic, ARCH_CONVERT) == XFS_DA_NODE_MAGIC) { 5362153323Srodrigc if (summary) { 5363153323Srodrigc kdb_printf("Dir/Attr Node, level %d, 1st hash 0x%x (at 0x%p)\n", 5364153323Srodrigc node->hdr.level, node->btree[0].hashval, node); 5365153323Srodrigc } else { 5366153323Srodrigc kdb_printf("buf 0x%p dir/attr node 0x%p\n", bp, node); 5367153323Srodrigc xfsidbg_xdanode(node); 5368153323Srodrigc } 5369153323Srodrigc } else if (INT_GET((di = d)->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC) { 5370153323Srodrigc if (summary) { 5371153323Srodrigc kdb_printf("Disk Inode (at 0x%p)\n", di); 5372153323Srodrigc } else { 5373153323Srodrigc kdb_printf("buf 0x%p dinode 0x%p\n", bp, di); 5374153323Srodrigc xfs_inodebuf(bp); 5375153323Srodrigc } 5376153323Srodrigc } else if (INT_GET((sb = d)->sb_magicnum, ARCH_CONVERT) == XFS_SB_MAGIC) { 5377153323Srodrigc if (summary) { 5378153323Srodrigc kdb_printf("Superblock (at 0x%p)\n", sb); 5379153323Srodrigc } else { 5380153323Srodrigc kdb_printf("buf 0x%p sb 0x%p\n", bp, sb); 5381153323Srodrigc /* SB in a buffer - we need to convert */ 5382159451Srodrigc xfsidbg_xsb_convert(sb); 5383153323Srodrigc } 5384159451Srodrigc } else if ((dqb = d)->d_magic == cpu_to_be16(XFS_DQUOT_MAGIC)) { 5385153323Srodrigc#define XFSIDBG_DQTYPESTR(d) \ 5386159451Srodrigc (((d)->d_flags & XFS_DQ_USER) ? "USR" : \ 5387159451Srodrigc (((d)->d_flags & XFS_DQ_GROUP) ? "GRP" : \ 5388159451Srodrigc (((d)->d_flags & XFS_DQ_PROJ) ? "PRJ" : "???"))) 5389153323Srodrigc kdb_printf("Quota blk starting ID [%d], type %s at 0x%p\n", 5390159451Srodrigc be32_to_cpu(dqb->d_id), XFSIDBG_DQTYPESTR(dqb), dqb); 5391153323Srodrigc 5392153323Srodrigc } else if (INT_GET((d2block = d)->hdr.magic, ARCH_CONVERT) == XFS_DIR2_BLOCK_MAGIC) { 5393153323Srodrigc if (summary) { 5394153323Srodrigc kdb_printf("Dir2 block (at 0x%p)\n", d2block); 5395153323Srodrigc } else { 5396153323Srodrigc kdb_printf("buf 0x%p dir2 block 0x%p\n", bp, d2block); 5397153323Srodrigc xfs_dir2data((void *)d2block, XFS_BUF_COUNT(bp)); 5398153323Srodrigc } 5399153323Srodrigc } else if (INT_GET((d2data = d)->hdr.magic, ARCH_CONVERT) == XFS_DIR2_DATA_MAGIC) { 5400153323Srodrigc if (summary) { 5401153323Srodrigc kdb_printf("Dir2 data (at 0x%p)\n", d2data); 5402153323Srodrigc } else { 5403153323Srodrigc kdb_printf("buf 0x%p dir2 data 0x%p\n", bp, d2data); 5404153323Srodrigc xfs_dir2data((void *)d2data, XFS_BUF_COUNT(bp)); 5405153323Srodrigc } 5406153323Srodrigc } else if (INT_GET((d2leaf = d)->hdr.info.magic, ARCH_CONVERT) == XFS_DIR2_LEAF1_MAGIC) { 5407153323Srodrigc if (summary) { 5408153323Srodrigc kdb_printf("Dir2 leaf(1) (at 0x%p)\n", d2leaf); 5409153323Srodrigc } else { 5410153323Srodrigc kdb_printf("buf 0x%p dir2 leaf 0x%p\n", bp, d2leaf); 5411153323Srodrigc xfs_dir2leaf(d2leaf, XFS_BUF_COUNT(bp)); 5412153323Srodrigc } 5413153323Srodrigc } else if (INT_GET(d2leaf->hdr.info.magic, ARCH_CONVERT) == XFS_DIR2_LEAFN_MAGIC) { 5414153323Srodrigc if (summary) { 5415153323Srodrigc kdb_printf("Dir2 leaf(n) (at 0x%p)\n", d2leaf); 5416153323Srodrigc } else { 5417153323Srodrigc kdb_printf("buf 0x%p dir2 leaf 0x%p\n", bp, d2leaf); 5418153323Srodrigc xfs_dir2leaf(d2leaf, XFS_BUF_COUNT(bp)); 5419153323Srodrigc } 5420153323Srodrigc } else if (INT_GET((d2free = d)->hdr.magic, ARCH_CONVERT) == XFS_DIR2_FREE_MAGIC) { 5421153323Srodrigc if (summary) { 5422153323Srodrigc kdb_printf("Dir2 free (at 0x%p)\n", d2free); 5423153323Srodrigc } else { 5424153323Srodrigc kdb_printf("buf 0x%p dir2 free 0x%p\n", bp, d2free); 5425153323Srodrigc xfsidbg_xdir2free(d2free); 5426153323Srodrigc } 5427153323Srodrigc } else { 5428153323Srodrigc kdb_printf("buf 0x%p unknown 0x%p\n", bp, d); 5429153323Srodrigc } 5430153323Srodrigc} 5431153323Srodrigc 5432153323Srodrigc#ifdef XFS_BMAP_TRACE 5433153323Srodrigc/* 5434153323Srodrigc * Print out the last "count" entries in the bmap extent trace buffer. 5435153323Srodrigc * The "a" is for "all" inodes. 5436153323Srodrigc */ 5437153323Srodrigcstatic void 5438153323Srodrigcxfsidbg_xbxatrace(int count) 5439153323Srodrigc{ 5440153323Srodrigc ktrace_entry_t *ktep; 5441153323Srodrigc ktrace_snap_t kts; 5442153323Srodrigc int nentries; 5443153323Srodrigc int skip_entries; 5444153323Srodrigc 5445153323Srodrigc if (xfs_bmap_trace_buf == NULL) { 5446153323Srodrigc qprintf("The xfs bmap extent trace buffer is not initialized\n"); 5447153323Srodrigc return; 5448153323Srodrigc } 5449153323Srodrigc nentries = ktrace_nentries(xfs_bmap_trace_buf); 5450153323Srodrigc if (count == -1) { 5451153323Srodrigc count = nentries; 5452153323Srodrigc } 5453153323Srodrigc if ((count <= 0) || (count > nentries)) { 5454153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 5455153323Srodrigc return; 5456153323Srodrigc } 5457153323Srodrigc 5458153323Srodrigc ktep = ktrace_first(xfs_bmap_trace_buf, &kts); 5459153323Srodrigc if (count != nentries) { 5460153323Srodrigc /* 5461153323Srodrigc * Skip the total minus the number to look at minus one 5462153323Srodrigc * for the entry returned by ktrace_first(). 5463153323Srodrigc */ 5464153323Srodrigc skip_entries = nentries - count - 1; 5465153323Srodrigc ktep = ktrace_skip(xfs_bmap_trace_buf, skip_entries, &kts); 5466153323Srodrigc if (ktep == NULL) { 5467153323Srodrigc qprintf("Skipped them all\n"); 5468153323Srodrigc return; 5469153323Srodrigc } 5470153323Srodrigc } 5471153323Srodrigc while (ktep != NULL) { 5472153323Srodrigc if (xfs_bmap_trace_entry(ktep)) 5473153323Srodrigc qprintf("\n"); 5474153323Srodrigc ktep = ktrace_next(xfs_bmap_trace_buf, &kts); 5475153323Srodrigc } 5476153323Srodrigc} 5477153323Srodrigc 5478153323Srodrigc/* 5479153323Srodrigc * Print out the bmap extent trace buffer attached to the given inode. 5480153323Srodrigc */ 5481153323Srodrigcstatic void 5482153323Srodrigcxfsidbg_xbxitrace(xfs_inode_t *ip) 5483153323Srodrigc{ 5484153323Srodrigc ktrace_entry_t *ktep; 5485153323Srodrigc ktrace_snap_t kts; 5486153323Srodrigc if (ip->i_xtrace == NULL) { 5487153323Srodrigc qprintf("The inode trace buffer is not initialized\n"); 5488153323Srodrigc return; 5489153323Srodrigc } 5490153323Srodrigc 5491153323Srodrigc ktep = ktrace_first(ip->i_xtrace, &kts); 5492153323Srodrigc while (ktep != NULL) { 5493153323Srodrigc if (xfs_bmap_trace_entry(ktep)) 5494153323Srodrigc qprintf("\n"); 5495153323Srodrigc ktep = ktrace_next(ip->i_xtrace, &kts); 5496153323Srodrigc } 5497153323Srodrigc} 5498153323Srodrigc 5499153323Srodrigc/* 5500153323Srodrigc * Print out all the entries in the bmap extent trace buf corresponding 5501153323Srodrigc * to the given inode. The "s" is for "single" inode. 5502153323Srodrigc */ 5503153323Srodrigcstatic void 5504153323Srodrigcxfsidbg_xbxstrace(xfs_inode_t *ip) 5505153323Srodrigc{ 5506153323Srodrigc ktrace_entry_t *ktep; 5507153323Srodrigc ktrace_snap_t kts; 5508153323Srodrigc 5509153323Srodrigc if (xfs_bmap_trace_buf == NULL) { 5510153323Srodrigc qprintf("The xfs bmap extent trace buffer is not initialized\n"); 5511153323Srodrigc return; 5512153323Srodrigc } 5513153323Srodrigc 5514153323Srodrigc ktep = ktrace_first(xfs_bmap_trace_buf, &kts); 5515153323Srodrigc while (ktep != NULL) { 5516153323Srodrigc if ((xfs_inode_t *)(ktep->val[3]) == ip) { 5517153323Srodrigc if (xfs_bmap_trace_entry(ktep)) 5518153323Srodrigc qprintf("\n"); 5519153323Srodrigc } 5520153323Srodrigc ktep = ktrace_next(xfs_bmap_trace_buf, &kts); 5521153323Srodrigc } 5522153323Srodrigc} 5523153323Srodrigc#endif 5524153323Srodrigc 5525153323Srodrigc#ifdef XFS_ILOCK_TRACE 5526153323Srodrigc/* 5527153323Srodrigc * Print out the ilock trace buffer attached to the given inode. 5528153323Srodrigc */ 5529153323Srodrigcstatic void 5530153323Srodrigcxfsidbg_xilock_trace_entry(ktrace_entry_t *ktep) 5531153323Srodrigc{ 5532153323Srodrigc static char *xiflags[] = { 5533153323Srodrigc "IOLOCK_EXCL", 5534153323Srodrigc "IOLOCK_SHAR", 5535153323Srodrigc "ILOCK_EXCL", 5536153323Srodrigc "ILOCK_SHAR", 5537153323Srodrigc "IUNLK_NONOT", 5538159451Srodrigc NULL 5539153323Srodrigc }; 5540153323Srodrigc 5541153323Srodrigc if ((__psint_t)ktep->val[0] && 5542153323Srodrigc (__psint_t)ktep->val[7] == 0) { 5543153323Srodrigc printflags((__psint_t)ktep->val[2], xiflags,"Flags "); 5544153323Srodrigc if ((__psint_t)ktep->val[1] == 1) 5545153323Srodrigc qprintf("LOCK\n"); 5546153323Srodrigc else if ((__psint_t)ktep->val[1] == 2) 5547153323Srodrigc qprintf("LOCK SHARED\n"); 5548153323Srodrigc else if ((__psint_t)ktep->val[1] == 3) 5549153323Srodrigc qprintf("UNLOCK\n"); 5550153323Srodrigc qprintf("ip 0x%p %llx %ld\n", 5551153323Srodrigc ktep->val[0], 5552153323Srodrigc (unsigned long long)((xfs_inode_t*)ktep->val[0])->i_ino, 5553153323Srodrigc (long)ktep->val[6]); 5554153323Srodrigc qprintf("raddr 0x%p\n", ktep->val[3]); 5555153323Srodrigc qprintf(" Pid %ld, cpu %ld\n", 5556153323Srodrigc (long)ktep->val[5], 5557153323Srodrigc (long)ktep->val[4]); 5558153323Srodrigc qprintf("-----------------------\n"); 5559153323Srodrigc 5560153323Srodrigc } else if ((__psint_t)ktep->val[7] == 1) { 5561153323Srodrigc if ((__psint_t)ktep->val[1] == 1) 5562153323Srodrigc qprintf("FlushLOCK "); 5563153323Srodrigc else if ((__psint_t)ktep->val[1] == 2) 5564153323Srodrigc qprintf("FlushTRYLOCK %ld ", 5565153323Srodrigc (long)ktep->val[2]); 5566153323Srodrigc else if ((__psint_t)ktep->val[1] == 3) 5567153323Srodrigc qprintf("FlushUNLOCK "); 5568153323Srodrigc else if ((__psint_t)ktep->val[1] == 4) 5569153323Srodrigc qprintf("FlushInode 0x%p", 5570153323Srodrigc ktep->val[2]); 5571153323Srodrigc else if ((__psint_t)ktep->val[1] == 5) 5572153323Srodrigc qprintf("FlushInodeInt "); 5573153323Srodrigc else qprintf("FlushUNKNOWN "); 5574153323Srodrigc qprintf("ip 0x%p ino %llx @ %ld\n", 5575153323Srodrigc ktep->val[0], 5576153323Srodrigc (unsigned long long)((xfs_inode_t*)ktep->val[0])->i_ino, 5577153323Srodrigc (long)ktep->val[6]); 5578153323Srodrigc qprintf("raddr 0x%p\n", ktep->val[3]); 5579153323Srodrigc qprintf(" Pid %ld, cpu %ld\n", 5580153323Srodrigc (long)ktep->val[5], 5581153323Srodrigc (long)ktep->val[4]); 5582153323Srodrigc qprintf("-----------------------\n"); 5583153323Srodrigc } 5584153323Srodrigc} 5585153323Srodrigc 5586153323Srodrigcstatic void 5587153323Srodrigcxfsidbg_xilock_trace(xfs_inode_t *ip) 5588153323Srodrigc{ 5589153323Srodrigc static char *xiflags[] = { 5590153323Srodrigc "IOLOCK_EXCL", 5591153323Srodrigc "IOLOCK_SHAR", 5592153323Srodrigc "ILOCK_EXCL", 5593153323Srodrigc "ILOCK_SHAR", 5594153323Srodrigc "IUNLK_NONOT", 5595159451Srodrigc NULL 5596153323Srodrigc }; 5597153323Srodrigc 5598153323Srodrigc ktrace_entry_t *ktep; 5599153323Srodrigc ktrace_snap_t kts; 5600153323Srodrigc if (ip->i_lock_trace == NULL) { 5601153323Srodrigc qprintf("The inode ilock trace buffer is not initialized\n"); 5602153323Srodrigc return; 5603153323Srodrigc } 5604153323Srodrigc 5605153323Srodrigc ktep = ktrace_first(ip->i_lock_trace, &kts); 5606153323Srodrigc while (ktep != NULL) { 5607153323Srodrigc if ((__psint_t)ktep->val[0] && 5608153323Srodrigc (__psint_t)ktep->val[7] == 0) { 5609153323Srodrigc printflags((__psint_t)ktep->val[2], xiflags,"Flags "); 5610153323Srodrigc if ((__psint_t)ktep->val[1] == 1) 5611153323Srodrigc qprintf("LOCK\n"); 5612153323Srodrigc else if ((__psint_t)ktep->val[1] == 2) 5613153323Srodrigc qprintf("LOCK SHARED\n"); 5614153323Srodrigc else if ((__psint_t)ktep->val[1] == 3) 5615153323Srodrigc qprintf("UNLOCK\n"); 5616153323Srodrigc qprintf("ip 0x%p %lld %ld\n", 5617153323Srodrigc ktep->val[0], (unsigned long long) 5618153323Srodrigc ((xfs_inode_t*)ktep->val[0])->i_ino, 5619153323Srodrigc (long)ktep->val[6]); 5620153323Srodrigc qprintf("raddr 0x%p\n", ktep->val[3]); 5621153323Srodrigc qprintf(" Pid %ld, cpu %ld\n", 5622153323Srodrigc (long)ktep->val[5], 5623153323Srodrigc (long)ktep->val[4]); 5624153323Srodrigc qprintf("-----------------------\n"); 5625153323Srodrigc } else if ((__psint_t)ktep->val[7] == 1) { 5626153323Srodrigc if ((__psint_t)ktep->val[1] == 1) 5627153323Srodrigc qprintf("LOCK "); 5628153323Srodrigc else if ((__psint_t)ktep->val[1] == 2) 5629153323Srodrigc qprintf("TRYLOCK %ld ", 5630153323Srodrigc (long)ktep->val[2]); 5631153323Srodrigc else if ((__psint_t)ktep->val[1] == 3) 5632153323Srodrigc qprintf("UNLOCK "); 5633153323Srodrigc else qprintf("UNKNOWN "); 5634153323Srodrigc qprintf("ip 0x%p %lld %ld\n", 5635153323Srodrigc ktep->val[0], (unsigned long long) 5636153323Srodrigc ((xfs_inode_t*)ktep->val[0])->i_ino, 5637153323Srodrigc (long)ktep->val[6]); 5638153323Srodrigc qprintf("raddr 0x%p\n", ktep->val[3]); 5639153323Srodrigc qprintf(" Pid %ld, cpu %ld\n", 5640153323Srodrigc (long)ktep->val[5], 5641153323Srodrigc (long)ktep->val[4]); 5642153323Srodrigc qprintf("-----------------------\n"); 5643153323Srodrigc } 5644153323Srodrigc 5645153323Srodrigc ktep = ktrace_next(ip->i_lock_trace, &kts); 5646153323Srodrigc } 5647153323Srodrigc} 5648153323Srodrigc 5649153323Srodrigc/* 5650153323Srodrigc * Print out the last "count" entries in the inode lock trace buffer. 5651153323Srodrigc * The "a" is for "all" entries. 5652153323Srodrigc */ 5653153323Srodrigcstatic void 5654153323Srodrigcxfsidbg_xailock_trace(int count) 5655153323Srodrigc{ 5656153323Srodrigc ktrace_entry_t *ktep; 5657153323Srodrigc ktrace_snap_t kts; 5658153323Srodrigc int nentries; 5659153323Srodrigc int skip_entries; 5660153323Srodrigc 5661153323Srodrigc if (xfs_ilock_trace_buf == NULL) { 5662153323Srodrigc qprintf("The xfs inode lock trace buffer is not initialized\n"); return; 5663153323Srodrigc } 5664153323Srodrigc nentries = ktrace_nentries(xfs_ilock_trace_buf); 5665153323Srodrigc if (count == -1) { 5666153323Srodrigc count = nentries; 5667153323Srodrigc } 5668153323Srodrigc if ((count <= 0) || (count > nentries)) { 5669153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 5670153323Srodrigc return; 5671153323Srodrigc } 5672153323Srodrigc 5673153323Srodrigc ktep = ktrace_first(xfs_ilock_trace_buf, &kts); 5674153323Srodrigc if (count != nentries) { 5675153323Srodrigc /* 5676153323Srodrigc * Skip the total minus the number to look at minus one 5677153323Srodrigc * for the entry returned by ktrace_first(). 5678153323Srodrigc */ 5679153323Srodrigc skip_entries = nentries - count - 1; 5680153323Srodrigc ktep = ktrace_skip(xfs_ilock_trace_buf, skip_entries, &kts); 5681153323Srodrigc if (ktep == NULL) { 5682153323Srodrigc qprintf("Skipped them all\n"); 5683153323Srodrigc return; 5684153323Srodrigc } 5685153323Srodrigc } 5686153323Srodrigc while (ktep != NULL) { 5687153323Srodrigc xfsidbg_xilock_trace_entry(ktep); 5688153323Srodrigc ktep = ktrace_next(xfs_ilock_trace_buf, &kts); 5689153323Srodrigc } 5690153323Srodrigc} 5691153323Srodrigc#endif 5692153323Srodrigc 5693153323Srodrigc/* 5694153323Srodrigc * Compute & print buffer's checksum. 5695153323Srodrigc */ 5696153323Srodrigcstatic void 5697153323Srodrigcxfsidbg_xchksum(uint *addr) 5698153323Srodrigc{ 5699153323Srodrigc uint i, chksum = 0; 5700153323Srodrigc 5701153323Srodrigc if (((__psint_t)addr) == ((__psint_t)-1)) { 5702153323Srodrigc qprintf("USAGE xchksum <address>\n"); 5703153323Srodrigc qprintf(" length is set with xarg\n"); 5704153323Srodrigc } else { 5705153323Srodrigc for (i=0; i<xargument; i++) { 5706153323Srodrigc chksum ^= *addr; 5707153323Srodrigc addr++; 5708153323Srodrigc } 5709153323Srodrigc qprintf("chksum (0x%x) length (%d)\n", chksum, xargument); 5710153323Srodrigc } 5711153323Srodrigc} /* xfsidbg_xchksum */ 5712153323Srodrigc 5713153323Srodrigc/* 5714153323Srodrigc * Print an xfs_da_args structure. 5715153323Srodrigc */ 5716153323Srodrigcstatic void 5717153323Srodrigcxfsidbg_xdaargs(xfs_da_args_t *n) 5718153323Srodrigc{ 5719153323Srodrigc char *ch; 5720153323Srodrigc int i; 5721153323Srodrigc 5722153323Srodrigc kdb_printf(" name \""); 5723153323Srodrigc for (i = 0; i < n->namelen; i++) { 5724153323Srodrigc kdb_printf("%c", n->name[i]); 5725153323Srodrigc } 5726153323Srodrigc kdb_printf("\"(%d) value ", n->namelen); 5727153323Srodrigc if (n->value) { 5728153323Srodrigc kdb_printf("\""); 5729153323Srodrigc ch = n->value; 5730153323Srodrigc for (i = 0; (i < n->valuelen) && (i < 32); ch++, i++) { 5731153323Srodrigc switch(*ch) { 5732153323Srodrigc case '\n': kdb_printf("\n"); break; 5733153323Srodrigc case '\b': kdb_printf("\b"); break; 5734153323Srodrigc case '\t': kdb_printf("\t"); break; 5735153323Srodrigc default: kdb_printf("%c", *ch); break; 5736153323Srodrigc } 5737153323Srodrigc } 5738153323Srodrigc if (i == 32) 5739153323Srodrigc kdb_printf("..."); 5740153323Srodrigc kdb_printf("\"(%d)\n", n->valuelen); 5741153323Srodrigc } else { 5742153323Srodrigc kdb_printf("(NULL)(%d)\n", n->valuelen); 5743153323Srodrigc } 5744153323Srodrigc kdb_printf(" hashval 0x%x whichfork %d flags <", 5745153323Srodrigc (uint_t)n->hashval, n->whichfork); 5746153323Srodrigc if (n->flags & ATTR_ROOT) 5747153323Srodrigc kdb_printf("ROOT "); 5748153323Srodrigc if (n->flags & ATTR_SECURE) 5749153323Srodrigc kdb_printf("SECURE "); 5750153323Srodrigc if (n->flags & ATTR_CREATE) 5751153323Srodrigc kdb_printf("CREATE "); 5752153323Srodrigc if (n->flags & ATTR_REPLACE) 5753153323Srodrigc kdb_printf("REPLACE "); 5754153323Srodrigc if (n->flags & XFS_ATTR_INCOMPLETE) 5755153323Srodrigc kdb_printf("INCOMPLETE "); 5756153323Srodrigc i = ~(ATTR_ROOT | ATTR_SECURE | 5757153323Srodrigc ATTR_CREATE | ATTR_REPLACE | XFS_ATTR_INCOMPLETE); 5758153323Srodrigc if ((n->flags & i) != 0) 5759153323Srodrigc kdb_printf("0x%x", n->flags & i); 5760153323Srodrigc kdb_printf(">\n"); 5761153323Srodrigc kdb_printf(" rename %d justcheck %d addname %d oknoent %d\n", 5762153323Srodrigc n->rename, n->justcheck, n->addname, n->oknoent); 5763153323Srodrigc kdb_printf(" leaf: blkno %d index %d rmtblkno %d rmtblkcnt %d\n", 5764153323Srodrigc n->blkno, n->index, n->rmtblkno, n->rmtblkcnt); 5765153323Srodrigc kdb_printf(" leaf2: blkno %d index %d rmtblkno %d rmtblkcnt %d\n", 5766153323Srodrigc n->blkno2, n->index2, n->rmtblkno2, n->rmtblkcnt2); 5767153323Srodrigc kdb_printf(" inumber %llu dp 0x%p firstblock 0x%p flist 0x%p\n", 5768153323Srodrigc (unsigned long long) n->inumber, 5769153323Srodrigc n->dp, n->firstblock, n->flist); 5770153323Srodrigc kdb_printf(" trans 0x%p total %d\n", 5771153323Srodrigc n->trans, n->total); 5772153323Srodrigc} 5773153323Srodrigc 5774153323Srodrigc/* 5775153323Srodrigc * Print a da buffer structure. 5776153323Srodrigc */ 5777153323Srodrigcstatic void 5778153323Srodrigcxfsidbg_xdabuf(xfs_dabuf_t *dabuf) 5779153323Srodrigc{ 5780153323Srodrigc int i; 5781153323Srodrigc 5782153323Srodrigc kdb_printf("nbuf %d dirty %d bbcount %d data 0x%p bps", 5783153323Srodrigc dabuf->nbuf, dabuf->dirty, dabuf->bbcount, dabuf->data); 5784153323Srodrigc for (i = 0; i < dabuf->nbuf; i++) 5785153323Srodrigc kdb_printf(" %d:0x%p", i, dabuf->bps[i]); 5786153323Srodrigc kdb_printf("\n"); 5787153323Srodrigc#ifdef XFS_DABUF_DEBUG 5788153323Srodrigc kdb_printf(" ra 0x%x prev 0x%x next 0x%x dev 0x%x blkno 0x%x\n", 5789153323Srodrigc dabuf->ra, dabuf->prev, dabuf->next, dabuf->dev, dabuf->blkno); 5790153323Srodrigc#endif 5791153323Srodrigc} 5792153323Srodrigc 5793153323Srodrigc/* 5794153323Srodrigc * Print a directory/attribute internal node block. 5795153323Srodrigc */ 5796153323Srodrigcstatic void 5797153323Srodrigcxfsidbg_xdanode(xfs_da_intnode_t *node) 5798153323Srodrigc{ 5799153323Srodrigc xfs_da_node_hdr_t *h; 5800153323Srodrigc xfs_da_blkinfo_t *i; 5801153323Srodrigc xfs_da_node_entry_t *e; 5802153323Srodrigc int j; 5803153323Srodrigc 5804153323Srodrigc h = &node->hdr; 5805153323Srodrigc i = &h->info; 5806153323Srodrigc kdb_printf("hdr info forw 0x%x back 0x%x magic 0x%x\n", 5807153323Srodrigc INT_GET(i->forw, ARCH_CONVERT), INT_GET(i->back, ARCH_CONVERT), INT_GET(i->magic, ARCH_CONVERT)); 5808153323Srodrigc kdb_printf("hdr count %d level %d\n", 5809153323Srodrigc INT_GET(h->count, ARCH_CONVERT), INT_GET(h->level, ARCH_CONVERT)); 5810153323Srodrigc for (j = 0, e = node->btree; j < INT_GET(h->count, ARCH_CONVERT); j++, e++) { 5811153323Srodrigc kdb_printf("btree %d hashval 0x%x before 0x%x\n", 5812153323Srodrigc j, (uint_t)INT_GET(e->hashval, ARCH_CONVERT), INT_GET(e->before, ARCH_CONVERT)); 5813153323Srodrigc } 5814153323Srodrigc} 5815153323Srodrigc 5816153323Srodrigc/* 5817153323Srodrigc * Print an xfs_da_state_blk structure. 5818153323Srodrigc */ 5819153323Srodrigcstatic void 5820153323Srodrigcxfsidbg_xdastate(xfs_da_state_t *s) 5821153323Srodrigc{ 5822153323Srodrigc xfs_da_state_blk_t *eblk; 5823153323Srodrigc 5824153323Srodrigc kdb_printf("args 0x%p mp 0x%p blocksize %u node_ents %u inleaf %u\n", 5825153323Srodrigc s->args, s->mp, s->blocksize, s->node_ents, s->inleaf); 5826153323Srodrigc if (s->args) 5827153323Srodrigc xfsidbg_xdaargs(s->args); 5828153323Srodrigc 5829153323Srodrigc kdb_printf("path: "); 5830153323Srodrigc xfs_dastate_path(&s->path); 5831153323Srodrigc 5832153323Srodrigc kdb_printf("altpath: "); 5833153323Srodrigc xfs_dastate_path(&s->altpath); 5834153323Srodrigc 5835153323Srodrigc eblk = &s->extrablk; 5836153323Srodrigc kdb_printf("extra: valid %d, after %d\n", s->extravalid, s->extraafter); 5837153323Srodrigc kdb_printf(" bp 0x%p blkno 0x%x ", eblk->bp, eblk->blkno); 5838153323Srodrigc kdb_printf("index %d hashval 0x%x\n", eblk->index, (uint_t)eblk->hashval); 5839153323Srodrigc} 5840153323Srodrigc 5841153323Srodrigc/* 5842153323Srodrigc * Print a directory leaf block. 5843153323Srodrigc */ 5844153323Srodrigcstatic void 5845153323Srodrigcxfsidbg_xdirleaf(xfs_dir_leafblock_t *leaf) 5846153323Srodrigc{ 5847153323Srodrigc xfs_dir_leaf_hdr_t *h; 5848153323Srodrigc xfs_da_blkinfo_t *i; 5849153323Srodrigc xfs_dir_leaf_map_t *m; 5850153323Srodrigc xfs_dir_leaf_entry_t *e; 5851153323Srodrigc xfs_dir_leaf_name_t *n; 5852153323Srodrigc int j, k; 5853153323Srodrigc xfs_ino_t ino; 5854153323Srodrigc 5855153323Srodrigc h = &leaf->hdr; 5856153323Srodrigc i = &h->info; 5857153323Srodrigc kdb_printf("hdr info forw 0x%x back 0x%x magic 0x%x\n", 5858153323Srodrigc INT_GET(i->forw, ARCH_CONVERT), INT_GET(i->back, ARCH_CONVERT), INT_GET(i->magic, ARCH_CONVERT)); 5859153323Srodrigc kdb_printf("hdr count %d namebytes %d firstused %d holes %d\n", 5860153323Srodrigc INT_GET(h->count, ARCH_CONVERT), INT_GET(h->namebytes, ARCH_CONVERT), INT_GET(h->firstused, ARCH_CONVERT), h->holes); 5861153323Srodrigc for (j = 0, m = h->freemap; j < XFS_DIR_LEAF_MAPSIZE; j++, m++) { 5862153323Srodrigc kdb_printf("hdr freemap %d base %d size %d\n", 5863153323Srodrigc j, INT_GET(m->base, ARCH_CONVERT), INT_GET(m->size, ARCH_CONVERT)); 5864153323Srodrigc } 5865153323Srodrigc for (j = 0, e = leaf->entries; j < INT_GET(h->count, ARCH_CONVERT); j++, e++) { 5866153323Srodrigc n = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(e->nameidx, ARCH_CONVERT)); 5867159451Srodrigc XFS_DIR_SF_GET_DIRINO(&n->inumber, &ino); 5868153323Srodrigc kdb_printf("leaf %d hashval 0x%x nameidx %d inumber %llu ", 5869153323Srodrigc j, (uint_t)INT_GET(e->hashval, ARCH_CONVERT), 5870153323Srodrigc INT_GET(e->nameidx, ARCH_CONVERT), 5871153323Srodrigc (unsigned long long)ino); 5872153323Srodrigc kdb_printf("namelen %d name \"", e->namelen); 5873153323Srodrigc for (k = 0; k < e->namelen; k++) 5874153323Srodrigc kdb_printf("%c", n->name[k]); 5875153323Srodrigc kdb_printf("\"\n"); 5876153323Srodrigc } 5877153323Srodrigc} 5878153323Srodrigc 5879153323Srodrigc/* 5880153323Srodrigc * Print a directory v2 data block, single or multiple. 5881153323Srodrigc */ 5882153323Srodrigcstatic void 5883153323Srodrigcxfs_dir2data(void *addr, int size) 5884153323Srodrigc{ 5885153323Srodrigc xfs_dir2_data_t *db; 5886153323Srodrigc xfs_dir2_block_t *bb; 5887153323Srodrigc xfs_dir2_data_hdr_t *h; 5888153323Srodrigc xfs_dir2_data_free_t *m; 5889153323Srodrigc xfs_dir2_data_entry_t *e; 5890153323Srodrigc xfs_dir2_data_unused_t *u; 5891153323Srodrigc xfs_dir2_leaf_entry_t *l=NULL; 5892153323Srodrigc int j, k; 5893153323Srodrigc char *p; 5894153323Srodrigc char *t; 5895153323Srodrigc xfs_dir2_block_tail_t *tail=NULL; 5896153323Srodrigc 5897153323Srodrigc db = (xfs_dir2_data_t *)addr; 5898153323Srodrigc bb = (xfs_dir2_block_t *)addr; 5899153323Srodrigc h = &db->hdr; 5900153323Srodrigc kdb_printf("hdr magic 0x%x (%s)\nhdr bestfree", INT_GET(h->magic, ARCH_CONVERT), 5901153323Srodrigc INT_GET(h->magic, ARCH_CONVERT) == XFS_DIR2_DATA_MAGIC ? "DATA" : 5902153323Srodrigc (INT_GET(h->magic, ARCH_CONVERT) == XFS_DIR2_BLOCK_MAGIC ? "BLOCK" : "")); 5903153323Srodrigc for (j = 0, m = h->bestfree; j < XFS_DIR2_DATA_FD_COUNT; j++, m++) { 5904153323Srodrigc kdb_printf(" %d: 0x%x@0x%x", j, INT_GET(m->length, ARCH_CONVERT), INT_GET(m->offset, ARCH_CONVERT)); 5905153323Srodrigc } 5906153323Srodrigc kdb_printf("\n"); 5907153323Srodrigc if (INT_GET(h->magic, ARCH_CONVERT) == XFS_DIR2_DATA_MAGIC) 5908153323Srodrigc t = (char *)db + size; 5909153323Srodrigc else { 5910153323Srodrigc /* XFS_DIR2_BLOCK_TAIL_P */ 5911153323Srodrigc tail = (xfs_dir2_block_tail_t *) 5912153323Srodrigc ((char *)bb + size - sizeof(xfs_dir2_block_tail_t)); 5913159451Srodrigc l = XFS_DIR2_BLOCK_LEAF_P(tail); 5914153323Srodrigc t = (char *)l; 5915153323Srodrigc } 5916153323Srodrigc for (p = (char *)(h + 1); p < t; ) { 5917153323Srodrigc u = (xfs_dir2_data_unused_t *)p; 5918153323Srodrigc if (u->freetag == XFS_DIR2_DATA_FREE_TAG) { 5919153323Srodrigc kdb_printf("0x%lx unused freetag 0x%x length 0x%x tag 0x%x\n", 5920153323Srodrigc (unsigned long) (p - (char *)addr), 5921153323Srodrigc INT_GET(u->freetag, ARCH_CONVERT), 5922153323Srodrigc INT_GET(u->length, ARCH_CONVERT), 5923159451Srodrigc INT_GET(*XFS_DIR2_DATA_UNUSED_TAG_P(u), ARCH_CONVERT)); 5924153323Srodrigc p += INT_GET(u->length, ARCH_CONVERT); 5925153323Srodrigc continue; 5926153323Srodrigc } 5927153323Srodrigc e = (xfs_dir2_data_entry_t *)p; 5928153323Srodrigc kdb_printf("0x%lx entry inumber %llu namelen %d name \"", 5929153323Srodrigc (unsigned long) (p - (char *)addr), 5930153323Srodrigc (unsigned long long) INT_GET(e->inumber, ARCH_CONVERT), 5931153323Srodrigc e->namelen); 5932153323Srodrigc for (k = 0; k < e->namelen; k++) 5933153323Srodrigc kdb_printf("%c", e->name[k]); 5934153323Srodrigc kdb_printf("\" tag 0x%x\n", INT_GET(*XFS_DIR2_DATA_ENTRY_TAG_P(e), ARCH_CONVERT)); 5935153323Srodrigc p += XFS_DIR2_DATA_ENTSIZE(e->namelen); 5936153323Srodrigc } 5937153323Srodrigc if (INT_GET(h->magic, ARCH_CONVERT) == XFS_DIR2_DATA_MAGIC) 5938153323Srodrigc return; 5939153323Srodrigc for (j = 0; j < INT_GET(tail->count, ARCH_CONVERT); j++, l++) { 5940153323Srodrigc kdb_printf("0x%lx leaf %d hashval 0x%x address 0x%x (byte 0x%x)\n", 5941153323Srodrigc (unsigned long) ((char *)l - (char *)addr), j, 5942153323Srodrigc (uint_t)INT_GET(l->hashval, ARCH_CONVERT), 5943153323Srodrigc INT_GET(l->address, ARCH_CONVERT), 5944153323Srodrigc /* XFS_DIR2_DATAPTR_TO_BYTE */ 5945153323Srodrigc INT_GET(l->address, ARCH_CONVERT) << XFS_DIR2_DATA_ALIGN_LOG); 5946153323Srodrigc } 5947153323Srodrigc kdb_printf("0x%lx tail count %d\n", 5948153323Srodrigc (unsigned long) ((char *)tail - (char *)addr), 5949153323Srodrigc INT_GET(tail->count, ARCH_CONVERT)); 5950153323Srodrigc} 5951153323Srodrigc 5952153323Srodrigcstatic void 5953153323Srodrigcxfs_dir2leaf(xfs_dir2_leaf_t *leaf, int size) 5954153323Srodrigc{ 5955153323Srodrigc xfs_dir2_leaf_hdr_t *h; 5956153323Srodrigc xfs_da_blkinfo_t *i; 5957153323Srodrigc xfs_dir2_leaf_entry_t *e; 5958153323Srodrigc xfs_dir2_data_off_t *b; 5959153323Srodrigc xfs_dir2_leaf_tail_t *t; 5960153323Srodrigc int j; 5961153323Srodrigc 5962153323Srodrigc h = &leaf->hdr; 5963153323Srodrigc i = &h->info; 5964153323Srodrigc e = leaf->ents; 5965153323Srodrigc kdb_printf("hdr info forw 0x%x back 0x%x magic 0x%x\n", 5966153323Srodrigc INT_GET(i->forw, ARCH_CONVERT), INT_GET(i->back, ARCH_CONVERT), INT_GET(i->magic, ARCH_CONVERT)); 5967153323Srodrigc kdb_printf("hdr count %d stale %d\n", INT_GET(h->count, ARCH_CONVERT), INT_GET(h->stale, ARCH_CONVERT)); 5968153323Srodrigc for (j = 0; j < INT_GET(h->count, ARCH_CONVERT); j++, e++) { 5969153323Srodrigc kdb_printf("0x%lx ent %d hashval 0x%x address 0x%x (byte 0x%x)\n", 5970153323Srodrigc (unsigned long) ((char *)e - (char *)leaf), j, 5971153323Srodrigc (uint_t)INT_GET(e->hashval, ARCH_CONVERT), 5972153323Srodrigc INT_GET(e->address, ARCH_CONVERT), 5973153323Srodrigc /* XFS_DIR2_DATAPTR_TO_BYTE */ 5974153323Srodrigc INT_GET(e->address, ARCH_CONVERT) << XFS_DIR2_DATA_ALIGN_LOG); 5975153323Srodrigc } 5976153323Srodrigc if (INT_GET(i->magic, ARCH_CONVERT) == XFS_DIR2_LEAFN_MAGIC) 5977153323Srodrigc return; 5978153323Srodrigc /* XFS_DIR2_LEAF_TAIL_P */ 5979153323Srodrigc t = (xfs_dir2_leaf_tail_t *)((char *)leaf + size - sizeof(*t)); 5980159451Srodrigc b = XFS_DIR2_LEAF_BESTS_P(t); 5981153323Srodrigc for (j = 0; j < INT_GET(t->bestcount, ARCH_CONVERT); j++, b++) { 5982153323Srodrigc kdb_printf("0x%lx best %d 0x%x\n", 5983153323Srodrigc (unsigned long) ((char *)b - (char *)leaf), j, 5984153323Srodrigc INT_GET(*b, ARCH_CONVERT)); 5985153323Srodrigc } 5986153323Srodrigc kdb_printf("tail bestcount %d\n", INT_GET(t->bestcount, ARCH_CONVERT)); 5987153323Srodrigc} 5988153323Srodrigc 5989153323Srodrigc/* 5990153323Srodrigc * Print a shortform directory. 5991153323Srodrigc */ 5992153323Srodrigcstatic void 5993153323Srodrigcxfsidbg_xdirsf(xfs_dir_shortform_t *s) 5994153323Srodrigc{ 5995153323Srodrigc xfs_dir_sf_hdr_t *sfh; 5996153323Srodrigc xfs_dir_sf_entry_t *sfe; 5997153323Srodrigc xfs_ino_t ino; 5998153323Srodrigc int i, j; 5999153323Srodrigc 6000153323Srodrigc sfh = &s->hdr; 6001159451Srodrigc XFS_DIR_SF_GET_DIRINO(&sfh->parent, &ino); 6002153323Srodrigc kdb_printf("hdr parent %llu", (unsigned long long)ino); 6003153323Srodrigc kdb_printf(" count %d\n", sfh->count); 6004153323Srodrigc for (i = 0, sfe = s->list; i < sfh->count; i++) { 6005159451Srodrigc XFS_DIR_SF_GET_DIRINO(&sfe->inumber, &ino); 6006153323Srodrigc kdb_printf("entry %d inumber %llu", i, (unsigned long long)ino); 6007153323Srodrigc kdb_printf(" namelen %d name \"", sfe->namelen); 6008153323Srodrigc for (j = 0; j < sfe->namelen; j++) 6009153323Srodrigc kdb_printf("%c", sfe->name[j]); 6010153323Srodrigc kdb_printf("\"\n"); 6011153323Srodrigc sfe = XFS_DIR_SF_NEXTENTRY(sfe); 6012153323Srodrigc } 6013153323Srodrigc} 6014153323Srodrigc 6015153323Srodrigc/* 6016153323Srodrigc * Print a shortform v2 directory. 6017153323Srodrigc */ 6018153323Srodrigcstatic void 6019153323Srodrigcxfsidbg_xdir2sf(xfs_dir2_sf_t *s) 6020153323Srodrigc{ 6021153323Srodrigc xfs_dir2_sf_hdr_t *sfh; 6022153323Srodrigc xfs_dir2_sf_entry_t *sfe; 6023153323Srodrigc xfs_ino_t ino; 6024153323Srodrigc int i, j; 6025153323Srodrigc 6026153323Srodrigc sfh = &s->hdr; 6027159451Srodrigc ino = XFS_DIR2_SF_GET_INUMBER(s, &sfh->parent); 6028153323Srodrigc kdb_printf("hdr count %d i8count %d parent %llu\n", 6029153323Srodrigc sfh->count, sfh->i8count, (unsigned long long) ino); 6030153323Srodrigc for (i = 0, sfe = XFS_DIR2_SF_FIRSTENTRY(s); i < sfh->count; i++) { 6031159451Srodrigc ino = XFS_DIR2_SF_GET_INUMBER(s, XFS_DIR2_SF_INUMBERP(sfe)); 6032153323Srodrigc kdb_printf("entry %d inumber %llu offset 0x%x namelen %d name \"", 6033153323Srodrigc i, (unsigned long long) ino, 6034159451Srodrigc XFS_DIR2_SF_GET_OFFSET(sfe), 6035153323Srodrigc sfe->namelen); 6036153323Srodrigc for (j = 0; j < sfe->namelen; j++) 6037153323Srodrigc kdb_printf("%c", sfe->name[j]); 6038153323Srodrigc kdb_printf("\"\n"); 6039153323Srodrigc sfe = XFS_DIR2_SF_NEXTENTRY(s, sfe); 6040153323Srodrigc } 6041153323Srodrigc} 6042153323Srodrigc 6043153323Srodrigc/* 6044153323Srodrigc * Print a node-form v2 directory freemap block. 6045153323Srodrigc */ 6046153323Srodrigcstatic void 6047153323Srodrigcxfsidbg_xdir2free(xfs_dir2_free_t *f) 6048153323Srodrigc{ 6049153323Srodrigc int i; 6050153323Srodrigc 6051153323Srodrigc kdb_printf("hdr magic 0x%x firstdb %d nvalid %d nused %d\n", 6052153323Srodrigc INT_GET(f->hdr.magic, ARCH_CONVERT), INT_GET(f->hdr.firstdb, ARCH_CONVERT), INT_GET(f->hdr.nvalid, ARCH_CONVERT), INT_GET(f->hdr.nused, ARCH_CONVERT)); 6053153323Srodrigc for (i = 0; i < INT_GET(f->hdr.nvalid, ARCH_CONVERT); i++) { 6054153323Srodrigc kdb_printf("entry %d db %d count %d\n", 6055153323Srodrigc i, i + INT_GET(f->hdr.firstdb, ARCH_CONVERT), INT_GET(f->bests[i], ARCH_CONVERT)); 6056153323Srodrigc } 6057153323Srodrigc} 6058153323Srodrigc 6059153323Srodrigc#ifdef XFS_DIR_TRACE 6060153323Srodrigc/* 6061153323Srodrigc * Print out the last "count" entries in the directory trace buffer. 6062153323Srodrigc */ 6063153323Srodrigcstatic void 6064153323Srodrigcxfsidbg_xdirtrace(int count) 6065153323Srodrigc{ 6066153323Srodrigc ktrace_entry_t *ktep; 6067153323Srodrigc ktrace_snap_t kts; 6068153323Srodrigc int nentries; 6069153323Srodrigc int skip_entries; 6070153323Srodrigc 6071153323Srodrigc if (xfs_dir_trace_buf == NULL) { 6072153323Srodrigc qprintf("The xfs directory trace buffer is not initialized\n"); 6073153323Srodrigc return; 6074153323Srodrigc } 6075153323Srodrigc nentries = ktrace_nentries(xfs_dir_trace_buf); 6076153323Srodrigc if (count == -1) { 6077153323Srodrigc count = nentries; 6078153323Srodrigc } 6079153323Srodrigc if ((count <= 0) || (count > nentries)) { 6080153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 6081153323Srodrigc return; 6082153323Srodrigc } 6083153323Srodrigc 6084153323Srodrigc ktep = ktrace_first(xfs_dir_trace_buf, &kts); 6085153323Srodrigc if (count != nentries) { 6086153323Srodrigc /* 6087153323Srodrigc * Skip the total minus the number to look at minus one 6088153323Srodrigc * for the entry returned by ktrace_first(). 6089153323Srodrigc */ 6090153323Srodrigc skip_entries = nentries - count - 1; 6091153323Srodrigc ktep = ktrace_skip(xfs_dir_trace_buf, skip_entries, &kts); 6092153323Srodrigc if (ktep == NULL) { 6093153323Srodrigc qprintf("Skipped them all\n"); 6094153323Srodrigc return; 6095153323Srodrigc } 6096153323Srodrigc } 6097153323Srodrigc while (ktep != NULL) { 6098153323Srodrigc if (xfs_dir_trace_entry(ktep)) 6099153323Srodrigc qprintf("\n"); 6100153323Srodrigc ktep = ktrace_next(xfs_dir_trace_buf, &kts); 6101153323Srodrigc } 6102153323Srodrigc} 6103153323Srodrigc#endif 6104153323Srodrigc 6105153323Srodrigc#ifdef XFS_DIR2_TRACE 6106153323Srodrigc/* 6107153323Srodrigc * Print out the last "count" entries in the directory v2 trace buffer. 6108153323Srodrigc */ 6109153323Srodrigcstatic void 6110153323Srodrigcxfsidbg_xdir2atrace(int count) 6111153323Srodrigc{ 6112153323Srodrigc ktrace_entry_t *ktep; 6113153323Srodrigc ktrace_snap_t kts; 6114153323Srodrigc int nentries; 6115153323Srodrigc int skip_entries; 6116153323Srodrigc 6117153323Srodrigc if (xfs_dir2_trace_buf == NULL) { 6118153323Srodrigc qprintf("The xfs dirv2 trace buffer is not initialized\n"); 6119153323Srodrigc return; 6120153323Srodrigc } 6121153323Srodrigc nentries = ktrace_nentries(xfs_dir2_trace_buf); 6122153323Srodrigc if (count == -1) { 6123153323Srodrigc count = nentries; 6124153323Srodrigc } 6125153323Srodrigc if ((count <= 0) || (count > nentries)) { 6126153323Srodrigc qprintf("Invalid count. There are %d entries.\n", nentries); 6127153323Srodrigc return; 6128153323Srodrigc } 6129153323Srodrigc 6130153323Srodrigc ktep = ktrace_first(xfs_dir2_trace_buf, &kts); 6131153323Srodrigc if (count != nentries) { 6132153323Srodrigc /* 6133153323Srodrigc * Skip the total minus the number to look at minus one 6134153323Srodrigc * for the entry returned by ktrace_first(). 6135153323Srodrigc */ 6136153323Srodrigc skip_entries = nentries - count - 1; 6137153323Srodrigc ktep = ktrace_skip(xfs_dir2_trace_buf, skip_entries, &kts); 6138153323Srodrigc if (ktep == NULL) { 6139153323Srodrigc qprintf("Skipped them all\n"); 6140153323Srodrigc return; 6141153323Srodrigc } 6142153323Srodrigc } 6143153323Srodrigc while (ktep != NULL) { 6144153323Srodrigc if (xfs_dir2_trace_entry(ktep)) 6145153323Srodrigc qprintf("\n"); 6146153323Srodrigc ktep = ktrace_next(xfs_dir2_trace_buf, &kts); 6147153323Srodrigc } 6148153323Srodrigc} 6149153323Srodrigc 6150153323Srodrigc/* 6151153323Srodrigc * Print out the directory v2 trace buffer attached to the given inode. 6152153323Srodrigc */ 6153153323Srodrigcstatic void 6154153323Srodrigcxfsidbg_xdir2itrace(xfs_inode_t *ip) 6155153323Srodrigc{ 6156153323Srodrigc ktrace_entry_t *ktep; 6157153323Srodrigc ktrace_snap_t kts; 6158153323Srodrigc 6159153323Srodrigc if (ip->i_dir_trace == NULL) { 6160153323Srodrigc qprintf("The inode trace buffer is not initialized\n"); 6161153323Srodrigc return; 6162153323Srodrigc } 6163153323Srodrigc 6164153323Srodrigc ktep = ktrace_first(ip->i_dir_trace, &kts); 6165153323Srodrigc while (ktep != NULL) { 6166153323Srodrigc if (xfs_dir2_trace_entry(ktep)) 6167153323Srodrigc qprintf("\n"); 6168153323Srodrigc ktep = ktrace_next(ip->i_dir_trace, &kts); 6169153323Srodrigc } 6170153323Srodrigc} 6171153323Srodrigc#endif 6172153323Srodrigc 6173153323Srodrigc/* 6174159451Srodrigc * Print xfs extent records. 6175153323Srodrigc */ 6176153323Srodrigcstatic void 6177153323Srodrigcxfsidbg_xexlist(xfs_inode_t *ip) 6178153323Srodrigc{ 6179153323Srodrigc xfs_xexlist_fork(ip, XFS_DATA_FORK); 6180153323Srodrigc if (XFS_IFORK_Q(ip)) 6181153323Srodrigc xfs_xexlist_fork(ip, XFS_ATTR_FORK); 6182153323Srodrigc} 6183153323Srodrigc 6184153323Srodrigc/* 6185159451Srodrigc * Print an xfs free-extent records. 6186153323Srodrigc */ 6187153323Srodrigcstatic void 6188153323Srodrigcxfsidbg_xflist(xfs_bmap_free_t *flist) 6189153323Srodrigc{ 6190153323Srodrigc xfs_bmap_free_item_t *item; 6191153323Srodrigc 6192153323Srodrigc kdb_printf("flist@0x%p: first 0x%p count %d low %d\n", flist, 6193153323Srodrigc flist->xbf_first, flist->xbf_count, flist->xbf_low); 6194153323Srodrigc for (item = flist->xbf_first; item; item = item->xbfi_next) { 6195153323Srodrigc kdb_printf("item@0x%p: startblock %Lx blockcount %d", item, 6196153323Srodrigc (xfs_dfsbno_t)item->xbfi_startblock, 6197153323Srodrigc item->xbfi_blockcount); 6198153323Srodrigc } 6199153323Srodrigc} 6200153323Srodrigc 6201153323Srodrigc/* 6202153323Srodrigc * Print out the help messages for these functions. 6203153323Srodrigc */ 6204153323Srodrigcstatic void 6205153323Srodrigcxfsidbg_xhelp(void) 6206153323Srodrigc{ 6207153323Srodrigc struct xif *p; 6208153323Srodrigc 6209153323Srodrigc for (p = xfsidbg_funcs; p->name; p++) 6210153323Srodrigc kdb_printf("%-16s %s %s\n", p->name, p->args, p->help); 6211153323Srodrigc} 6212153323Srodrigc 6213153323Srodrigc/* 6214153323Srodrigc * Print out an XFS in-core log structure. 6215153323Srodrigc */ 6216153323Srodrigcstatic void 6217153323Srodrigcxfsidbg_xiclog(xlog_in_core_t *iclog) 6218153323Srodrigc{ 6219153323Srodrigc int i; 6220153323Srodrigc static char *ic_flags[] = { 6221153323Srodrigc "ACTIVE", /* 0x0001 */ 6222153323Srodrigc "WANT_SYNC", /* 0x0002 */ 6223153323Srodrigc "SYNCING", /* 0X0004 */ 6224153323Srodrigc "DONE_SYNC", /* 0X0008 */ 6225153323Srodrigc "DO_CALLBACK", /* 0X0010 */ 6226153323Srodrigc "CALLBACK", /* 0X0020 */ 6227153323Srodrigc "DIRTY", /* 0X0040 */ 6228153323Srodrigc "IOERROR", /* 0X0080 */ 6229153323Srodrigc "NOTUSED", /* 0X8000 */ 6230159451Srodrigc NULL 6231153323Srodrigc }; 6232153323Srodrigc 6233153323Srodrigc kdb_printf("xlog_in_core/header at 0x%p/0x%p\n", 6234153323Srodrigc iclog, iclog->hic_data); 6235153323Srodrigc kdb_printf("magicno: %x cycle: %d version: %d lsn: 0x%Lx\n", 6236153323Srodrigc INT_GET(iclog->ic_header.h_magicno, ARCH_CONVERT), INT_GET(iclog->ic_header.h_cycle, ARCH_CONVERT), 6237153323Srodrigc INT_GET(iclog->ic_header.h_version, ARCH_CONVERT), INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)); 6238153323Srodrigc kdb_printf("tail_lsn: 0x%Lx len: %d prev_block: %d num_ops: %d\n", 6239153323Srodrigc INT_GET(iclog->ic_header.h_tail_lsn, ARCH_CONVERT), INT_GET(iclog->ic_header.h_len, ARCH_CONVERT), 6240153323Srodrigc INT_GET(iclog->ic_header.h_prev_block, ARCH_CONVERT), INT_GET(iclog->ic_header.h_num_logops, ARCH_CONVERT)); 6241153323Srodrigc kdb_printf("cycle_data: "); 6242153323Srodrigc for (i=0; i<(iclog->ic_size>>BBSHIFT); i++) { 6243153323Srodrigc kdb_printf("%x ", INT_GET(iclog->ic_header.h_cycle_data[i], ARCH_CONVERT)); 6244153323Srodrigc } 6245153323Srodrigc kdb_printf("\n"); 6246153323Srodrigc kdb_printf("size: %d\n", INT_GET(iclog->ic_header.h_size, ARCH_CONVERT)); 6247153323Srodrigc kdb_printf("\n"); 6248153323Srodrigc kdb_printf("--------------------------------------------------\n"); 6249153323Srodrigc kdb_printf("data: 0x%p &forcesema: 0x%p next: 0x%p bp: 0x%p\n", 6250153323Srodrigc iclog->ic_datap, &iclog->ic_forcesema, iclog->ic_next, 6251153323Srodrigc iclog->ic_bp); 6252159451Srodrigc kdb_printf("log: 0x%p callb: 0x%p callb_tail: 0x%p\n", 6253159451Srodrigc iclog->ic_log, iclog->ic_callback, iclog->ic_callback_tail); 6254153323Srodrigc kdb_printf("size: %d (OFFSET: %d) trace: 0x%p refcnt: %d bwritecnt: %d", 6255153323Srodrigc iclog->ic_size, iclog->ic_offset, 6256153323Srodrigc#ifdef XFS_LOG_TRACE 6257153323Srodrigc iclog->ic_trace, 6258153323Srodrigc#else 6259153323Srodrigc NULL, 6260153323Srodrigc#endif 6261153323Srodrigc iclog->ic_refcnt, iclog->ic_bwritecnt); 6262153323Srodrigc if (iclog->ic_state & XLOG_STATE_ALL) 6263153323Srodrigc printflags(iclog->ic_state, ic_flags, " state:"); 6264153323Srodrigc else 6265153323Srodrigc kdb_printf(" state: INVALID 0x%x", iclog->ic_state); 6266153323Srodrigc kdb_printf("\n"); 6267153323Srodrigc} /* xfsidbg_xiclog */ 6268153323Srodrigc 6269153323Srodrigc 6270153323Srodrigc/* 6271153323Srodrigc * Print all incore logs. 6272153323Srodrigc */ 6273153323Srodrigcstatic void 6274153323Srodrigcxfsidbg_xiclogall(xlog_in_core_t *iclog) 6275153323Srodrigc{ 6276153323Srodrigc xlog_in_core_t *first_iclog = iclog; 6277153323Srodrigc 6278153323Srodrigc do { 6279153323Srodrigc xfsidbg_xiclog(iclog); 6280153323Srodrigc kdb_printf("=================================================\n"); 6281153323Srodrigc iclog = iclog->ic_next; 6282153323Srodrigc } while (iclog != first_iclog); 6283153323Srodrigc} /* xfsidbg_xiclogall */ 6284153323Srodrigc 6285153323Srodrigc/* 6286153323Srodrigc * Print out the callback structures attached to an iclog. 6287153323Srodrigc */ 6288153323Srodrigcstatic void 6289153323Srodrigcxfsidbg_xiclogcb(xlog_in_core_t *iclog) 6290153323Srodrigc{ 6291153323Srodrigc xfs_log_callback_t *cb; 6292153323Srodrigc kdb_symtab_t symtab; 6293153323Srodrigc 6294153323Srodrigc for (cb = iclog->ic_callback; cb != NULL; cb = cb->cb_next) { 6295153323Srodrigc 6296153323Srodrigc if (kdbnearsym((unsigned long)cb->cb_func, &symtab)) { 6297153323Srodrigc unsigned long offval; 6298153323Srodrigc 6299153323Srodrigc offval = (unsigned long)cb->cb_func - symtab.sym_start; 6300153323Srodrigc 6301153323Srodrigc if (offval) 6302153323Srodrigc kdb_printf("func = %s+0x%lx", 6303153323Srodrigc symtab.sym_name, 6304153323Srodrigc offval); 6305153323Srodrigc else 6306153323Srodrigc kdb_printf("func = %s", symtab.sym_name); 6307153323Srodrigc } else 6308153323Srodrigc kdb_printf("func = ?? 0x%p", (void *)cb->cb_func); 6309153323Srodrigc 6310153323Srodrigc kdb_printf(" arg 0x%p next 0x%p\n", cb->cb_arg, cb->cb_next); 6311153323Srodrigc } 6312153323Srodrigc} 6313153323Srodrigc 6314153323Srodrigc#ifdef XFS_LOG_TRACE 6315153323Srodrigc/* 6316153323Srodrigc * Print trace from incore log. 6317153323Srodrigc */ 6318153323Srodrigcstatic void 6319153323Srodrigcxfsidbg_xiclogtrace(xlog_in_core_t *iclog) 6320153323Srodrigc{ 6321153323Srodrigc ktrace_entry_t *ktep; 6322153323Srodrigc ktrace_snap_t kts; 6323153323Srodrigc ktrace_t *kt = iclog->ic_trace; 6324153323Srodrigc 6325153323Srodrigc qprintf("iclog->ic_trace 0x%p\n", kt); 6326153323Srodrigc ktep = ktrace_first(kt, &kts); 6327153323Srodrigc while (ktep != NULL) { 6328153323Srodrigc switch ((__psint_t)ktep->val[0]) { 6329153323Srodrigc case XLOG_TRACE_GRAB_FLUSH: { 6330153323Srodrigc qprintf("grabbing semaphore\n"); 6331153323Srodrigc break; 6332153323Srodrigc } 6333153323Srodrigc case XLOG_TRACE_REL_FLUSH: { 6334153323Srodrigc qprintf("releasing semaphore\n"); 6335153323Srodrigc break; 6336153323Srodrigc } 6337153323Srodrigc case XLOG_TRACE_SLEEP_FLUSH: { 6338153323Srodrigc qprintf("sleeping on semaphore\n"); 6339153323Srodrigc break; 6340153323Srodrigc } 6341153323Srodrigc case XLOG_TRACE_WAKE_FLUSH: { 6342153323Srodrigc qprintf("waking up on semaphore\n"); 6343153323Srodrigc break; 6344153323Srodrigc } 6345153323Srodrigc default: { 6346153323Srodrigc } 6347153323Srodrigc } 6348153323Srodrigc ktep = ktrace_next(kt, &kts); 6349153323Srodrigc } 6350153323Srodrigc} /* xfsidbg_xiclogtrace */ 6351153323Srodrigc#endif 6352153323Srodrigc 6353153323Srodrigc/* 6354153323Srodrigc * Print all of the inodes attached to the given mount structure. 6355153323Srodrigc */ 6356153323Srodrigcstatic void 6357153323Srodrigcxfsidbg_xinodes(xfs_mount_t *mp) 6358153323Srodrigc{ 6359153323Srodrigc xfs_inode_t *ip; 6360153323Srodrigc 6361153323Srodrigc kdb_printf("xfs_mount at 0x%p\n", mp); 6362153323Srodrigc ip = mp->m_inodes; 6363153323Srodrigc if (ip != NULL) { 6364153323Srodrigc do { 6365153323Srodrigc if (ip->i_mount == NULL) { 6366153323Srodrigc ip = ip->i_mnext; 6367153323Srodrigc continue; 6368153323Srodrigc } 6369153323Srodrigc kdb_printf("\n"); 6370153323Srodrigc xfsidbg_xnode(ip); 6371153323Srodrigc ip = ip->i_mnext; 6372153323Srodrigc } while (ip != mp->m_inodes); 6373153323Srodrigc } 6374153323Srodrigc kdb_printf("\nEnd of Inodes\n"); 6375153323Srodrigc} 6376153323Srodrigc 6377153323Srodrigcstatic void 6378153323Srodrigcxfsidbg_delayed_blocks(xfs_mount_t *mp) 6379153323Srodrigc{ 6380153323Srodrigc xfs_inode_t *ip; 6381153323Srodrigc unsigned int total = 0; 6382153323Srodrigc unsigned int icount = 0; 6383153323Srodrigc 6384153323Srodrigc ip = mp->m_inodes; 6385153323Srodrigc if (ip != NULL) { 6386153323Srodrigc do { 6387153323Srodrigc if (ip->i_mount == NULL) { 6388153323Srodrigc ip = ip->i_mnext; 6389153323Srodrigc continue; 6390153323Srodrigc } 6391153323Srodrigc if (ip->i_delayed_blks) { 6392153323Srodrigc total += ip->i_delayed_blks; 6393153323Srodrigc icount++; 6394153323Srodrigc } 6395153323Srodrigc ip = ip->i_mnext; 6396153323Srodrigc } while (ip != mp->m_inodes); 6397153323Srodrigc } 6398153323Srodrigc kdb_printf("delayed blocks total: %d in %d inodes\n", total, icount); 6399153323Srodrigc} 6400153323Srodrigc 6401153323Srodrigcstatic void 6402153323Srodrigcxfsidbg_xinodes_quiesce(xfs_mount_t *mp) 6403153323Srodrigc{ 6404153323Srodrigc xfs_inode_t *ip; 6405153323Srodrigc 6406153323Srodrigc kdb_printf("xfs_mount at 0x%p\n", mp); 6407153323Srodrigc ip = mp->m_inodes; 6408153323Srodrigc if (ip != NULL) { 6409153323Srodrigc do { 6410153323Srodrigc if (ip->i_mount == NULL) { 6411153323Srodrigc ip = ip->i_mnext; 6412153323Srodrigc continue; 6413153323Srodrigc } 6414153323Srodrigc if (!(ip->i_flags & XFS_IQUIESCE)) { 6415153323Srodrigc kdb_printf("ip 0x%p not quiesced\n", ip); 6416153323Srodrigc } 6417153323Srodrigc ip = ip->i_mnext; 6418153323Srodrigc } while (ip != mp->m_inodes); 6419153323Srodrigc } 6420153323Srodrigc kdb_printf("\nEnd of Inodes\n"); 6421153323Srodrigc} 6422153323Srodrigc 6423153323Srodrigcstatic char * 6424153323Srodrigcxfsidbg_get_cstate(int state) 6425153323Srodrigc{ 6426153323Srodrigc switch(state) { 6427153323Srodrigc case XLOG_STATE_COVER_IDLE: 6428153323Srodrigc return("idle"); 6429153323Srodrigc case XLOG_STATE_COVER_NEED: 6430153323Srodrigc return("need"); 6431153323Srodrigc case XLOG_STATE_COVER_DONE: 6432153323Srodrigc return("done"); 6433153323Srodrigc case XLOG_STATE_COVER_NEED2: 6434153323Srodrigc return("need2"); 6435153323Srodrigc case XLOG_STATE_COVER_DONE2: 6436153323Srodrigc return("done2"); 6437153323Srodrigc default: 6438153323Srodrigc return("unknown"); 6439153323Srodrigc } 6440153323Srodrigc} 6441153323Srodrigc 6442153323Srodrigc/* 6443153323Srodrigc * Print out an XFS log structure. 6444153323Srodrigc */ 6445153323Srodrigcstatic void 6446153323Srodrigcxfsidbg_xlog(xlog_t *log) 6447153323Srodrigc{ 6448153323Srodrigc static char *t_flags[] = { 6449153323Srodrigc "CHKSUM_MISMATCH", /* 0x01 */ 6450153323Srodrigc "ACTIVE_RECOVERY", /* 0x02 */ 6451153323Srodrigc "RECOVERY_NEEDED", /* 0x04 */ 6452153323Srodrigc "IO_ERROR", /* 0x08 */ 6453159451Srodrigc NULL 6454153323Srodrigc }; 6455153323Srodrigc 6456153323Srodrigc kdb_printf("xlog at 0x%p\n", log); 6457153323Srodrigc kdb_printf("&flushsm: 0x%p flushcnt: %d tic_cnt: %d tic_tcnt: %d \n", 6458153323Srodrigc &log->l_flushsema, log->l_flushcnt, 6459153323Srodrigc log->l_ticket_cnt, log->l_ticket_tcnt); 6460153323Srodrigc kdb_printf("freelist: 0x%p tail: 0x%p ICLOG: 0x%p \n", 6461153323Srodrigc log->l_freelist, log->l_tail, log->l_iclog); 6462153323Srodrigc kdb_printf("&icloglock: 0x%p tail_lsn: %s last_sync_lsn: %s \n", 6463153323Srodrigc &log->l_icloglock, xfs_fmtlsn(&log->l_tail_lsn), 6464153323Srodrigc xfs_fmtlsn(&log->l_last_sync_lsn)); 6465159451Srodrigc kdb_printf("mp: 0x%p xbuf: 0x%p l_covered_state: %s \n", 6466159451Srodrigc log->l_mp, log->l_xbuf, 6467153323Srodrigc xfsidbg_get_cstate(log->l_covered_state)); 6468153323Srodrigc kdb_printf("flags: "); 6469153323Srodrigc printflags(log->l_flags, t_flags,"log"); 6470153323Srodrigc kdb_printf(" logBBstart: %lld logsize: %d logBBsize: %d\n", 6471153323Srodrigc (long long) log->l_logBBstart, 6472153323Srodrigc log->l_logsize,log->l_logBBsize); 6473153323Srodrigc kdb_printf("curr_cycle: %d prev_cycle: %d curr_block: %d prev_block: %d\n", 6474153323Srodrigc log->l_curr_cycle, log->l_prev_cycle, log->l_curr_block, 6475153323Srodrigc log->l_prev_block); 6476153323Srodrigc kdb_printf("iclog_bak: 0x%p iclog_size: 0x%x (%d) num iclogs: %d\n", 6477153323Srodrigc log->l_iclog_bak, log->l_iclog_size, log->l_iclog_size, 6478153323Srodrigc log->l_iclog_bufs); 6479153323Srodrigc kdb_printf("l_iclog_hsize %d l_iclog_heads %d\n", 6480153323Srodrigc log->l_iclog_hsize, log->l_iclog_heads); 6481153323Srodrigc kdb_printf("l_sectbb_log %u l_sectbb_mask %u\n", 6482153323Srodrigc log->l_sectbb_log, log->l_sectbb_mask); 6483153323Srodrigc kdb_printf("&grant_lock: 0x%p resHeadQ: 0x%p wrHeadQ: 0x%p\n", 6484153323Srodrigc &log->l_grant_lock, log->l_reserve_headq, log->l_write_headq); 6485153323Srodrigc kdb_printf("GResCycle: %d GResBytes: %d GWrCycle: %d GWrBytes: %d\n", 6486153323Srodrigc log->l_grant_reserve_cycle, log->l_grant_reserve_bytes, 6487153323Srodrigc log->l_grant_write_cycle, log->l_grant_write_bytes); 6488153323Srodrigc qprintf("GResBlocks: %d GResRemain: %d GWrBlocks: %d GWrRemain: %d\n", 6489159451Srodrigc (int)BTOBBT(log->l_grant_reserve_bytes), 6490159451Srodrigc log->l_grant_reserve_bytes % BBSIZE, 6491159451Srodrigc (int)BTOBBT(log->l_grant_write_bytes), 6492159451Srodrigc log->l_grant_write_bytes % BBSIZE); 6493153323Srodrigc#ifdef XFS_LOG_TRACE 6494153323Srodrigc qprintf("trace: 0x%p grant_trace: use xlog value\n", log->l_trace); 6495153323Srodrigc#endif 6496153323Srodrigc} /* xfsidbg_xlog */ 6497153323Srodrigc 6498159451Srodrigcstatic void 6499159451Srodrigcxfsidbg_print_trans_type(unsigned int t_type) 6500159451Srodrigc{ 6501159451Srodrigc switch (t_type) { 6502159451Srodrigc case XFS_TRANS_SETATTR_NOT_SIZE: kdb_printf("SETATTR_NOT_SIZE");break; 6503159451Srodrigc case XFS_TRANS_SETATTR_SIZE: kdb_printf("SETATTR_SIZE"); break; 6504159451Srodrigc case XFS_TRANS_INACTIVE: kdb_printf("INACTIVE"); break; 6505159451Srodrigc case XFS_TRANS_CREATE: kdb_printf("CREATE"); break; 6506159451Srodrigc case XFS_TRANS_CREATE_TRUNC: kdb_printf("CREATE_TRUNC"); break; 6507159451Srodrigc case XFS_TRANS_TRUNCATE_FILE: kdb_printf("TRUNCATE_FILE"); break; 6508159451Srodrigc case XFS_TRANS_REMOVE: kdb_printf("REMOVE"); break; 6509159451Srodrigc case XFS_TRANS_LINK: kdb_printf("LINK"); break; 6510159451Srodrigc case XFS_TRANS_RENAME: kdb_printf("RENAME"); break; 6511159451Srodrigc case XFS_TRANS_MKDIR: kdb_printf("MKDIR"); break; 6512159451Srodrigc case XFS_TRANS_RMDIR: kdb_printf("RMDIR"); break; 6513159451Srodrigc case XFS_TRANS_SYMLINK: kdb_printf("SYMLINK"); break; 6514159451Srodrigc case XFS_TRANS_SET_DMATTRS: kdb_printf("SET_DMATTRS"); break; 6515159451Srodrigc case XFS_TRANS_GROWFS: kdb_printf("GROWFS"); break; 6516159451Srodrigc case XFS_TRANS_STRAT_WRITE: kdb_printf("STRAT_WRITE"); break; 6517159451Srodrigc case XFS_TRANS_DIOSTRAT: kdb_printf("DIOSTRAT"); break; 6518159451Srodrigc case XFS_TRANS_WRITE_SYNC: kdb_printf("WRITE_SYNC"); break; 6519159451Srodrigc case XFS_TRANS_WRITEID: kdb_printf("WRITEID"); break; 6520159451Srodrigc case XFS_TRANS_ADDAFORK: kdb_printf("ADDAFORK"); break; 6521159451Srodrigc case XFS_TRANS_ATTRINVAL: kdb_printf("ATTRINVAL"); break; 6522159451Srodrigc case XFS_TRANS_ATRUNCATE: kdb_printf("ATRUNCATE"); break; 6523159451Srodrigc case XFS_TRANS_ATTR_SET: kdb_printf("ATTR_SET"); break; 6524159451Srodrigc case XFS_TRANS_ATTR_RM: kdb_printf("ATTR_RM"); break; 6525159451Srodrigc case XFS_TRANS_ATTR_FLAG: kdb_printf("ATTR_FLAG"); break; 6526159451Srodrigc case XFS_TRANS_CLEAR_AGI_BUCKET:kdb_printf("CLEAR_AGI_BUCKET"); break; 6527159451Srodrigc case XFS_TRANS_QM_SBCHANGE: kdb_printf("QM_SBCHANGE"); break; 6528159451Srodrigc case XFS_TRANS_QM_QUOTAOFF: kdb_printf("QM_QUOTAOFF"); break; 6529159451Srodrigc case XFS_TRANS_QM_DQALLOC: kdb_printf("QM_DQALLOC"); break; 6530159451Srodrigc case XFS_TRANS_QM_SETQLIM: kdb_printf("QM_SETQLIM"); break; 6531159451Srodrigc case XFS_TRANS_QM_DQCLUSTER: kdb_printf("QM_DQCLUSTER"); break; 6532159451Srodrigc case XFS_TRANS_QM_QINOCREATE: kdb_printf("QM_QINOCREATE"); break; 6533159451Srodrigc case XFS_TRANS_QM_QUOTAOFF_END: kdb_printf("QM_QOFF_END"); break; 6534159451Srodrigc case XFS_TRANS_SB_UNIT: kdb_printf("SB_UNIT"); break; 6535159451Srodrigc case XFS_TRANS_FSYNC_TS: kdb_printf("FSYNC_TS"); break; 6536159451Srodrigc case XFS_TRANS_GROWFSRT_ALLOC: kdb_printf("GROWFSRT_ALLOC"); break; 6537159451Srodrigc case XFS_TRANS_GROWFSRT_ZERO: kdb_printf("GROWFSRT_ZERO"); break; 6538159451Srodrigc case XFS_TRANS_GROWFSRT_FREE: kdb_printf("GROWFSRT_FREE"); break; 6539159451Srodrigc default: kdb_printf("unknown(0x%x)", t_type); break; 6540159451Srodrigc } 6541159451Srodrigc} 6542159451Srodrigc 6543153323Srodrigc#ifdef XFS_LOG_TRACE 6544153323Srodrigc/* 6545153323Srodrigc * Print grant trace for a log. 6546153323Srodrigc */ 6547153323Srodrigcstatic void 6548153323Srodrigcxfsidbg_xlog_granttrace(xlog_t *log) 6549153323Srodrigc{ 6550153323Srodrigc ktrace_entry_t *ktep; 6551153323Srodrigc ktrace_snap_t kts; 6552153323Srodrigc ktrace_t *kt; 6553159451Srodrigc int i = 0; 6554159451Srodrigc unsigned long cnts,t_ocnt, t_cnt; 6555153323Srodrigc 6556153323Srodrigc if (((__psint_t)log) == ((__psint_t)-1)) { 6557153323Srodrigc qprintf("Usage: xl_grtr <log>\n"); 6558153323Srodrigc return; 6559153323Srodrigc } 6560153323Srodrigc if ((kt = log->l_grant_trace)) 6561153323Srodrigc qprintf("log->l_grant_trace 0x%p\n", kt); 6562153323Srodrigc else { 6563153323Srodrigc qprintf("log->l_grant_trace is empty!\n"); 6564153323Srodrigc return; 6565153323Srodrigc } 6566153323Srodrigc ktep = ktrace_first(kt, &kts); 6567153323Srodrigc while (ktep != NULL) { 6568159451Srodrigc /* split cnts into two parts: cnt and ocnt */ 6569159451Srodrigc cnts = (unsigned long)ktep->val[13]; 6570159451Srodrigc t_ocnt = 0xff & cnts; 6571159451Srodrigc t_cnt = cnts >> 8; 6572159451Srodrigc 6573159451Srodrigc qprintf("%d: %s [", i++, (char *)ktep->val[11]); 6574159451Srodrigc xfsidbg_print_trans_type((unsigned long)ktep->val[12]); 6575159451Srodrigc qprintf("]\n"); 6576159451Srodrigc qprintf(" t_ocnt = %lu, t_cnt = %lu, t_curr_res = %lu, " 6577159451Srodrigc "t_unit_res = %lu\n", 6578159451Srodrigc t_ocnt, t_cnt, (unsigned long)ktep->val[14], 6579159451Srodrigc (unsigned long)ktep->val[15]); 6580153323Srodrigc qprintf(" tic:0x%p resQ:0x%p wrQ:0x%p ", 6581153323Srodrigc ktep->val[0], ktep->val[1], ktep->val[2]); 6582153323Srodrigc qprintf(" GrResC:%ld GrResB:%ld GrWrC:%ld GrWrB:%ld \n", 6583153323Srodrigc (long)ktep->val[3], (long)ktep->val[4], 6584153323Srodrigc (long)ktep->val[5], (long)ktep->val[6]); 6585153323Srodrigc qprintf(" HeadC:%ld HeadB:%ld TailC:%ld TailB:%ld\n", 6586153323Srodrigc (long)ktep->val[7], (long)ktep->val[8], 6587153323Srodrigc (long)ktep->val[9], (long)ktep->val[10]); 6588153323Srodrigc ktep = ktrace_next(kt, &kts); 6589153323Srodrigc } 6590153323Srodrigc} /* xfsidbg_xlog_granttrace */ 6591153323Srodrigc#endif 6592153323Srodrigc 6593153323Srodrigc/* 6594153323Srodrigc * Print out an XFS recovery transaction 6595153323Srodrigc */ 6596153323Srodrigcstatic void 6597153323Srodrigcxfsidbg_xlog_ritem(xlog_recover_item_t *item) 6598153323Srodrigc{ 6599153323Srodrigc int i = XLOG_MAX_REGIONS_IN_ITEM; 6600153323Srodrigc 6601153323Srodrigc kdb_printf("(xlog_recover_item 0x%p) ", item); 6602153323Srodrigc kdb_printf("next: 0x%p prev: 0x%p type: %d cnt: %d ttl: %d\n", 6603153323Srodrigc item->ri_next, item->ri_prev, ITEM_TYPE(item), item->ri_cnt, 6604153323Srodrigc item->ri_total); 6605153323Srodrigc for ( ; i > 0; i--) { 6606153323Srodrigc if (!item->ri_buf[XLOG_MAX_REGIONS_IN_ITEM-i].i_addr) 6607153323Srodrigc break; 6608153323Srodrigc kdb_printf("a: 0x%p l: %d ", 6609153323Srodrigc item->ri_buf[XLOG_MAX_REGIONS_IN_ITEM-i].i_addr, 6610153323Srodrigc item->ri_buf[XLOG_MAX_REGIONS_IN_ITEM-i].i_len); 6611153323Srodrigc } 6612153323Srodrigc kdb_printf("\n"); 6613153323Srodrigc} /* xfsidbg_xlog_ritem */ 6614153323Srodrigc 6615153323Srodrigc/* 6616153323Srodrigc * Print out an XFS recovery transaction 6617153323Srodrigc */ 6618153323Srodrigcstatic void 6619153323Srodrigcxfsidbg_xlog_rtrans(xlog_recover_t *trans) 6620153323Srodrigc{ 6621153323Srodrigc xlog_recover_item_t *rip, *first_rip; 6622153323Srodrigc 6623153323Srodrigc kdb_printf("(xlog_recover 0x%p) ", trans); 6624153323Srodrigc kdb_printf("tid: %x type: %d items: %d ttid: 0x%x ", 6625153323Srodrigc trans->r_log_tid, trans->r_theader.th_type, 6626153323Srodrigc trans->r_theader.th_num_items, trans->r_theader.th_tid); 6627153323Srodrigc kdb_printf("itemq: 0x%p\n", trans->r_itemq); 6628153323Srodrigc if (trans->r_itemq) { 6629153323Srodrigc rip = first_rip = trans->r_itemq; 6630153323Srodrigc do { 6631153323Srodrigc kdb_printf("(recovery item: 0x%p) ", rip); 6632153323Srodrigc kdb_printf("type: %d cnt: %d total: %d\n", 6633153323Srodrigc ITEM_TYPE(rip), rip->ri_cnt, rip->ri_total); 6634153323Srodrigc rip = rip->ri_next; 6635153323Srodrigc } while (rip != first_rip); 6636153323Srodrigc } 6637153323Srodrigc} /* xfsidbg_xlog_rtrans */ 6638153323Srodrigc 6639153323Srodrigcstatic void 6640153323Srodrigcxfsidbg_xlog_buf_logitem(xlog_recover_item_t *item) 6641153323Srodrigc{ 6642153323Srodrigc xfs_buf_log_format_t *buf_f; 6643153323Srodrigc int i, j; 6644153323Srodrigc int bit; 6645153323Srodrigc int nbits; 6646153323Srodrigc unsigned int *data_map; 6647153323Srodrigc unsigned int map_size; 6648153323Srodrigc int size; 6649153323Srodrigc 6650153323Srodrigc buf_f = (xfs_buf_log_format_t *)item->ri_buf[0].i_addr; 6651153323Srodrigc if (buf_f->blf_flags & XFS_BLI_INODE_BUF) { 6652153323Srodrigc kdb_printf("\tINODE BUF <blkno=0x%Lx, len=0x%x>\n", 6653153323Srodrigc buf_f->blf_blkno, buf_f->blf_len); 6654159451Srodrigc } else if (buf_f->blf_flags & 6655159451Srodrigc (XFS_BLI_UDQUOT_BUF|XFS_BLI_PDQUOT_BUF|XFS_BLI_GDQUOT_BUF)) { 6656153323Srodrigc kdb_printf("\tDQUOT BUF <blkno=0x%Lx, len=0x%x>\n", 6657153323Srodrigc buf_f->blf_blkno, buf_f->blf_len); 6658153323Srodrigc } else { 6659153323Srodrigc data_map = buf_f->blf_data_map; 6660153323Srodrigc map_size = buf_f->blf_map_size; 6661153323Srodrigc kdb_printf("\tREG BUF <blkno=0x%Lx, len=0x%x map 0x%p size %d>\n", 6662153323Srodrigc buf_f->blf_blkno, buf_f->blf_len, data_map, map_size); 6663153323Srodrigc bit = 0; 6664153323Srodrigc i = 0; /* 0 is the buf format structure */ 6665153323Srodrigc while (1) { 6666153323Srodrigc bit = xfs_next_bit(data_map, map_size, bit); 6667153323Srodrigc if (bit == -1) 6668153323Srodrigc break; 6669153323Srodrigc nbits = xfs_contig_bits(data_map, map_size, bit); 6670153323Srodrigc size = ((uint)bit << XFS_BLI_SHIFT)+(nbits<<XFS_BLI_SHIFT); 6671153323Srodrigc kdb_printf("\t\tlogbuf.i_addr 0x%p, size 0x%x\n", 6672153323Srodrigc item->ri_buf[i].i_addr, size); 6673153323Srodrigc kdb_printf("\t\t\t\""); 6674153323Srodrigc for (j=0; j<8 && j<size; j++) { 6675153323Srodrigc kdb_printf("%02x", ((char *)item->ri_buf[i].i_addr)[j]); 6676153323Srodrigc } 6677153323Srodrigc kdb_printf("...\"\n"); 6678153323Srodrigc i++; 6679153323Srodrigc bit += nbits; 6680153323Srodrigc } 6681153323Srodrigc 6682153323Srodrigc } 6683153323Srodrigc} 6684153323Srodrigc 6685153323Srodrigc/* 6686153323Srodrigc * Print out an ENTIRE XFS recovery transaction 6687153323Srodrigc */ 6688153323Srodrigcstatic void 6689153323Srodrigcxfsidbg_xlog_rtrans_entire(xlog_recover_t *trans) 6690153323Srodrigc{ 6691153323Srodrigc xlog_recover_item_t *item, *first_rip; 6692153323Srodrigc 6693153323Srodrigc kdb_printf("(Recovering Xact 0x%p) ", trans); 6694153323Srodrigc kdb_printf("tid: %x type: %d nitems: %d ttid: 0x%x ", 6695153323Srodrigc trans->r_log_tid, trans->r_theader.th_type, 6696153323Srodrigc trans->r_theader.th_num_items, trans->r_theader.th_tid); 6697153323Srodrigc kdb_printf("itemq: 0x%p\n", trans->r_itemq); 6698153323Srodrigc if (trans->r_itemq) { 6699153323Srodrigc item = first_rip = trans->r_itemq; 6700153323Srodrigc do { 6701153323Srodrigc /* 6702153323Srodrigc kdb_printf("(recovery item: 0x%x) ", item); 6703153323Srodrigc kdb_printf("type: %d cnt: %d total: %d\n", 6704153323Srodrigc item->ri_type, item->ri_cnt, item->ri_total); 6705153323Srodrigc */ 6706153323Srodrigc if ((ITEM_TYPE(item) == XFS_LI_BUF) || 6707153323Srodrigc (ITEM_TYPE(item) == XFS_LI_6_1_BUF) || 6708153323Srodrigc (ITEM_TYPE(item) == XFS_LI_5_3_BUF)) { 6709153323Srodrigc kdb_printf("BUF:"); 6710153323Srodrigc xfsidbg_xlog_buf_logitem(item); 6711153323Srodrigc } else if ((ITEM_TYPE(item) == XFS_LI_INODE) || 6712153323Srodrigc (ITEM_TYPE(item) == XFS_LI_6_1_INODE) || 6713153323Srodrigc (ITEM_TYPE(item) == XFS_LI_5_3_INODE)) { 6714153323Srodrigc kdb_printf("INODE:\n"); 6715153323Srodrigc } else if (ITEM_TYPE(item) == XFS_LI_EFI) { 6716153323Srodrigc kdb_printf("EFI:\n"); 6717153323Srodrigc } else if (ITEM_TYPE(item) == XFS_LI_EFD) { 6718153323Srodrigc kdb_printf("EFD:\n"); 6719153323Srodrigc } else if (ITEM_TYPE(item) == XFS_LI_DQUOT) { 6720153323Srodrigc kdb_printf("DQUOT:\n"); 6721153323Srodrigc } else if ((ITEM_TYPE(item) == XFS_LI_QUOTAOFF)) { 6722153323Srodrigc kdb_printf("QUOTAOFF:\n"); 6723153323Srodrigc } else { 6724153323Srodrigc kdb_printf("UNKNOWN LOGITEM 0x%x\n", ITEM_TYPE(item)); 6725153323Srodrigc } 6726153323Srodrigc item = item->ri_next; 6727153323Srodrigc } while (item != first_rip); 6728153323Srodrigc } 6729153323Srodrigc} /* xfsidbg_xlog_rtrans */ 6730153323Srodrigc 6731153323Srodrigc/* 6732153323Srodrigc * Print out an XFS ticket structure. 6733153323Srodrigc */ 6734153323Srodrigcstatic void 6735153323Srodrigcxfsidbg_xlog_tic(xlog_ticket_t *tic) 6736153323Srodrigc{ 6737153323Srodrigc static char *t_flags[] = { 6738153323Srodrigc "INIT", /* 0x1 */ 6739153323Srodrigc "PERM_RES", /* 0x2 */ 6740153323Srodrigc "IN_Q", /* 0x4 */ 6741159451Srodrigc NULL 6742153323Srodrigc }; 6743153323Srodrigc 6744153323Srodrigc kdb_printf("xlog_ticket at 0x%p\n", tic); 6745153323Srodrigc kdb_printf("next: 0x%p prev: 0x%p tid: 0x%x \n", 6746153323Srodrigc tic->t_next, tic->t_prev, tic->t_tid); 6747153323Srodrigc kdb_printf("curr_res: %d unit_res: %d ocnt: %d cnt: %d\n", 6748153323Srodrigc tic->t_curr_res, tic->t_unit_res, (int)tic->t_ocnt, 6749153323Srodrigc (int)tic->t_cnt); 6750153323Srodrigc kdb_printf("clientid: %c \n", tic->t_clientid); 6751153323Srodrigc printflags(tic->t_flags, t_flags,"ticket"); 6752153323Srodrigc kdb_printf("\n"); 6753159451Srodrigc qprintf("trans type: "); 6754159451Srodrigc xfsidbg_print_trans_type(tic->t_trans_type); 6755159451Srodrigc qprintf("\n"); 6756153323Srodrigc} /* xfsidbg_xlog_tic */ 6757153323Srodrigc 6758153323Srodrigc/* 6759153323Srodrigc * Print out a single log item. 6760153323Srodrigc */ 6761153323Srodrigcstatic void 6762153323Srodrigcxfsidbg_xlogitem(xfs_log_item_t *lip) 6763153323Srodrigc{ 6764153323Srodrigc xfs_log_item_t *bio_lip; 6765153323Srodrigc static char *lid_type[] = { 6766153323Srodrigc "???", /* 0 */ 6767153323Srodrigc "5-3-buf", /* 1 */ 6768153323Srodrigc "5-3-inode", /* 2 */ 6769153323Srodrigc "efi", /* 3 */ 6770153323Srodrigc "efd", /* 4 */ 6771153323Srodrigc "iunlink", /* 5 */ 6772153323Srodrigc "6-1-inode", /* 6 */ 6773153323Srodrigc "6-1-buf", /* 7 */ 6774153323Srodrigc "inode", /* 8 */ 6775153323Srodrigc "buf", /* 9 */ 6776153323Srodrigc "dquot", /* 10 */ 6777159451Srodrigc NULL 6778153323Srodrigc }; 6779153323Srodrigc static char *li_flags[] = { 6780153323Srodrigc "in ail", /* 0x1 */ 6781159451Srodrigc NULL 6782153323Srodrigc }; 6783153323Srodrigc 6784153323Srodrigc kdb_printf("type %s mountp 0x%p flags ", 6785153323Srodrigc lid_type[lip->li_type - XFS_LI_5_3_BUF + 1], 6786153323Srodrigc lip->li_mountp); 6787153323Srodrigc printflags((uint)(lip->li_flags), li_flags,"log"); 6788153323Srodrigc kdb_printf("\n"); 6789153323Srodrigc kdb_printf("ail forw 0x%p ail back 0x%p lsn %s\ndesc %p ops 0x%p", 6790153323Srodrigc lip->li_ail.ail_forw, lip->li_ail.ail_back, 6791153323Srodrigc xfs_fmtlsn(&(lip->li_lsn)), lip->li_desc, lip->li_ops); 6792153323Srodrigc kdb_printf(" iodonefunc &0x%p\n", lip->li_cb); 6793153323Srodrigc if (lip->li_type == XFS_LI_BUF) { 6794153323Srodrigc bio_lip = lip->li_bio_list; 6795153323Srodrigc if (bio_lip != NULL) { 6796153323Srodrigc kdb_printf("iodone list:\n"); 6797153323Srodrigc } 6798153323Srodrigc while (bio_lip != NULL) { 6799153323Srodrigc kdb_printf("item 0x%p func 0x%p\n", 6800153323Srodrigc bio_lip, bio_lip->li_cb); 6801153323Srodrigc bio_lip = bio_lip->li_bio_list; 6802153323Srodrigc } 6803153323Srodrigc } 6804153323Srodrigc switch (lip->li_type) { 6805153323Srodrigc case XFS_LI_BUF: 6806153323Srodrigc xfs_buf_item_print((xfs_buf_log_item_t *)lip, 0); 6807153323Srodrigc break; 6808153323Srodrigc case XFS_LI_INODE: 6809153323Srodrigc xfs_inode_item_print((xfs_inode_log_item_t *)lip, 0); 6810153323Srodrigc break; 6811153323Srodrigc case XFS_LI_EFI: 6812153323Srodrigc xfs_efi_item_print((xfs_efi_log_item_t *)lip, 0); 6813153323Srodrigc break; 6814153323Srodrigc case XFS_LI_EFD: 6815153323Srodrigc xfs_efd_item_print((xfs_efd_log_item_t *)lip, 0); 6816153323Srodrigc break; 6817153323Srodrigc case XFS_LI_DQUOT: 6818153323Srodrigc xfs_dquot_item_print((xfs_dq_logitem_t *)lip, 0); 6819153323Srodrigc break; 6820153323Srodrigc case XFS_LI_QUOTAOFF: 6821153323Srodrigc xfs_qoff_item_print((xfs_qoff_logitem_t *)lip, 0); 6822153323Srodrigc break; 6823153323Srodrigc 6824153323Srodrigc default: 6825153323Srodrigc kdb_printf("Unknown item type %d\n", lip->li_type); 6826153323Srodrigc break; 6827153323Srodrigc } 6828153323Srodrigc} 6829153323Srodrigc 6830153323Srodrigc/* 6831153323Srodrigc * Print out a summary of the AIL hanging off of a mount struct. 6832153323Srodrigc */ 6833153323Srodrigcstatic void 6834153323Srodrigcxfsidbg_xaildump(xfs_mount_t *mp) 6835153323Srodrigc{ 6836153323Srodrigc xfs_log_item_t *lip; 6837153323Srodrigc static char *lid_type[] = { 6838153323Srodrigc "???", /* 0 */ 6839153323Srodrigc "5-3-buf", /* 1 */ 6840153323Srodrigc "5-3-inode", /* 2 */ 6841153323Srodrigc "efi", /* 3 */ 6842153323Srodrigc "efd", /* 4 */ 6843153323Srodrigc "iunlink", /* 5 */ 6844153323Srodrigc "6-1-inode", /* 6 */ 6845153323Srodrigc "6-1-buf", /* 7 */ 6846153323Srodrigc "inode", /* 8 */ 6847153323Srodrigc "buf", /* 9 */ 6848153323Srodrigc "dquot", /* 10 */ 6849159451Srodrigc NULL 6850153323Srodrigc }; 6851153323Srodrigc static char *li_flags[] = { 6852153323Srodrigc "in ail", /* 0x1 */ 6853159451Srodrigc NULL 6854153323Srodrigc }; 6855153323Srodrigc int count; 6856153323Srodrigc 6857153323Srodrigc if ((mp->m_ail.ail_forw == NULL) || 6858153323Srodrigc (mp->m_ail.ail_forw == (xfs_log_item_t *)&mp->m_ail)) { 6859153323Srodrigc kdb_printf("AIL is empty\n"); 6860153323Srodrigc return; 6861153323Srodrigc } 6862153323Srodrigc kdb_printf("AIL for mp 0x%p, oldest first\n", mp); 6863153323Srodrigc lip = (xfs_log_item_t*)mp->m_ail.ail_forw; 6864153323Srodrigc for (count = 0; lip; count++) { 6865153323Srodrigc kdb_printf("[%d] type %s ", count, 6866153323Srodrigc lid_type[lip->li_type - XFS_LI_5_3_BUF + 1]); 6867153323Srodrigc printflags((uint)(lip->li_flags), li_flags, "flags:"); 6868153323Srodrigc kdb_printf(" lsn %s\n ", xfs_fmtlsn(&(lip->li_lsn))); 6869153323Srodrigc switch (lip->li_type) { 6870153323Srodrigc case XFS_LI_BUF: 6871153323Srodrigc xfs_buf_item_print((xfs_buf_log_item_t *)lip, 1); 6872153323Srodrigc break; 6873153323Srodrigc case XFS_LI_INODE: 6874153323Srodrigc xfs_inode_item_print((xfs_inode_log_item_t *)lip, 1); 6875153323Srodrigc break; 6876153323Srodrigc case XFS_LI_EFI: 6877153323Srodrigc xfs_efi_item_print((xfs_efi_log_item_t *)lip, 1); 6878153323Srodrigc break; 6879153323Srodrigc case XFS_LI_EFD: 6880153323Srodrigc xfs_efd_item_print((xfs_efd_log_item_t *)lip, 1); 6881153323Srodrigc break; 6882153323Srodrigc case XFS_LI_DQUOT: 6883153323Srodrigc xfs_dquot_item_print((xfs_dq_logitem_t *)lip, 1); 6884153323Srodrigc break; 6885153323Srodrigc case XFS_LI_QUOTAOFF: 6886153323Srodrigc xfs_qoff_item_print((xfs_qoff_logitem_t *)lip, 1); 6887153323Srodrigc break; 6888153323Srodrigc default: 6889153323Srodrigc kdb_printf("Unknown item type %d\n", lip->li_type); 6890153323Srodrigc break; 6891153323Srodrigc } 6892153323Srodrigc 6893153323Srodrigc if (lip->li_ail.ail_forw == (xfs_log_item_t*)&mp->m_ail) { 6894153323Srodrigc lip = NULL; 6895153323Srodrigc } else { 6896153323Srodrigc lip = lip->li_ail.ail_forw; 6897153323Srodrigc } 6898153323Srodrigc } 6899153323Srodrigc} 6900153323Srodrigc 6901153323Srodrigc/* 6902153323Srodrigc * Print xfs mount structure. 6903153323Srodrigc */ 6904153323Srodrigcstatic void 6905153323Srodrigcxfsidbg_xmount(xfs_mount_t *mp) 6906153323Srodrigc{ 6907153323Srodrigc static char *xmount_flags[] = { 6908153323Srodrigc "WSYNC", /* 0x0001 */ 6909153323Srodrigc "INO64", /* 0x0002 */ 6910159451Srodrigc "UNUSED_4", /* 0x0004 */ 6911159451Srodrigc "UNUSED_8", /* 0x0008 */ 6912159451Srodrigc "FSSHUTDOWN", /* 0x0010 */ 6913153323Srodrigc "NOATIME", /* 0x0020 */ 6914153323Srodrigc "RETERR", /* 0x0040 */ 6915153323Srodrigc "NOALIGN", /* 0x0080 */ 6916159451Srodrigc "ATTR2", /* 0x0100 */ 6917159451Srodrigc "UNUSED_200", /* 0x0200 */ 6918159451Srodrigc "NORECOVERY", /* 0x0400 */ 6919159451Srodrigc "SHARED", /* 0x0800 */ 6920159451Srodrigc "DFLT_IOSIZE", /* 0x1000 */ 6921159451Srodrigc "OSYNCISOSYNC", /* 0x2000 */ 6922159451Srodrigc "32BITINODES", /* 0x4000 */ 6923159451Srodrigc "32BITINOOPT", /* 0x8000 */ 6924159451Srodrigc "NOUUID", /* 0x10000 */ 6925159451Srodrigc "BARRIER", /* 0x20000 */ 6926159451Srodrigc "IDELETE", /* 0x40000 */ 6927159451Srodrigc "SWALLOC", /* 0x80000 */ 6928159451Srodrigc "IHASHSIZE", /* 0x100000 */ 6929159451Srodrigc "DIRSYNC", /* 0x200000 */ 6930159451Srodrigc "COMPAT_IOSIZE",/* 0x400000 */ 6931159451Srodrigc NULL 6932153323Srodrigc }; 6933153323Srodrigc 6934153323Srodrigc static char *quota_flags[] = { 6935153323Srodrigc "UQ", /* 0x0001 */ 6936153323Srodrigc "UQE", /* 0x0002 */ 6937153323Srodrigc "UQCHKD", /* 0x0004 */ 6938159451Srodrigc "PQ", /* 0x0008 */ 6939153323Srodrigc "GQE", /* 0x0010 */ 6940153323Srodrigc "GQCHKD", /* 0x0020 */ 6941153323Srodrigc "GQ", /* 0x0040 */ 6942153323Srodrigc "UQACTV", /* 0x0080 */ 6943153323Srodrigc "GQACTV", /* 0x0100 */ 6944153323Srodrigc "QMAYBE", /* 0x0200 */ 6945159451Srodrigc NULL 6946153323Srodrigc }; 6947153323Srodrigc 6948153323Srodrigc kdb_printf("xfs_mount at 0x%p\n", mp); 6949153323Srodrigc kdb_printf("vfsp 0x%p tid 0x%x ail_lock 0x%p &ail 0x%p\n", 6950153323Srodrigc XFS_MTOVFS(mp), mp->m_tid, &mp->m_ail_lock, &mp->m_ail); 6951153323Srodrigc kdb_printf("ail_gen 0x%x &sb 0x%p\n", 6952153323Srodrigc mp->m_ail_gen, &mp->m_sb); 6953153323Srodrigc kdb_printf("sb_lock 0x%p sb_bp 0x%p dev 0x%s logdev 0x%s rtdev 0x%s\n", 6954153323Srodrigc &mp->m_sb_lock, mp->m_sb_bp, 6955153323Srodrigc mp->m_ddev_targp ? devtoname(mp->m_ddev_targp->dev) : 0, 6956153323Srodrigc mp->m_logdev_targp ? devtoname(mp->m_logdev_targp->dev) : 0, 6957153323Srodrigc mp->m_rtdev_targp ? devtoname(mp->m_rtdev_targp->dev) : 0); 6958159451Srodrigc kdb_printf("bsize %d agfrotor %d xfs_rotorstep %d agirotor %d\n", 6959159451Srodrigc mp->m_bsize, mp->m_agfrotor, xfs_rotorstep, mp->m_agirotor); 6960159451Srodrigc kdb_printf("ihash 0x%p ihsize %d\n", 6961153323Srodrigc mp->m_ihash, mp->m_ihsize); 6962153323Srodrigc kdb_printf("inodes 0x%p ilock 0x%p ireclaims 0x%x\n", 6963153323Srodrigc mp->m_inodes, &mp->m_ilock, mp->m_ireclaims); 6964153323Srodrigc kdb_printf("readio_log 0x%x readio_blocks 0x%x ", 6965153323Srodrigc mp->m_readio_log, mp->m_readio_blocks); 6966153323Srodrigc kdb_printf("writeio_log 0x%x writeio_blocks 0x%x\n", 6967153323Srodrigc mp->m_writeio_log, mp->m_writeio_blocks); 6968153323Srodrigc kdb_printf("logbufs %d logbsize %d LOG 0x%p\n", mp->m_logbufs, 6969153323Srodrigc mp->m_logbsize, mp->m_log); 6970153323Srodrigc kdb_printf("rsumlevels 0x%x rsumsize 0x%x rbmip 0x%p rsumip 0x%p\n", 6971153323Srodrigc mp->m_rsumlevels, mp->m_rsumsize, mp->m_rbmip, mp->m_rsumip); 6972153323Srodrigc kdb_printf("rootip 0x%p\n", mp->m_rootip); 6973153323Srodrigc kdb_printf("dircook_elog %d blkbit_log %d blkbb_log %d agno_log %d\n", 6974153323Srodrigc mp->m_dircook_elog, mp->m_blkbit_log, mp->m_blkbb_log, 6975153323Srodrigc mp->m_agno_log); 6976153323Srodrigc kdb_printf("agino_log %d nreadaheads %d inode cluster size %d\n", 6977153323Srodrigc mp->m_agino_log, mp->m_nreadaheads, 6978153323Srodrigc mp->m_inode_cluster_size); 6979153323Srodrigc kdb_printf("blockmask 0x%x blockwsize 0x%x blockwmask 0x%x\n", 6980153323Srodrigc mp->m_blockmask, mp->m_blockwsize, mp->m_blockwmask); 6981153323Srodrigc kdb_printf("alloc_mxr[lf,nd] %d %d alloc_mnr[lf,nd] %d %d\n", 6982153323Srodrigc mp->m_alloc_mxr[0], mp->m_alloc_mxr[1], 6983153323Srodrigc mp->m_alloc_mnr[0], mp->m_alloc_mnr[1]); 6984153323Srodrigc kdb_printf("bmap_dmxr[lfnr,ndnr] %d %d bmap_dmnr[lfnr,ndnr] %d %d\n", 6985153323Srodrigc mp->m_bmap_dmxr[0], mp->m_bmap_dmxr[1], 6986153323Srodrigc mp->m_bmap_dmnr[0], mp->m_bmap_dmnr[1]); 6987153323Srodrigc kdb_printf("inobt_mxr[lf,nd] %d %d inobt_mnr[lf,nd] %d %d\n", 6988153323Srodrigc mp->m_inobt_mxr[0], mp->m_inobt_mxr[1], 6989153323Srodrigc mp->m_inobt_mnr[0], mp->m_inobt_mnr[1]); 6990153323Srodrigc kdb_printf("ag_maxlevels %d bm_maxlevels[d,a] %d %d in_maxlevels %d\n", 6991153323Srodrigc mp->m_ag_maxlevels, mp->m_bm_maxlevels[0], 6992153323Srodrigc mp->m_bm_maxlevels[1], mp->m_in_maxlevels); 6993153323Srodrigc kdb_printf("perag 0x%p &peraglock 0x%p &growlock 0x%p\n", 6994153323Srodrigc mp->m_perag, &mp->m_peraglock, &mp->m_growlock); 6995153323Srodrigc printflags(mp->m_flags, xmount_flags,"flags"); 6996153323Srodrigc kdb_printf("ialloc_inos %d ialloc_blks %d litino %d\n", 6997153323Srodrigc mp->m_ialloc_inos, mp->m_ialloc_blks, mp->m_litino); 6998153323Srodrigc kdb_printf("dir_node_ents %u attr_node_ents %u\n", 6999153323Srodrigc mp->m_dir_node_ents, mp->m_attr_node_ents); 7000153323Srodrigc kdb_printf("attroffset %d maxicount %Ld inoalign_mask %d\n", 7001153323Srodrigc mp->m_attroffset, mp->m_maxicount, mp->m_inoalign_mask); 7002153323Srodrigc kdb_printf("resblks %Ld resblks_avail %Ld\n", mp->m_resblks, 7003153323Srodrigc mp->m_resblks_avail); 7004153323Srodrigc#if XFS_BIG_INUMS 7005153323Srodrigc kdb_printf(" inoadd %llx\n", (unsigned long long) mp->m_inoadd); 7006153323Srodrigc#else 7007153323Srodrigc kdb_printf("\n"); 7008153323Srodrigc#endif 7009153323Srodrigc if (mp->m_quotainfo) 7010153323Srodrigc kdb_printf("quotainfo 0x%p (uqip = 0x%p, gqip = 0x%p)\n", 7011153323Srodrigc mp->m_quotainfo, 7012153323Srodrigc mp->m_quotainfo->qi_uquotaip, 7013153323Srodrigc mp->m_quotainfo->qi_gquotaip); 7014153323Srodrigc else 7015153323Srodrigc kdb_printf("quotainfo NULL\n"); 7016153323Srodrigc printflags(mp->m_qflags, quota_flags,"quotaflags"); 7017153323Srodrigc kdb_printf("\n"); 7018153323Srodrigc kdb_printf("dalign %d swidth %d sinoalign %d attr_magicpct %d dir_magicpct %d\n", 7019153323Srodrigc mp->m_dalign, mp->m_swidth, mp->m_sinoalign, 7020153323Srodrigc mp->m_attr_magicpct, mp->m_dir_magicpct); 7021153323Srodrigc kdb_printf("mk_sharedro %d inode_quiesce %d sectbb_log %d\n", 7022153323Srodrigc mp->m_mk_sharedro, mp->m_inode_quiesce, mp->m_sectbb_log); 7023153323Srodrigc kdb_printf("dirversion %d dirblkfsbs %d &dirops 0x%p\n", 7024153323Srodrigc mp->m_dirversion, mp->m_dirblkfsbs, &mp->m_dirops); 7025153323Srodrigc kdb_printf("dirblksize %d dirdatablk 0x%Lx dirleafblk 0x%Lx dirfreeblk 0x%Lx\n", 7026153323Srodrigc mp->m_dirblksize, 7027153323Srodrigc (xfs_dfiloff_t)mp->m_dirdatablk, 7028153323Srodrigc (xfs_dfiloff_t)mp->m_dirleafblk, 7029153323Srodrigc (xfs_dfiloff_t)mp->m_dirfreeblk); 7030153323Srodrigc kdb_printf("chsize %d chash 0x%p\n", 7031153323Srodrigc mp->m_chsize, mp->m_chash); 7032153323Srodrigc if (mp->m_fsname != NULL) 7033153323Srodrigc kdb_printf("mountpoint \"%s\"\n", mp->m_fsname); 7034153323Srodrigc else 7035153323Srodrigc kdb_printf("No name!!!\n"); 7036153323Srodrigc 7037153323Srodrigc} 7038153323Srodrigc 7039153323Srodrigcstatic void 7040153323Srodrigcxfsidbg_xihash(xfs_mount_t *mp) 7041153323Srodrigc{ 7042153323Srodrigc xfs_ihash_t *ih; 7043153323Srodrigc int i; 7044153323Srodrigc int j; 7045153323Srodrigc int total; 7046153323Srodrigc int numzeros; 7047153323Srodrigc xfs_inode_t *ip; 7048153323Srodrigc int *hist; 7049153323Srodrigc int hist_bytes = mp->m_ihsize * sizeof(int); 7050153323Srodrigc int hist2[21]; 7051153323Srodrigc 7052153323Srodrigc hist = (int *) kmem_alloc(hist_bytes, KM_SLEEP); 7053153323Srodrigc 7054153323Srodrigc if (hist == NULL) { 7055153323Srodrigc kdb_printf("xfsidbg_xihash: kmalloc(%d) failed!\n", 7056153323Srodrigc hist_bytes); 7057153323Srodrigc return; 7058153323Srodrigc } 7059153323Srodrigc 7060153323Srodrigc for (i = 0; i < mp->m_ihsize; i++) { 7061153323Srodrigc ih = mp->m_ihash + i; 7062153323Srodrigc j = 0; 7063153323Srodrigc for (ip = ih->ih_next; ip != NULL; ip = ip->i_next) 7064153323Srodrigc j++; 7065153323Srodrigc hist[i] = j; 7066153323Srodrigc } 7067153323Srodrigc 7068153323Srodrigc numzeros = total = 0; 7069153323Srodrigc 7070153323Srodrigc for (i = 0; i < 21; i++) 7071153323Srodrigc hist2[i] = 0; 7072153323Srodrigc 7073153323Srodrigc for (i = 0; i < mp->m_ihsize; i++) { 7074153323Srodrigc kdb_printf("%d ", hist[i]); 7075153323Srodrigc total += hist[i]; 7076153323Srodrigc numzeros += hist[i] == 0 ? 1 : 0; 7077153323Srodrigc if (hist[i] > 20) 7078153323Srodrigc j = 20; 7079153323Srodrigc else 7080153323Srodrigc j = hist[i]; 7081153323Srodrigc 7082153323Srodrigc if (! (j <= 20)) { 7083153323Srodrigc kdb_printf("xfsidbg_xihash: (j > 20)/%d @ line # %d\n", 7084153323Srodrigc j, __LINE__); 7085153323Srodrigc return; 7086153323Srodrigc } 7087153323Srodrigc 7088153323Srodrigc hist2[j]++; 7089153323Srodrigc } 7090153323Srodrigc 7091153323Srodrigc kdb_printf("\n"); 7092153323Srodrigc 7093153323Srodrigc kdb_printf("total inodes = %d, average length = %d, adjusted average = %d \n", 7094153323Srodrigc total, total / mp->m_ihsize, 7095153323Srodrigc total / (mp->m_ihsize - numzeros)); 7096153323Srodrigc 7097153323Srodrigc for (i = 0; i < 21; i++) { 7098153323Srodrigc kdb_printf("%d - %d , ", i, hist2[i]); 7099153323Srodrigc } 7100153323Srodrigc kdb_printf("\n"); 7101153323Srodrigc kmem_free(hist, hist_bytes); 7102153323Srodrigc} 7103153323Srodrigc 7104153323Srodrigc/* 7105153323Srodrigc * Command to print xfs inodes: kp xnode <addr> 7106153323Srodrigc */ 7107153323Srodrigcstatic void 7108153323Srodrigcxfsidbg_xnode(xfs_inode_t *ip) 7109153323Srodrigc{ 7110153323Srodrigc static char *tab_flags[] = { 7111153323Srodrigc "grio", /* XFS_IGRIO */ 7112153323Srodrigc "uiosize", /* XFS_IUIOSZ */ 7113153323Srodrigc "quiesce", /* XFS_IQUIESCE */ 7114153323Srodrigc "reclaim", /* XFS_IRECLAIM */ 7115153323Srodrigc "stale", /* XFS_ISTALE */ 7116153323Srodrigc NULL 7117153323Srodrigc }; 7118153323Srodrigc 7119153323Srodrigc kdb_printf("hash 0x%p next 0x%p prevp 0x%p mount 0x%p\n", 7120153323Srodrigc ip->i_hash, 7121153323Srodrigc ip->i_next, 7122153323Srodrigc ip->i_prevp, 7123153323Srodrigc ip->i_mount); 7124153323Srodrigc kdb_printf("mnext 0x%p mprev 0x%p vnode 0x%p \n", 7125153323Srodrigc ip->i_mnext, 7126153323Srodrigc ip->i_mprev, 7127153323Srodrigc XFS_ITOV_NULL(ip)); 7128153323Srodrigc kdb_printf("dev %s ino %s\n", 7129153323Srodrigc devtoname(ip->i_mount->m_dev), 7130153323Srodrigc xfs_fmtino(ip->i_ino, ip->i_mount)); 7131153323Srodrigc kdb_printf("blkno 0x%llx len 0x%x boffset 0x%x\n", 7132153323Srodrigc (long long) ip->i_blkno, 7133153323Srodrigc ip->i_len, 7134153323Srodrigc ip->i_boffset); 7135153323Srodrigc kdb_printf("transp 0x%p &itemp 0x%p\n", 7136153323Srodrigc ip->i_transp, 7137153323Srodrigc ip->i_itemp); 7138153323Srodrigc kdb_printf("&lock 0x%p &iolock 0x%p ", 7139153323Srodrigc &ip->i_lock, 7140153323Srodrigc &ip->i_iolock); 7141153323Srodrigc kdb_printf("&flock 0x%p (%d) pincount 0x%x\n", 7142153323Srodrigc &ip->i_flock, valusema(&ip->i_flock), 7143153323Srodrigc xfs_ipincount(ip)); 7144153323Srodrigc kdb_printf("udquotp 0x%p gdquotp 0x%p\n", 7145153323Srodrigc ip->i_udquot, ip->i_gdquot); 7146153323Srodrigc kdb_printf("new_size %Ld\n", ip->i_iocore.io_new_size); 7147153323Srodrigc printflags((int)ip->i_flags, tab_flags, "flags"); 7148153323Srodrigc kdb_printf("\n"); 7149153323Srodrigc kdb_printf("update_core %d update size %d\n", 7150153323Srodrigc (int)(ip->i_update_core), (int) ip->i_update_size); 7151153323Srodrigc kdb_printf("gen 0x%x delayed blks %d", 7152153323Srodrigc ip->i_gen, 7153153323Srodrigc ip->i_delayed_blks); 7154153323Srodrigc#ifdef XFS_BMAP_TRACE 7155153323Srodrigc qprintf(" bmap_trace 0x%p\n", ip->i_xtrace); 7156153323Srodrigc#endif 7157153323Srodrigc#ifdef XFS_BMBT_TRACE 7158153323Srodrigc qprintf(" bmbt trace 0x%p\n", ip->i_btrace); 7159153323Srodrigc#endif 7160153323Srodrigc#ifdef XFS_RW_TRACE 7161153323Srodrigc qprintf(" rw trace 0x%p\n", ip->i_rwtrace); 7162153323Srodrigc#endif 7163153323Srodrigc#ifdef XFS_ILOCK_TRACE 7164153323Srodrigc qprintf(" ilock trace 0x%p\n", ip->i_lock_trace); 7165153323Srodrigc#endif 7166153323Srodrigc#ifdef XFS_DIR2_TRACE 7167153323Srodrigc qprintf(" dir trace 0x%p\n", ip->i_dir_trace); 7168153323Srodrigc#endif 7169153323Srodrigc kdb_printf("\n"); 7170153323Srodrigc kdb_printf("chash 0x%p cnext 0x%p cprev 0x%p\n", 7171153323Srodrigc ip->i_chash, 7172153323Srodrigc ip->i_cnext, 7173153323Srodrigc ip->i_cprev); 7174153323Srodrigc xfs_xnode_fork("data", &ip->i_df); 7175153323Srodrigc xfs_xnode_fork("attr", ip->i_afp); 7176153323Srodrigc kdb_printf("\n"); 7177159451Srodrigc xfs_prdinode_core(&ip->i_d); 7178153323Srodrigc} 7179153323Srodrigc 7180153323Srodrigcstatic void 7181153323Srodrigcxfsidbg_xcore(xfs_iocore_t *io) 7182153323Srodrigc{ 7183153323Srodrigc kdb_printf("io_obj 0x%p io_flags 0x%x io_mount 0x%p\n", 7184153323Srodrigc io->io_obj, io->io_flags, io->io_mount); 7185153323Srodrigc kdb_printf("new_size %Lx\n", io->io_new_size); 7186153323Srodrigc} 7187153323Srodrigc 7188153323Srodrigc/* 7189153323Srodrigc * Command to print xfs inode cluster hash table: kp xchash <addr> 7190153323Srodrigc */ 7191153323Srodrigcstatic void 7192153323Srodrigcxfsidbg_xchash(xfs_mount_t *mp) 7193153323Srodrigc{ 7194153323Srodrigc int i; 7195153323Srodrigc xfs_chash_t *ch; 7196153323Srodrigc 7197153323Srodrigc kdb_printf("m_chash 0x%p size %d\n", 7198153323Srodrigc mp->m_chash, mp->m_chsize); 7199153323Srodrigc for (i = 0; i < mp->m_chsize; i++) { 7200153323Srodrigc ch = mp->m_chash + i; 7201153323Srodrigc kdb_printf("[%3d] ch 0x%p chashlist 0x%p\n", i, ch, ch->ch_list); 7202153323Srodrigc xfsidbg_xchashlist(ch->ch_list); 7203153323Srodrigc } 7204153323Srodrigc} 7205153323Srodrigc 7206153323Srodrigc/* 7207153323Srodrigc * Command to print xfs inode cluster hash list: kp xchashlist <addr> 7208153323Srodrigc */ 7209153323Srodrigcstatic void 7210153323Srodrigcxfsidbg_xchashlist(xfs_chashlist_t *chl) 7211153323Srodrigc{ 7212153323Srodrigc xfs_inode_t *ip; 7213153323Srodrigc 7214153323Srodrigc while (chl != NULL) { 7215153323Srodrigc kdb_printf("hashlist inode 0x%p blkno %lld buf 0x%p", 7216153323Srodrigc chl->chl_ip, (long long) chl->chl_blkno, chl->chl_buf); 7217153323Srodrigc 7218153323Srodrigc kdb_printf("\n"); 7219153323Srodrigc 7220153323Srodrigc /* print inodes on chashlist */ 7221153323Srodrigc ip = chl->chl_ip; 7222153323Srodrigc do { 7223153323Srodrigc kdb_printf("0x%p ", ip); 7224153323Srodrigc ip = ip->i_cnext; 7225153323Srodrigc } while (ip != chl->chl_ip); 7226153323Srodrigc kdb_printf("\n"); 7227153323Srodrigc 7228153323Srodrigc chl=chl->chl_next; 7229153323Srodrigc } 7230153323Srodrigc} 7231153323Srodrigc 7232153323Srodrigc/* 7233153323Srodrigc * Print xfs per-ag data structures for filesystem. 7234153323Srodrigc */ 7235153323Srodrigcstatic void 7236153323Srodrigcxfsidbg_xperag(xfs_mount_t *mp) 7237153323Srodrigc{ 7238153323Srodrigc xfs_agnumber_t agno; 7239153323Srodrigc xfs_perag_t *pag; 7240153323Srodrigc int busy; 7241153323Srodrigc 7242153323Srodrigc pag = mp->m_perag; 7243153323Srodrigc for (agno = 0; agno < mp->m_sb.sb_agcount; agno++, pag++) { 7244153323Srodrigc kdb_printf("ag %d f_init %d i_init %d\n", 7245153323Srodrigc agno, pag->pagf_init, pag->pagi_init); 7246153323Srodrigc if (pag->pagf_init) 7247153323Srodrigc kdb_printf( 7248153323Srodrigc " f_levels[b,c] %d,%d f_flcount %d f_freeblks %d f_longest %d\n" 7249153323Srodrigc " f__metadata %d\n", 7250153323Srodrigc pag->pagf_levels[XFS_BTNUM_BNOi], 7251153323Srodrigc pag->pagf_levels[XFS_BTNUM_CNTi], 7252153323Srodrigc pag->pagf_flcount, pag->pagf_freeblks, 7253153323Srodrigc pag->pagf_longest, pag->pagf_metadata); 7254153323Srodrigc if (pag->pagi_init) 7255153323Srodrigc kdb_printf(" i_freecount %d i_inodeok %d\n", 7256153323Srodrigc pag->pagi_freecount, pag->pagi_inodeok); 7257153323Srodrigc if (pag->pagf_init) { 7258153323Srodrigc for (busy = 0; busy < XFS_PAGB_NUM_SLOTS; busy++) { 7259153323Srodrigc if (pag->pagb_list[busy].busy_length != 0) { 7260153323Srodrigc kdb_printf( 7261153323Srodrigc " %04d: start %d length %d tp 0x%p\n", 7262153323Srodrigc busy, 7263153323Srodrigc pag->pagb_list[busy].busy_start, 7264153323Srodrigc pag->pagb_list[busy].busy_length, 7265153323Srodrigc pag->pagb_list[busy].busy_tp); 7266153323Srodrigc } 7267153323Srodrigc } 7268153323Srodrigc } 7269153323Srodrigc } 7270153323Srodrigc} 7271153323Srodrigc 7272153323Srodrigc#ifdef CONFIG_XFS_QUOTA 7273153323Srodrigcstatic void 7274159451Srodrigcxfsidbg_xqm(void) 7275153323Srodrigc{ 7276153323Srodrigc if (xfs_Gqm == NULL) { 7277153323Srodrigc kdb_printf("NULL XQM!!\n"); 7278153323Srodrigc return; 7279153323Srodrigc } 7280153323Srodrigc 7281159451Srodrigc kdb_printf("usrhtab 0x%p grphtab 0x%p ndqfree 0x%x hashmask 0x%x\n", 7282153323Srodrigc xfs_Gqm->qm_usr_dqhtable, 7283153323Srodrigc xfs_Gqm->qm_grp_dqhtable, 7284153323Srodrigc xfs_Gqm->qm_dqfreelist.qh_nelems, 7285153323Srodrigc xfs_Gqm->qm_dqhashmask); 7286153323Srodrigc kdb_printf("&freelist 0x%p, totaldquots 0x%x nrefs 0x%x\n", 7287153323Srodrigc &xfs_Gqm->qm_dqfreelist, 7288153323Srodrigc atomic_read(&xfs_Gqm->qm_totaldquots), 7289153323Srodrigc xfs_Gqm->qm_nrefs); 7290153323Srodrigc} 7291153323Srodrigc#endif 7292153323Srodrigc 7293153323Srodrigcstatic void 7294153323Srodrigcxfsidbg_xqm_diskdq(xfs_disk_dquot_t *d) 7295153323Srodrigc{ 7296153323Srodrigc kdb_printf("magic 0x%x\tversion 0x%x\tID 0x%x (%d)\t\n", 7297159451Srodrigc be16_to_cpu(d->d_magic), d->d_version, 7298159451Srodrigc be32_to_cpu(d->d_id), be32_to_cpu(d->d_id)); 7299153323Srodrigc kdb_printf("bhard 0x%llx\tbsoft 0x%llx\tihard 0x%llx\tisoft 0x%llx\n", 7300159451Srodrigc be64_to_cpu(d->d_blk_hardlimit), 7301159451Srodrigc be64_to_cpu(d->d_blk_softlimit), 7302159451Srodrigc be64_to_cpu(d->d_ino_hardlimit), 7303159451Srodrigc be64_to_cpu(d->d_ino_softlimit)); 7304153323Srodrigc kdb_printf("bcount 0x%llx icount 0x%llx\n", 7305159451Srodrigc be64_to_cpu(d->d_bcount), 7306159451Srodrigc be64_to_cpu(d->d_icount)); 7307153323Srodrigc kdb_printf("btimer 0x%x itimer 0x%x \n", 7308159451Srodrigc be32_to_cpu(d->d_btimer), 7309159451Srodrigc be32_to_cpu(d->d_itimer)); 7310153323Srodrigc} 7311153323Srodrigc 7312159451Srodrigcstatic char *xdq_flags[] = { 7313159451Srodrigc "USER", /* XFS_DQ_USER */ 7314159451Srodrigc "PROJ", /* XFS_DQ_PROJ */ 7315159451Srodrigc "GROUP", /* XFS_DQ_GROUP */ 7316159451Srodrigc "FLKD", /* XFS_DQ_FLOCKED */ 7317159451Srodrigc "DIRTY", /* XFS_DQ_DIRTY */ 7318159451Srodrigc "WANT", /* XFS_DQ_WANT */ 7319159451Srodrigc "INACT", /* XFS_DQ_INACTIVE */ 7320159451Srodrigc "MARKER", /* XFS_DQ_MARKER */ 7321159451Srodrigc NULL 7322159451Srodrigc}; 7323159451Srodrigc 7324153323Srodrigcstatic void 7325153323Srodrigcxfsidbg_xqm_dquot(xfs_dquot_t *dqp) 7326153323Srodrigc{ 7327153323Srodrigc kdb_printf("mount 0x%p hash 0x%p gdquotp 0x%p HL_next 0x%p HL_prevp 0x%p\n", 7328153323Srodrigc dqp->q_mount, 7329153323Srodrigc dqp->q_hash, 7330153323Srodrigc dqp->q_gdquot, 7331153323Srodrigc dqp->HL_NEXT, 7332153323Srodrigc dqp->HL_PREVP); 7333153323Srodrigc kdb_printf("MPL_next 0x%p MPL_prevp 0x%p FL_next 0x%p FL_prev 0x%p\n", 7334153323Srodrigc dqp->MPL_NEXT, 7335153323Srodrigc dqp->MPL_PREVP, 7336153323Srodrigc dqp->dq_flnext, 7337153323Srodrigc dqp->dq_flprev); 7338153323Srodrigc 7339159451Srodrigc kdb_printf("nrefs 0x%x blkno 0x%llx boffset 0x%x ", dqp->q_nrefs, 7340159451Srodrigc (unsigned long long)dqp->q_blkno, dqp->q_bufoffset); 7341159451Srodrigc printflags(dqp->dq_flags, xdq_flags, "flags:"); 7342159451Srodrigc kdb_printf("res_bcount %llu res_icount %llu res_rtbcount %llu\n", 7343159451Srodrigc (unsigned long long)dqp->q_res_bcount, 7344159451Srodrigc (unsigned long long)dqp->q_res_icount, 7345159451Srodrigc (unsigned long long)dqp->q_res_rtbcount); 7346153323Srodrigc kdb_printf("qlock 0x%p flock 0x%p (%s) pincount 0x%x\n", 7347153323Srodrigc &dqp->q_qlock, 7348153323Srodrigc &dqp->q_flock, 7349153323Srodrigc (valusema(&dqp->q_flock) <= 0) ? "LCK" : "UNLKD", 7350153323Srodrigc dqp->q_pincount); 7351153323Srodrigc#ifdef XFS_DQUOT_TRACE 7352153323Srodrigc qprintf("dqtrace 0x%p\n", dqp->q_trace); 7353153323Srodrigc#endif 7354153323Srodrigc kdb_printf("disk-dquot 0x%p\n", &dqp->q_core); 7355153323Srodrigc xfsidbg_xqm_diskdq(&dqp->q_core); 7356153323Srodrigc 7357153323Srodrigc} 7358153323Srodrigc 7359153323Srodrigc 7360153323Srodrigc#define XQMIDBG_LIST_PRINT(l, NXT) \ 7361153323Srodrigc{ \ 7362153323Srodrigc xfs_dquot_t *dqp;\ 7363153323Srodrigc int i = 0; \ 7364153323Srodrigc kdb_printf("[#%d dquots]\n", (int) (l)->qh_nelems); \ 7365153323Srodrigc for (dqp = (l)->qh_next; dqp != NULL; dqp = dqp->NXT) {\ 7366153323Srodrigc kdb_printf( \ 7367153323Srodrigc "\t%d. [0x%p] \"%d (%s)\"\t blks = %d, inos = %d refs = %d\n", \ 7368159451Srodrigc ++i, dqp, (int) be32_to_cpu(dqp->q_core.d_id), \ 7369153323Srodrigc DQFLAGTO_TYPESTR(dqp), \ 7370159451Srodrigc (int) be64_to_cpu(dqp->q_core.d_bcount), \ 7371159451Srodrigc (int) be64_to_cpu(dqp->q_core.d_icount), \ 7372153323Srodrigc (int) dqp->q_nrefs); }\ 7373153323Srodrigc kdb_printf("\n"); \ 7374153323Srodrigc} 7375153323Srodrigc 7376153323Srodrigcstatic void 7377153323Srodrigcxfsidbg_xqm_dqattached_inos(xfs_mount_t *mp) 7378153323Srodrigc{ 7379153323Srodrigc xfs_inode_t *ip; 7380153323Srodrigc int n = 0; 7381153323Srodrigc 7382153323Srodrigc ip = mp->m_inodes; 7383153323Srodrigc do { 7384153323Srodrigc if (ip->i_mount == NULL) { 7385153323Srodrigc ip = ip->i_mnext; 7386153323Srodrigc continue; 7387153323Srodrigc } 7388153323Srodrigc if (ip->i_udquot || ip->i_gdquot) { 7389153323Srodrigc n++; 7390153323Srodrigc kdb_printf("inode = 0x%p, ino %d: udq 0x%p, gdq 0x%p\n", 7391153323Srodrigc ip, (int)ip->i_ino, ip->i_udquot, ip->i_gdquot); 7392153323Srodrigc } 7393153323Srodrigc ip = ip->i_mnext; 7394153323Srodrigc } while (ip != mp->m_inodes); 7395153323Srodrigc kdb_printf("\nNumber of inodes with dquots attached: %d\n", n); 7396153323Srodrigc} 7397153323Srodrigc 7398153323Srodrigc#ifdef CONFIG_XFS_QUOTA 7399153323Srodrigcstatic void 7400153323Srodrigcxfsidbg_xqm_freelist_print(xfs_frlist_t *qlist, char *title) 7401153323Srodrigc{ 7402153323Srodrigc xfs_dquot_t *dq; 7403153323Srodrigc int i = 0; 7404153323Srodrigc kdb_printf("%s (#%d)\n", title, (int) qlist->qh_nelems); 7405153323Srodrigc FOREACH_DQUOT_IN_FREELIST(dq, qlist) { 7406153323Srodrigc kdb_printf("\t%d.\t\"%d (%s:0x%p)\"\t bcnt = %d, icnt = %d " 7407153323Srodrigc "refs = %d\n", 7408159451Srodrigc ++i, (int) be32_to_cpu(dq->q_core.d_id), 7409153323Srodrigc DQFLAGTO_TYPESTR(dq), dq, 7410159451Srodrigc (int) be64_to_cpu(dq->q_core.d_bcount), 7411159451Srodrigc (int) be64_to_cpu(dq->q_core.d_icount), 7412153323Srodrigc (int) dq->q_nrefs); 7413153323Srodrigc } 7414153323Srodrigc} 7415153323Srodrigc 7416153323Srodrigcstatic void 7417153323Srodrigcxfsidbg_xqm_freelist(void) 7418153323Srodrigc{ 7419153323Srodrigc if (xfs_Gqm) { 7420153323Srodrigc xfsidbg_xqm_freelist_print(&(xfs_Gqm->qm_dqfreelist), "Freelist"); 7421153323Srodrigc } else 7422153323Srodrigc kdb_printf("NULL XQM!!\n"); 7423153323Srodrigc} 7424153323Srodrigc 7425153323Srodrigcstatic void 7426153323Srodrigcxfsidbg_xqm_htab(void) 7427153323Srodrigc{ 7428153323Srodrigc int i; 7429153323Srodrigc xfs_dqhash_t *h; 7430153323Srodrigc 7431153323Srodrigc if (xfs_Gqm == NULL) { 7432153323Srodrigc kdb_printf("NULL XQM!!\n"); 7433153323Srodrigc return; 7434153323Srodrigc } 7435153323Srodrigc for (i = 0; i <= xfs_Gqm->qm_dqhashmask; i++) { 7436153323Srodrigc h = &xfs_Gqm->qm_usr_dqhtable[i]; 7437153323Srodrigc if (h->qh_next) { 7438153323Srodrigc kdb_printf("USR %d: ", i); 7439153323Srodrigc XQMIDBG_LIST_PRINT(h, HL_NEXT); 7440153323Srodrigc } 7441153323Srodrigc } 7442153323Srodrigc for (i = 0; i <= xfs_Gqm->qm_dqhashmask; i++) { 7443153323Srodrigc h = &xfs_Gqm->qm_grp_dqhtable[i]; 7444153323Srodrigc if (h->qh_next) { 7445159451Srodrigc kdb_printf("GRP/PRJ %d: ", i); 7446153323Srodrigc XQMIDBG_LIST_PRINT(h, HL_NEXT); 7447153323Srodrigc } 7448153323Srodrigc } 7449153323Srodrigc} 7450153323Srodrigc#endif 7451153323Srodrigc 7452153323Srodrigc#ifdef XFS_DQUOT_TRACE 7453153323Srodrigcstatic int 7454153323Srodrigcxfsidbg_xqm_pr_dqentry(ktrace_entry_t *ktep) 7455153323Srodrigc{ 7456153323Srodrigc if ((__psint_t)ktep->val[0] == 0) 7457153323Srodrigc return 0; 7458153323Srodrigc switch ((__psint_t)ktep->val[0]) { 7459153323Srodrigc case DQUOT_KTRACE_ENTRY: 7460153323Srodrigc qprintf("[%ld] %s\t", 7461153323Srodrigc (long)ktep->val[12], /* pid */ 7462153323Srodrigc (char *)ktep->val[1]); 7463153323Srodrigc printflags((__psint_t)ktep->val[3], xdq_flags,"flgs "); 7464153323Srodrigc qprintf("\nnrefs = %u, " 7465153323Srodrigc "flags = 0x%x, " 7466153323Srodrigc "id = %d, " 7467153323Srodrigc "res_bc = 0x%x\n" 7468153323Srodrigc "bcnt = 0x%x [0x%x | 0x%x], " 7469153323Srodrigc "icnt = 0x%x [0x%x | 0x%x]\n" 7470153323Srodrigc "@ %ld\n", 7471153323Srodrigc (unsigned int)(long)ktep->val[2], /* nrefs */ 7472153323Srodrigc (unsigned int)(long)ktep->val[3], /* flags */ 7473153323Srodrigc (unsigned int)(long)ktep->val[11], /* ID */ 7474153323Srodrigc (unsigned int)(long)ktep->val[4], /* res_bc */ 7475153323Srodrigc (unsigned int)(long)ktep->val[5], /* bcnt */ 7476153323Srodrigc (unsigned int)(long)ktep->val[8], /* bsoft */ 7477153323Srodrigc (unsigned int)(long)ktep->val[7], /* bhard */ 7478153323Srodrigc (unsigned int)(long)ktep->val[6], /* icnt */ 7479153323Srodrigc (unsigned int)(long)ktep->val[10], /* isoft */ 7480153323Srodrigc (unsigned int)(long)ktep->val[9], /* ihard */ 7481153323Srodrigc (long) ktep->val[13] /* time */ 7482153323Srodrigc ); 7483153323Srodrigc break; 7484153323Srodrigc 7485153323Srodrigc default: 7486153323Srodrigc qprintf("unknown dqtrace record\n"); 7487153323Srodrigc break; 7488153323Srodrigc } 7489153323Srodrigc return (1); 7490153323Srodrigc} 7491153323Srodrigc 7492153323Srodrigcvoid 7493153323Srodrigcxfsidbg_xqm_dqtrace(xfs_dquot_t *dqp) 7494153323Srodrigc{ 7495153323Srodrigc ktrace_entry_t *ktep; 7496153323Srodrigc ktrace_snap_t kts; 7497153323Srodrigc 7498153323Srodrigc if (dqp->q_trace == NULL) { 7499153323Srodrigc qprintf("The xfs dquot trace buffer is not initialized\n"); 7500153323Srodrigc return; 7501153323Srodrigc } 7502153323Srodrigc qprintf("xdqtrace dquot 0x%p\n", dqp); 7503153323Srodrigc 7504153323Srodrigc ktep = ktrace_first(dqp->q_trace, &kts); 7505153323Srodrigc while (ktep != NULL) { 7506153323Srodrigc if (xfsidbg_xqm_pr_dqentry(ktep)) 7507153323Srodrigc qprintf("---------------------------------\n"); 7508153323Srodrigc ktep = ktrace_next(dqp->q_trace, &kts); 7509153323Srodrigc } 7510153323Srodrigc} 7511153323Srodrigc#endif 7512153323Srodrigc 7513153323Srodrigcstatic void 7514153323Srodrigcxfsidbg_xqm_mplist(xfs_mount_t *mp) 7515153323Srodrigc{ 7516153323Srodrigc if (mp->m_quotainfo == NULL) { 7517153323Srodrigc kdb_printf("NULL quotainfo\n"); 7518153323Srodrigc return; 7519153323Srodrigc } 7520153323Srodrigc 7521153323Srodrigc XQMIDBG_LIST_PRINT(&(mp->m_quotainfo->qi_dqlist), MPL_NEXT); 7522153323Srodrigc 7523153323Srodrigc} 7524153323Srodrigc 7525153323Srodrigc 7526153323Srodrigcstatic void 7527153323Srodrigcxfsidbg_xqm_qinfo(xfs_mount_t *mp) 7528153323Srodrigc{ 7529153323Srodrigc if (mp == NULL || mp->m_quotainfo == NULL) { 7530153323Srodrigc kdb_printf("NULL quotainfo\n"); 7531153323Srodrigc return; 7532153323Srodrigc } 7533153323Srodrigc 7534153323Srodrigc kdb_printf("uqip 0x%p, gqip 0x%p, &pinlock 0x%p &dqlist 0x%p\n", 7535153323Srodrigc mp->m_quotainfo->qi_uquotaip, 7536153323Srodrigc mp->m_quotainfo->qi_gquotaip, 7537153323Srodrigc &mp->m_quotainfo->qi_pinlock, 7538153323Srodrigc &mp->m_quotainfo->qi_dqlist); 7539153323Srodrigc 7540159451Srodrigc kdb_printf("btmlimit 0x%x, itmlimit 0x%x, RTbtmlim 0x%x\n", 7541153323Srodrigc (int)mp->m_quotainfo->qi_btimelimit, 7542153323Srodrigc (int)mp->m_quotainfo->qi_itimelimit, 7543153323Srodrigc (int)mp->m_quotainfo->qi_rtbtimelimit); 7544153323Srodrigc 7545159451Srodrigc kdb_printf("bwarnlim 0x%x, iwarnlim 0x%x, RTbwarnlim 0x%x\n", 7546153323Srodrigc (int)mp->m_quotainfo->qi_bwarnlimit, 7547153323Srodrigc (int)mp->m_quotainfo->qi_iwarnlimit, 7548159451Srodrigc (int)mp->m_quotainfo->qi_rtbwarnlimit); 7549159451Srodrigc 7550159451Srodrigc kdb_printf("nreclaims %d, &qofflock 0x%p, chunklen 0x%x, dqperchunk 0x%x\n", 7551159451Srodrigc (int)mp->m_quotainfo->qi_dqreclaims, 7552153323Srodrigc &mp->m_quotainfo->qi_quotaofflock, 7553153323Srodrigc (int)mp->m_quotainfo->qi_dqchunklen, 7554153323Srodrigc (int)mp->m_quotainfo->qi_dqperchunk); 7555153323Srodrigc} 7556153323Srodrigc 7557153323Srodrigcstatic void 7558153323Srodrigcxfsidbg_xqm_tpdqinfo(xfs_trans_t *tp) 7559153323Srodrigc{ 7560153323Srodrigc xfs_dqtrx_t *qa, *q; 7561153323Srodrigc int i,j; 7562153323Srodrigc 7563153323Srodrigc kdb_printf("dqinfo 0x%p\n", tp->t_dqinfo); 7564153323Srodrigc if (! tp->t_dqinfo) 7565153323Srodrigc return; 7566153323Srodrigc kdb_printf("USR: \n"); 7567153323Srodrigc qa = tp->t_dqinfo->dqa_usrdquots; 7568153323Srodrigc for (j = 0; j < 2; j++) { 7569153323Srodrigc for (i = 0; i < XFS_QM_TRANS_MAXDQS; i++) { 7570153323Srodrigc if (qa[i].qt_dquot == NULL) 7571153323Srodrigc break; 7572153323Srodrigc q = &qa[i]; 7573153323Srodrigc kdb_printf( 7574153323Srodrigc "\"%d\"[0x%p]: bres %d, bres-used %d, bdelta %d, del-delta %d, icnt-delta %d\n", 7575159451Srodrigc (int) be32_to_cpu(q->qt_dquot->q_core.d_id), 7576153323Srodrigc q->qt_dquot, 7577153323Srodrigc (int) q->qt_blk_res, 7578153323Srodrigc (int) q->qt_blk_res_used, 7579153323Srodrigc (int) q->qt_bcount_delta, 7580153323Srodrigc (int) q->qt_delbcnt_delta, 7581153323Srodrigc (int) q->qt_icount_delta); 7582153323Srodrigc } 7583153323Srodrigc if (j == 0) { 7584153323Srodrigc qa = tp->t_dqinfo->dqa_grpdquots; 7585159451Srodrigc kdb_printf("GRP/PRJ: \n"); 7586153323Srodrigc } 7587153323Srodrigc } 7588153323Srodrigc} 7589153323Srodrigc 7590153323Srodrigc/* 7591153323Srodrigc * Print xfs superblock. 7592153323Srodrigc */ 7593153323Srodrigcstatic void 7594159451Srodrigcxfsidbg_xsb(xfs_sb_t *sbp) 7595153323Srodrigc{ 7596153323Srodrigc kdb_printf("magicnum 0x%x blocksize 0x%x dblocks %Ld rblocks %Ld\n", 7597159451Srodrigc sbp->sb_magicnum, sbp->sb_blocksize, 7598159451Srodrigc sbp->sb_dblocks, sbp->sb_rblocks); 7599153323Srodrigc kdb_printf("rextents %Ld uuid %s logstart %s\n", 7600159451Srodrigc sbp->sb_rextents, xfs_fmtuuid(&sbp->sb_uuid), 7601159451Srodrigc xfs_fmtfsblock(sbp->sb_logstart, NULL)); 7602159451Srodrigc kdb_printf("rootino %s ", xfs_fmtino(sbp->sb_rootino, NULL)); 7603159451Srodrigc kdb_printf("rbmino %s ", xfs_fmtino(sbp->sb_rbmino, NULL)); 7604159451Srodrigc kdb_printf("rsumino %s\n", xfs_fmtino(sbp->sb_rsumino, NULL)); 7605153323Srodrigc kdb_printf("rextsize 0x%x agblocks 0x%x agcount 0x%x rbmblocks 0x%x\n", 7606159451Srodrigc sbp->sb_rextsize, sbp->sb_agblocks, sbp->sb_agcount, 7607159451Srodrigc sbp->sb_rbmblocks); 7608153323Srodrigc kdb_printf("logblocks 0x%x versionnum 0x%x sectsize 0x%x inodesize 0x%x\n", 7609159451Srodrigc sbp->sb_logblocks, sbp->sb_versionnum, sbp->sb_sectsize, 7610159451Srodrigc sbp->sb_inodesize); 7611153323Srodrigc kdb_printf("inopblock 0x%x blocklog 0x%x sectlog 0x%x inodelog 0x%x\n", 7612159451Srodrigc sbp->sb_inopblock, sbp->sb_blocklog, sbp->sb_sectlog, 7613159451Srodrigc sbp->sb_inodelog); 7614153323Srodrigc kdb_printf("inopblog %d agblklog %d rextslog %d inprogress %d imax_pct %d\n", 7615159451Srodrigc sbp->sb_inopblog, sbp->sb_agblklog, sbp->sb_rextslog, 7616159451Srodrigc sbp->sb_inprogress, sbp->sb_imax_pct); 7617153323Srodrigc kdb_printf("icount %Lx ifree %Lx fdblocks %Lx frextents %Lx\n", 7618159451Srodrigc sbp->sb_icount, sbp->sb_ifree, 7619159451Srodrigc sbp->sb_fdblocks, sbp->sb_frextents); 7620159451Srodrigc kdb_printf("uquotino %s ", xfs_fmtino(sbp->sb_uquotino, NULL)); 7621159451Srodrigc kdb_printf("gquotino %s ", xfs_fmtino(sbp->sb_gquotino, NULL)); 7622153323Srodrigc kdb_printf("qflags 0x%x flags 0x%x shared_vn %d inoaligmt %d\n", 7623159451Srodrigc sbp->sb_qflags, sbp->sb_flags, sbp->sb_shared_vn, 7624159451Srodrigc sbp->sb_inoalignmt); 7625153323Srodrigc kdb_printf("unit %d width %d dirblklog %d\n", 7626159451Srodrigc sbp->sb_unit, sbp->sb_width, sbp->sb_dirblklog); 7627159451Srodrigc kdb_printf("log sunit %d\n", sbp->sb_logsunit); 7628153323Srodrigc} 7629153323Srodrigc 7630159451Srodrigcstatic void 7631159451Srodrigcxfsidbg_xsb_convert(xfs_sb_t *sbp) 7632159451Srodrigc{ 7633159451Srodrigc xfs_sb_t sb; 7634153323Srodrigc 7635159451Srodrigc xfs_xlatesb(sbp, &sb, 1, XFS_SB_ALL_BITS); 7636159451Srodrigc 7637159451Srodrigc kdb_printf("<converted>\n"); 7638159451Srodrigc xfsidbg_xsb(&sb); 7639159451Srodrigc} 7640159451Srodrigc 7641153323Srodrigc/* 7642153323Srodrigc * Print out an XFS transaction structure. Print summaries for 7643153323Srodrigc * each of the items. 7644153323Srodrigc */ 7645153323Srodrigcstatic void 7646153323Srodrigcxfsidbg_xtp(xfs_trans_t *tp) 7647153323Srodrigc{ 7648153323Srodrigc xfs_log_item_chunk_t *licp; 7649153323Srodrigc xfs_log_item_desc_t *lidp; 7650153323Srodrigc xfs_log_busy_chunk_t *lbcp; 7651153323Srodrigc int i; 7652153323Srodrigc int chunk; 7653153323Srodrigc static char *xtp_flags[] = { 7654153323Srodrigc "dirty", /* 0x1 */ 7655153323Srodrigc "sb_dirty", /* 0x2 */ 7656153323Srodrigc "perm_log_res", /* 0x4 */ 7657159451Srodrigc "sync", /* 0x08 */ 7658153323Srodrigc "dq_dirty", /* 0x10 */ 7659159451Srodrigc NULL 7660153323Srodrigc }; 7661153323Srodrigc static char *lid_flags[] = { 7662153323Srodrigc "dirty", /* 0x1 */ 7663153323Srodrigc "pinned", /* 0x2 */ 7664153323Srodrigc "sync unlock", /* 0x4 */ 7665153323Srodrigc "buf stale", /* 0x8 */ 7666159451Srodrigc NULL 7667153323Srodrigc }; 7668153323Srodrigc 7669153323Srodrigc kdb_printf("tp 0x%p type ", tp); 7670159451Srodrigc xfsidbg_print_trans_type(tp->t_type); 7671153323Srodrigc kdb_printf(" mount 0x%p\n", tp->t_mountp); 7672153323Srodrigc kdb_printf("flags "); 7673153323Srodrigc printflags(tp->t_flags, xtp_flags,"xtp"); 7674153323Srodrigc kdb_printf("\n"); 7675153323Srodrigc kdb_printf("callback 0x%p forw 0x%p back 0x%p\n", 7676153323Srodrigc &tp->t_logcb, tp->t_forw, tp->t_back); 7677153323Srodrigc kdb_printf("log res %d block res %d block res used %d\n", 7678153323Srodrigc tp->t_log_res, tp->t_blk_res, tp->t_blk_res_used); 7679153323Srodrigc kdb_printf("rt res %d rt res used %d\n", tp->t_rtx_res, 7680153323Srodrigc tp->t_rtx_res_used); 7681153323Srodrigc kdb_printf("ticket 0x%lx lsn %s commit_lsn %s\n", 7682153323Srodrigc (unsigned long) tp->t_ticket, 7683153323Srodrigc xfs_fmtlsn(&tp->t_lsn), 7684153323Srodrigc xfs_fmtlsn(&tp->t_commit_lsn)); 7685153323Srodrigc kdb_printf("callback 0x%p callarg 0x%p\n", 7686153323Srodrigc tp->t_callback, tp->t_callarg); 7687153323Srodrigc kdb_printf("icount delta %ld ifree delta %ld\n", 7688153323Srodrigc tp->t_icount_delta, tp->t_ifree_delta); 7689153323Srodrigc kdb_printf("blocks delta %ld res blocks delta %ld\n", 7690153323Srodrigc tp->t_fdblocks_delta, tp->t_res_fdblocks_delta); 7691153323Srodrigc kdb_printf("rt delta %ld res rt delta %ld\n", 7692153323Srodrigc tp->t_frextents_delta, tp->t_res_frextents_delta); 7693153323Srodrigc kdb_printf("ag freeblks delta %ld ag flist delta %ld ag btree delta %ld\n", 7694153323Srodrigc tp->t_ag_freeblks_delta, tp->t_ag_flist_delta, 7695153323Srodrigc tp->t_ag_btree_delta); 7696153323Srodrigc kdb_printf("dblocks delta %ld agcount delta %ld imaxpct delta %ld\n", 7697153323Srodrigc tp->t_dblocks_delta, tp->t_agcount_delta, tp->t_imaxpct_delta); 7698153323Srodrigc kdb_printf("rextsize delta %ld rbmblocks delta %ld\n", 7699153323Srodrigc tp->t_rextsize_delta, tp->t_rbmblocks_delta); 7700153323Srodrigc kdb_printf("rblocks delta %ld rextents delta %ld rextslog delta %ld\n", 7701153323Srodrigc tp->t_rblocks_delta, tp->t_rextents_delta, 7702153323Srodrigc tp->t_rextslog_delta); 7703153323Srodrigc kdb_printf("dqinfo 0x%p\n", tp->t_dqinfo); 7704153323Srodrigc kdb_printf("log items:\n"); 7705153323Srodrigc licp = &tp->t_items; 7706153323Srodrigc chunk = 0; 7707153323Srodrigc while (licp != NULL) { 7708153323Srodrigc if (XFS_LIC_ARE_ALL_FREE(licp)) { 7709153323Srodrigc licp = licp->lic_next; 7710153323Srodrigc chunk++; 7711153323Srodrigc continue; 7712153323Srodrigc } 7713153323Srodrigc for (i = 0; i < licp->lic_unused; i++) { 7714153323Srodrigc if (XFS_LIC_ISFREE(licp, i)) { 7715153323Srodrigc continue; 7716153323Srodrigc } 7717153323Srodrigc 7718153323Srodrigc lidp = XFS_LIC_SLOT(licp, i); 7719153323Srodrigc kdb_printf("\n"); 7720153323Srodrigc kdb_printf("chunk %d index %d item 0x%p size %d\n", 7721153323Srodrigc chunk, i, lidp->lid_item, lidp->lid_size); 7722153323Srodrigc kdb_printf("flags "); 7723153323Srodrigc printflags(lidp->lid_flags, lid_flags,"lic"); 7724153323Srodrigc kdb_printf("\n"); 7725153323Srodrigc xfsidbg_xlogitem(lidp->lid_item); 7726153323Srodrigc } 7727153323Srodrigc chunk++; 7728153323Srodrigc licp = licp->lic_next; 7729153323Srodrigc } 7730153323Srodrigc 7731153323Srodrigc kdb_printf("log busy free %d, list:\n", tp->t_busy_free); 7732153323Srodrigc lbcp = &tp->t_busy; 7733153323Srodrigc chunk = 0; 7734153323Srodrigc while (lbcp != NULL) { 7735153323Srodrigc kdb_printf("Chunk %d at 0x%p next 0x%p free 0x%08x unused %d\n", 7736153323Srodrigc chunk, lbcp, lbcp->lbc_next, lbcp->lbc_free, 7737153323Srodrigc lbcp->lbc_unused); 7738153323Srodrigc for (i = 0; i < XFS_LBC_NUM_SLOTS; i++) { 7739153323Srodrigc kdb_printf(" %02d: ag %d idx %d\n", 7740153323Srodrigc i, 7741153323Srodrigc lbcp->lbc_busy[i].lbc_ag, 7742153323Srodrigc lbcp->lbc_busy[i].lbc_idx); 7743153323Srodrigc } 7744153323Srodrigc lbcp = lbcp->lbc_next; 7745153323Srodrigc } 7746153323Srodrigc} 7747153323Srodrigc 7748153323Srodrigcstatic void 7749153323Srodrigcxfsidbg_xtrans_res( 7750153323Srodrigc xfs_mount_t *mp) 7751153323Srodrigc{ 7752153323Srodrigc xfs_trans_reservations_t *xtrp; 7753153323Srodrigc 7754153323Srodrigc xtrp = &mp->m_reservations; 7755153323Srodrigc kdb_printf("write: %d\ttruncate: %d\trename: %d\n", 7756153323Srodrigc xtrp->tr_write, xtrp->tr_itruncate, xtrp->tr_rename); 7757153323Srodrigc kdb_printf("link: %d\tremove: %d\tsymlink: %d\n", 7758153323Srodrigc xtrp->tr_link, xtrp->tr_remove, xtrp->tr_symlink); 7759153323Srodrigc kdb_printf("create: %d\tmkdir: %d\tifree: %d\n", 7760153323Srodrigc xtrp->tr_create, xtrp->tr_mkdir, xtrp->tr_ifree); 7761153323Srodrigc kdb_printf("ichange: %d\tgrowdata: %d\tswrite: %d\n", 7762153323Srodrigc xtrp->tr_ichange, xtrp->tr_growdata, xtrp->tr_swrite); 7763153323Srodrigc kdb_printf("addafork: %d\twriteid: %d\tattrinval: %d\n", 7764153323Srodrigc xtrp->tr_addafork, xtrp->tr_writeid, xtrp->tr_attrinval); 7765153323Srodrigc kdb_printf("attrset: %d\tattrrm: %d\tclearagi: %d\n", 7766153323Srodrigc xtrp->tr_attrset, xtrp->tr_attrrm, xtrp->tr_clearagi); 7767153323Srodrigc kdb_printf("growrtalloc: %d\tgrowrtzero: %d\tgrowrtfree: %d\n", 7768153323Srodrigc xtrp->tr_growrtalloc, xtrp->tr_growrtzero, xtrp->tr_growrtfree); 7769153323Srodrigc} 7770