diff options
Diffstat (limited to 'fs/xfs')
| -rw-r--r-- | fs/xfs/Makefile | 3 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 24 | ||||
| -rw-r--r-- | fs/xfs/xfs.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_alloc_btree.c | 73 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap_btree.c | 356 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap_btree.h | 18 | ||||
| -rw-r--r-- | fs/xfs/xfs_btree.h | 19 | ||||
| -rw-r--r-- | fs/xfs/xfs_ialloc_btree.c | 73 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 5 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.h | 2 | 
10 files changed, 309 insertions, 266 deletions
diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 737c9a42536..75b2be72c39 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -91,7 +91,8 @@ xfs-y				+= xfs_alloc.o \  				   xfs_dmops.o \  				   xfs_qmops.o -xfs-$(CONFIG_XFS_TRACE)		+= xfs_dir2_trace.o +xfs-$(CONFIG_XFS_TRACE)		+= xfs_btree_trace.o \ +				   xfs_dir2_trace.o  # Objects in linux/  xfs-y				+= $(addprefix $(XFS_LINUX)/, \ diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 9bfb26066a8..0c71c215853 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -36,6 +36,7 @@  #include "xfs_dinode.h"  #include "xfs_inode.h"  #include "xfs_btree.h" +#include "xfs_btree_trace.h"  #include "xfs_ialloc.h"  #include "xfs_bmap.h"  #include "xfs_rtalloc.h" @@ -1916,10 +1917,19 @@ xfs_alloc_trace_bufs(void)  	if (!xfs_bmap_trace_buf)  		goto out_free_alloc_trace;  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE +	xfs_allocbt_trace_buf = ktrace_alloc(XFS_ALLOCBT_TRACE_SIZE, +					     KM_MAYFAIL); +	if (!xfs_allocbt_trace_buf) +		goto out_free_bmap_trace; + +	xfs_inobt_trace_buf = ktrace_alloc(XFS_INOBT_TRACE_SIZE, KM_MAYFAIL); +	if (!xfs_inobt_trace_buf) +		goto out_free_allocbt_trace; +  	xfs_bmbt_trace_buf = ktrace_alloc(XFS_BMBT_TRACE_SIZE, KM_MAYFAIL);  	if (!xfs_bmbt_trace_buf) -		goto out_free_bmap_trace; +		goto out_free_inobt_trace;  #endif  #ifdef XFS_ATTR_TRACE  	xfs_attr_trace_buf = ktrace_alloc(XFS_ATTR_TRACE_SIZE, KM_MAYFAIL); @@ -1941,8 +1951,12 @@ xfs_alloc_trace_bufs(void)  	ktrace_free(xfs_attr_trace_buf);   out_free_bmbt_trace:  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE  	ktrace_free(xfs_bmbt_trace_buf); + out_free_inobt_trace: +	ktrace_free(xfs_inobt_trace_buf); + out_free_allocbt_trace: +	ktrace_free(xfs_allocbt_trace_buf);   out_free_bmap_trace:  #endif  #ifdef XFS_BMAP_TRACE @@ -1965,8 +1979,10 @@ xfs_free_trace_bufs(void)  #ifdef XFS_ATTR_TRACE  	ktrace_free(xfs_attr_trace_buf);  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE  	ktrace_free(xfs_bmbt_trace_buf); +	ktrace_free(xfs_inobt_trace_buf); +	ktrace_free(xfs_allocbt_trace_buf);  #endif  #ifdef XFS_BMAP_TRACE  	ktrace_free(xfs_bmap_trace_buf); diff --git a/fs/xfs/xfs.h b/fs/xfs/xfs.h index 540e4c98982..17254b529c5 100644 --- a/fs/xfs/xfs.h +++ b/fs/xfs/xfs.h @@ -30,7 +30,7 @@  #define XFS_ATTR_TRACE 1  #define XFS_BLI_TRACE 1  #define XFS_BMAP_TRACE 1 -#define XFS_BMBT_TRACE 1 +#define XFS_BTREE_TRACE 1  #define XFS_DIR2_TRACE 1  #define XFS_DQUOT_TRACE 1  #define XFS_ILOCK_TRACE 1 diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 60c121f1e81..9c91dfcb6f2 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -2219,8 +2219,81 @@ xfs_allocbt_dup_cursor(  			cur->bc_btnum);  } +#ifdef XFS_BTREE_TRACE +ktrace_t	*xfs_allocbt_trace_buf; + +STATIC void +xfs_allocbt_trace_enter( +	struct xfs_btree_cur	*cur, +	const char		*func, +	char			*s, +	int			type, +	int			line, +	__psunsigned_t		a0, +	__psunsigned_t		a1, +	__psunsigned_t		a2, +	__psunsigned_t		a3, +	__psunsigned_t		a4, +	__psunsigned_t		a5, +	__psunsigned_t		a6, +	__psunsigned_t		a7, +	__psunsigned_t		a8, +	__psunsigned_t		a9, +	__psunsigned_t		a10) +{ +	ktrace_enter(xfs_allocbt_trace_buf, (void *)(__psint_t)type, +		(void *)func, (void *)s, NULL, (void *)cur, +		(void *)a0, (void *)a1, (void *)a2, (void *)a3, +		(void *)a4, (void *)a5, (void *)a6, (void *)a7, +		(void *)a8, (void *)a9, (void *)a10); +} + +STATIC void +xfs_allocbt_trace_cursor( +	struct xfs_btree_cur	*cur, +	__uint32_t		*s0, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	*s0 = cur->bc_private.a.agno; +	*l0 = cur->bc_rec.a.ar_startblock; +	*l1 = cur->bc_rec.a.ar_blockcount; +} + +STATIC void +xfs_allocbt_trace_key( +	struct xfs_btree_cur	*cur, +	union xfs_btree_key	*key, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	*l0 = be32_to_cpu(key->alloc.ar_startblock); +	*l1 = be32_to_cpu(key->alloc.ar_blockcount); +} + +STATIC void +xfs_allocbt_trace_record( +	struct xfs_btree_cur	*cur, +	union xfs_btree_rec	*rec, +	__uint64_t		*l0, +	__uint64_t		*l1, +	__uint64_t		*l2) +{ +	*l0 = be32_to_cpu(rec->alloc.ar_startblock); +	*l1 = be32_to_cpu(rec->alloc.ar_blockcount); +	*l2 = 0; +} +#endif /* XFS_BTREE_TRACE */ +  static const struct xfs_btree_ops xfs_allocbt_ops = {  	.dup_cursor		= xfs_allocbt_dup_cursor, + +#ifdef XFS_BTREE_TRACE +	.trace_enter		= xfs_allocbt_trace_enter, +	.trace_cursor		= xfs_allocbt_trace_cursor, +	.trace_key		= xfs_allocbt_trace_key, +	.trace_record		= xfs_allocbt_trace_record, +#endif  };  /* diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 519249e2053..16f2fde6433 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -37,16 +37,13 @@  #include "xfs_inode_item.h"  #include "xfs_alloc.h"  #include "xfs_btree.h" +#include "xfs_btree_trace.h"  #include "xfs_ialloc.h"  #include "xfs_itable.h"  #include "xfs_bmap.h"  #include "xfs_error.h"  #include "xfs_quota.h" -#if defined(XFS_BMBT_TRACE) -ktrace_t	*xfs_bmbt_trace_buf; -#endif -  /*   * Prototypes for internal btree functions.   */ @@ -61,245 +58,33 @@ STATIC int xfs_bmbt_split(xfs_btree_cur_t *, int, xfs_fsblock_t *,  		__uint64_t *, xfs_btree_cur_t **, int *);  STATIC int xfs_bmbt_updkey(xfs_btree_cur_t *, xfs_bmbt_key_t *, int); - -#if defined(XFS_BMBT_TRACE) - -static char	ARGS[] = "args"; -static char	ENTRY[] = "entry"; -static char	ERROR[] = "error";  #undef EXIT -static char	EXIT[] = "exit"; - -/* - * Add a trace buffer entry for the arguments given to the routine, - * generic form. - */ -STATIC void -xfs_bmbt_trace_enter( -	const char	*func, -	xfs_btree_cur_t	*cur, -	char		*s, -	int		type, -	int		line, -	__psunsigned_t	a0, -	__psunsigned_t	a1, -	__psunsigned_t	a2, -	__psunsigned_t	a3, -	__psunsigned_t	a4, -	__psunsigned_t	a5, -	__psunsigned_t	a6, -	__psunsigned_t	a7, -	__psunsigned_t	a8, -	__psunsigned_t	a9, -	__psunsigned_t	a10) -{ -	xfs_inode_t	*ip; -	int		whichfork; - -	ip = cur->bc_private.b.ip; -	whichfork = cur->bc_private.b.whichfork; -	ktrace_enter(xfs_bmbt_trace_buf, -		(void *)((__psint_t)type | (whichfork << 8) | (line << 16)), -		(void *)func, (void *)s, (void *)ip, (void *)cur, -		(void *)a0, (void *)a1, (void *)a2, (void *)a3, -		(void *)a4, (void *)a5, (void *)a6, (void *)a7, -		(void *)a8, (void *)a9, (void *)a10); -	ASSERT(ip->i_btrace); -	ktrace_enter(ip->i_btrace, -		(void *)((__psint_t)type | (whichfork << 8) | (line << 16)), -		(void *)func, (void *)s, (void *)ip, (void *)cur, -		(void *)a0, (void *)a1, (void *)a2, (void *)a3, -		(void *)a4, (void *)a5, (void *)a6, (void *)a7, -		(void *)a8, (void *)a9, (void *)a10); -} -/* - * Add a trace buffer entry for arguments, for a buffer & 1 integer arg. - */ -STATIC void -xfs_bmbt_trace_argbi( -	const char	*func, -	xfs_btree_cur_t	*cur, -	xfs_buf_t	*b, -	int		i, -	int		line) -{ -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGBI, line, -		(__psunsigned_t)b, i, 0, 0, -		0, 0, 0, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for arguments, for a buffer & 2 integer args. - */ -STATIC void -xfs_bmbt_trace_argbii( -	const char	*func, -	xfs_btree_cur_t	*cur, -	xfs_buf_t	*b, -	int		i0, -	int		i1, -	int		line) -{ -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGBII, line, -		(__psunsigned_t)b, i0, i1, 0, -		0, 0, 0, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for arguments, for 3 block-length args - * and an integer arg. - */ -STATIC void -xfs_bmbt_trace_argfffi( -	const char		*func, -	xfs_btree_cur_t		*cur, -	xfs_dfiloff_t		o, -	xfs_dfsbno_t		b, -	xfs_dfilblks_t		i, -	int			j, -	int			line) -{ -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGFFFI, line, -		o >> 32, (int)o, b >> 32, (int)b, -		i >> 32, (int)i, (int)j, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for arguments, for one integer arg. - */ -STATIC void -xfs_bmbt_trace_argi( -	const char	*func, -	xfs_btree_cur_t	*cur, -	int		i, -	int		line) -{ -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGI, line, -		i, 0, 0, 0, -		0, 0, 0, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for arguments, for int, fsblock, key. - */ -STATIC void -xfs_bmbt_trace_argifk( -	const char		*func, -	xfs_btree_cur_t		*cur, -	int			i, -	xfs_fsblock_t		f, -	xfs_dfiloff_t		o, -	int			line) -{ -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGIFK, line, -		i, (xfs_dfsbno_t)f >> 32, (int)f, o >> 32, -		(int)o, 0, 0, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for arguments, for int, fsblock, rec. - */ -STATIC void -xfs_bmbt_trace_argifr( -	const char		*func, -	xfs_btree_cur_t		*cur, -	int			i, -	xfs_fsblock_t		f, -	xfs_bmbt_rec_t		*r, -	int			line) -{ -	xfs_dfsbno_t		b; -	xfs_dfilblks_t		c; -	xfs_dfsbno_t		d; -	xfs_dfiloff_t		o; -	xfs_bmbt_irec_t		s; -	d = (xfs_dfsbno_t)f; -	xfs_bmbt_disk_get_all(r, &s); -	o = (xfs_dfiloff_t)s.br_startoff; -	b = (xfs_dfsbno_t)s.br_startblock; -	c = s.br_blockcount; -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGIFR, line, -		i, d >> 32, (int)d, o >> 32, -		(int)o, b >> 32, (int)b, c >> 32, -		(int)c, 0, 0); -} +#define ENTRY	XBT_ENTRY +#define ERROR	XBT_ERROR +#define EXIT	XBT_EXIT  /* - * Add a trace buffer entry for arguments, for int, key. + * Keep the XFS_BMBT_TRACE_ names around for now until all code using them + * is converted to be generic and thus switches to the XFS_BTREE_TRACE_ names.   */ -STATIC void -xfs_bmbt_trace_argik( -	const char		*func, -	xfs_btree_cur_t		*cur, -	int			i, -	xfs_bmbt_key_t		*k, -	int			line) -{ -	xfs_dfiloff_t		o; - -	o = be64_to_cpu(k->br_startoff); -	xfs_bmbt_trace_enter(func, cur, ARGS, XFS_BMBT_KTRACE_ARGIFK, line, -		i, o >> 32, (int)o, 0, -		0, 0, 0, 0, -		0, 0, 0); -} - -/* - * Add a trace buffer entry for the cursor/operation. - */ -STATIC void -xfs_bmbt_trace_cursor( -	const char	*func, -	xfs_btree_cur_t	*cur, -	char		*s, -	int		line) -{ -	xfs_bmbt_rec_host_t	r; - -	xfs_bmbt_set_all(&r, &cur->bc_rec.b); -	xfs_bmbt_trace_enter(func, cur, s, XFS_BMBT_KTRACE_CUR, line, -		(cur->bc_nlevels << 24) | (cur->bc_private.b.flags << 16) | -		cur->bc_private.b.allocated, -		r.l0 >> 32, (int)r.l0, -		r.l1 >> 32, (int)r.l1, -		(unsigned long)cur->bc_bufs[0], (unsigned long)cur->bc_bufs[1], -		(unsigned long)cur->bc_bufs[2], (unsigned long)cur->bc_bufs[3], -		(cur->bc_ptrs[0] << 16) | cur->bc_ptrs[1], -		(cur->bc_ptrs[2] << 16) | cur->bc_ptrs[3]); -} - -#define	XFS_BMBT_TRACE_ARGBI(c,b,i)	\ -	xfs_bmbt_trace_argbi(__func__, c, b, i, __LINE__) -#define	XFS_BMBT_TRACE_ARGBII(c,b,i,j)	\ -	xfs_bmbt_trace_argbii(__func__, c, b, i, j, __LINE__) -#define	XFS_BMBT_TRACE_ARGFFFI(c,o,b,i,j)	\ -	xfs_bmbt_trace_argfffi(__func__, c, o, b, i, j, __LINE__) -#define	XFS_BMBT_TRACE_ARGI(c,i)	\ -	xfs_bmbt_trace_argi(__func__, c, i, __LINE__) -#define	XFS_BMBT_TRACE_ARGIFK(c,i,f,s)	\ -	xfs_bmbt_trace_argifk(__func__, c, i, f, s, __LINE__) -#define	XFS_BMBT_TRACE_ARGIFR(c,i,f,r)	\ -	xfs_bmbt_trace_argifr(__func__, c, i, f, r, __LINE__) -#define	XFS_BMBT_TRACE_ARGIK(c,i,k)	\ -	xfs_bmbt_trace_argik(__func__, c, i, k, __LINE__) -#define	XFS_BMBT_TRACE_CURSOR(c,s)	\ -	xfs_bmbt_trace_cursor(__func__, c, s, __LINE__) -#else -#define	XFS_BMBT_TRACE_ARGBI(c,b,i) -#define	XFS_BMBT_TRACE_ARGBII(c,b,i,j) -#define	XFS_BMBT_TRACE_ARGFFFI(c,o,b,i,j) -#define	XFS_BMBT_TRACE_ARGI(c,i) -#define	XFS_BMBT_TRACE_ARGIFK(c,i,f,s) -#define	XFS_BMBT_TRACE_ARGIFR(c,i,f,r) -#define	XFS_BMBT_TRACE_ARGIK(c,i,k) -#define	XFS_BMBT_TRACE_CURSOR(c,s) -#endif	/* XFS_BMBT_TRACE */ +#define	XFS_BMBT_TRACE_ARGBI(c,b,i) \ +	XFS_BTREE_TRACE_ARGBI(c,b,i) +#define	XFS_BMBT_TRACE_ARGBII(c,b,i,j) \ +	XFS_BTREE_TRACE_ARGBII(c,b,i,j) +#define	XFS_BMBT_TRACE_ARGFFFI(c,o,b,i,j) \ +	XFS_BTREE_TRACE_ARGFFFI(c,o,b,i,j) +#define	XFS_BMBT_TRACE_ARGI(c,i) \ +	XFS_BTREE_TRACE_ARGI(c,i) +#define	XFS_BMBT_TRACE_ARGIFK(c,i,f,s) \ +	XFS_BTREE_TRACE_ARGIPK(c,i,(union xfs_btree_ptr)f,s) +#define	XFS_BMBT_TRACE_ARGIFR(c,i,f,r) \ +	XFS_BTREE_TRACE_ARGIPR(c,i, \ +		(union xfs_btree_ptr)f, (union xfs_btree_rec *)r) +#define	XFS_BMBT_TRACE_ARGIK(c,i,k) \ +	XFS_BTREE_TRACE_ARGIK(c,i,(union xfs_btree_key *)k) +#define	XFS_BMBT_TRACE_CURSOR(c,s) \ +	XFS_BTREE_TRACE_CURSOR(c,s)  /* @@ -1485,7 +1270,8 @@ xfs_bmbt_split(  	xfs_bmbt_rec_t		*rrp;		/* right record pointer */  	XFS_BMBT_TRACE_CURSOR(cur, ENTRY); -	XFS_BMBT_TRACE_ARGIFK(cur, level, *bnop, *startoff); +	// disable until merged into common code +//	XFS_BMBT_TRACE_ARGIFK(cur, level, *bnop, *startoff);  	args.tp = cur->bc_tp;  	args.mp = cur->bc_mp;  	lbp = cur->bc_bufs[level]; @@ -2629,8 +2415,100 @@ xfs_bmbt_dup_cursor(  	return new;  } +#ifdef XFS_BTREE_TRACE +ktrace_t	*xfs_bmbt_trace_buf; + +STATIC void +xfs_bmbt_trace_enter( +	struct xfs_btree_cur	*cur, +	const char		*func, +	char			*s, +	int			type, +	int			line, +	__psunsigned_t		a0, +	__psunsigned_t		a1, +	__psunsigned_t		a2, +	__psunsigned_t		a3, +	__psunsigned_t		a4, +	__psunsigned_t		a5, +	__psunsigned_t		a6, +	__psunsigned_t		a7, +	__psunsigned_t		a8, +	__psunsigned_t		a9, +	__psunsigned_t		a10) +{ +	struct xfs_inode	*ip = cur->bc_private.b.ip; +	int			whichfork = cur->bc_private.b.whichfork; + +	ktrace_enter(xfs_bmbt_trace_buf, +		(void *)((__psint_t)type | (whichfork << 8) | (line << 16)), +		(void *)func, (void *)s, (void *)ip, (void *)cur, +		(void *)a0, (void *)a1, (void *)a2, (void *)a3, +		(void *)a4, (void *)a5, (void *)a6, (void *)a7, +		(void *)a8, (void *)a9, (void *)a10); +	ktrace_enter(ip->i_btrace, +		(void *)((__psint_t)type | (whichfork << 8) | (line << 16)), +		(void *)func, (void *)s, (void *)ip, (void *)cur, +		(void *)a0, (void *)a1, (void *)a2, (void *)a3, +		(void *)a4, (void *)a5, (void *)a6, (void *)a7, +		(void *)a8, (void *)a9, (void *)a10); +} + +STATIC void +xfs_bmbt_trace_cursor( +	struct xfs_btree_cur	*cur, +	__uint32_t		*s0, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	struct xfs_bmbt_rec_host r; + +	xfs_bmbt_set_all(&r, &cur->bc_rec.b); + +	*s0 = (cur->bc_nlevels << 24) | +	      (cur->bc_private.b.flags << 16) | +	       cur->bc_private.b.allocated; +	*l0 = r.l0; +	*l1 = r.l1; +} + +STATIC void +xfs_bmbt_trace_key( +	struct xfs_btree_cur	*cur, +	union xfs_btree_key	*key, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	*l0 = be64_to_cpu(key->bmbt.br_startoff); +	*l1 = 0; +} + +STATIC void +xfs_bmbt_trace_record( +	struct xfs_btree_cur	*cur, +	union xfs_btree_rec	*rec, +	__uint64_t		*l0, +	__uint64_t		*l1, +	__uint64_t		*l2) +{ +	struct xfs_bmbt_irec	irec; + +	xfs_bmbt_disk_get_all(&rec->bmbt, &irec); +	*l0 = irec.br_startoff; +	*l1 = irec.br_startblock; +	*l2 = irec.br_blockcount; +} +#endif /* XFS_BTREE_TRACE */ +  static const struct xfs_btree_ops xfs_bmbt_ops = {  	.dup_cursor		= xfs_bmbt_dup_cursor, + +#ifdef XFS_BTREE_TRACE +	.trace_enter		= xfs_bmbt_trace_enter, +	.trace_cursor		= xfs_bmbt_trace_cursor, +	.trace_key		= xfs_bmbt_trace_key, +	.trace_record		= xfs_bmbt_trace_record, +#endif  };  /* diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 4f12fff5497..5628d89cea4 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -233,24 +233,6 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;  #ifdef __KERNEL__ -#if defined(XFS_BMBT_TRACE) -/* - * Trace buffer entry types. - */ -#define XFS_BMBT_KTRACE_ARGBI	1 -#define XFS_BMBT_KTRACE_ARGBII	2 -#define XFS_BMBT_KTRACE_ARGFFFI 3 -#define XFS_BMBT_KTRACE_ARGI	4 -#define XFS_BMBT_KTRACE_ARGIFK	5 -#define XFS_BMBT_KTRACE_ARGIFR	6 -#define XFS_BMBT_KTRACE_ARGIK	7 -#define XFS_BMBT_KTRACE_CUR	8 - -#define XFS_BMBT_TRACE_SIZE	4096	/* size of global trace buffer */ -#define XFS_BMBT_KTRACE_SIZE	32	/* size of per-inode trace buffer */ -extern ktrace_t	*xfs_bmbt_trace_buf; -#endif -  /*   * Prototypes for xfs_bmap.c to call.   */ diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 57d3bd37526..0647a0eff0d 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -182,6 +182,25 @@ do {    \  struct xfs_btree_ops {  	/* cursor operations */  	struct xfs_btree_cur *(*dup_cursor)(struct xfs_btree_cur *); + +	/* btree tracing */ +#ifdef XFS_BTREE_TRACE +	void		(*trace_enter)(struct xfs_btree_cur *, const char *, +				       char *, int, int, __psunsigned_t, +				       __psunsigned_t, __psunsigned_t, +				       __psunsigned_t, __psunsigned_t, +				       __psunsigned_t, __psunsigned_t, +				       __psunsigned_t, __psunsigned_t, +				       __psunsigned_t, __psunsigned_t); +	void		(*trace_cursor)(struct xfs_btree_cur *, __uint32_t *, +					__uint64_t *, __uint64_t *); +	void		(*trace_key)(struct xfs_btree_cur *, +				     union xfs_btree_key *, __uint64_t *, +				     __uint64_t *); +	void		(*trace_record)(struct xfs_btree_cur *, +					union xfs_btree_rec *, __uint64_t *, +					__uint64_t *, __uint64_t *); +#endif  };  /* diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 8c0c4748a8d..fc99524b17a 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -2085,8 +2085,81 @@ xfs_inobt_dup_cursor(  			cur->bc_private.a.agbp, cur->bc_private.a.agno);  } +#ifdef XFS_BTREE_TRACE +ktrace_t	*xfs_inobt_trace_buf; + +STATIC void +xfs_inobt_trace_enter( +	struct xfs_btree_cur	*cur, +	const char		*func, +	char			*s, +	int			type, +	int			line, +	__psunsigned_t		a0, +	__psunsigned_t		a1, +	__psunsigned_t		a2, +	__psunsigned_t		a3, +	__psunsigned_t		a4, +	__psunsigned_t		a5, +	__psunsigned_t		a6, +	__psunsigned_t		a7, +	__psunsigned_t		a8, +	__psunsigned_t		a9, +	__psunsigned_t		a10) +{ +	ktrace_enter(xfs_inobt_trace_buf, (void *)(__psint_t)type, +		(void *)func, (void *)s, NULL, (void *)cur, +		(void *)a0, (void *)a1, (void *)a2, (void *)a3, +		(void *)a4, (void *)a5, (void *)a6, (void *)a7, +		(void *)a8, (void *)a9, (void *)a10); +} + +STATIC void +xfs_inobt_trace_cursor( +	struct xfs_btree_cur	*cur, +	__uint32_t		*s0, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	*s0 = cur->bc_private.a.agno; +	*l0 = cur->bc_rec.i.ir_startino; +	*l1 = cur->bc_rec.i.ir_free; +} + +STATIC void +xfs_inobt_trace_key( +	struct xfs_btree_cur	*cur, +	union xfs_btree_key	*key, +	__uint64_t		*l0, +	__uint64_t		*l1) +{ +	*l0 = be32_to_cpu(key->inobt.ir_startino); +	*l1 = 0; +} + +STATIC void +xfs_inobt_trace_record( +	struct xfs_btree_cur	*cur, +	union xfs_btree_rec	*rec, +	__uint64_t		*l0, +	__uint64_t		*l1, +	__uint64_t		*l2) +{ +	*l0 = be32_to_cpu(rec->inobt.ir_startino); +	*l1 = be32_to_cpu(rec->inobt.ir_freecount); +	*l2 = be64_to_cpu(rec->inobt.ir_free); +} +#endif /* XFS_BTREE_TRACE */ +  static const struct xfs_btree_ops xfs_inobt_ops = {  	.dup_cursor		= xfs_inobt_dup_cursor, + +#ifdef XFS_BTREE_TRACE +	.trace_enter		= xfs_inobt_trace_enter, +	.trace_cursor		= xfs_inobt_trace_cursor, +	.trace_key		= xfs_inobt_trace_key, +	.trace_record		= xfs_inobt_trace_record, +#endif  };  /* diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 2a158a26286..cc0474ddd2d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -41,6 +41,7 @@  #include "xfs_buf_item.h"  #include "xfs_inode_item.h"  #include "xfs_btree.h" +#include "xfs_btree_trace.h"  #include "xfs_alloc.h"  #include "xfs_ialloc.h"  #include "xfs_bmap.h" @@ -835,7 +836,7 @@ xfs_inode_alloc(  #ifdef XFS_BMAP_TRACE  	ip->i_xtrace = ktrace_alloc(XFS_BMAP_KTRACE_SIZE, KM_NOFS);  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE  	ip->i_btrace = ktrace_alloc(XFS_BMBT_KTRACE_SIZE, KM_NOFS);  #endif  #ifdef XFS_RW_TRACE @@ -2673,7 +2674,7 @@ xfs_idestroy(  #ifdef XFS_BMAP_TRACE  	ktrace_free(ip->i_xtrace);  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE  	ktrace_free(ip->i_btrace);  #endif  #ifdef XFS_RW_TRACE diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 3af1f6dd149..2a69a7dee22 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -245,7 +245,7 @@ typedef struct xfs_inode {  #ifdef XFS_BMAP_TRACE  	struct ktrace		*i_xtrace;	/* inode extent list trace */  #endif -#ifdef XFS_BMBT_TRACE +#ifdef XFS_BTREE_TRACE  	struct ktrace		*i_btrace;	/* inode bmap btree trace */  #endif  #ifdef XFS_RW_TRACE  |