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