[PATCH 2/3] xfs: change the xfs_iext_insert / xfs_iext_remove

Alex Elder aelder at sgi.com
Mon Dec 14 15:51:10 CST 2009


Christoph Hellwig wrote:
> Change the xfs_iext_insert / xfs_iext_remove prototypes to pass more
> information which will allow pushing the trace points from the callers
> into those functions.  This includes folding the whichfork information
> into the state variable to minimize the addition stack footprint.

Looks good.

> Signed-off-by: Christoph Hellwig <hch at lst.de>

Reviewed-by: Alex Elder <aelder at sgi.com>


> Index: linux-2.6/fs/xfs/xfs_bmap.c
> ===================================================================
> --- linux-2.6.orig/fs/xfs/xfs_bmap.c	2009-11-22 15:51:48.909278905 +0100
> +++ linux-2.6/fs/xfs/xfs_bmap.c	2009-11-22 15:57:44.358255697 +0100
> @@ -592,7 +592,9 @@ xfs_bmap_add_extent(
>  	if (nextents == 0) {
>  		XFS_BMAP_TRACE_INSERT("insert empty", ip, 0, 1, new, NULL,
>  			whichfork);
> -		xfs_iext_insert(ifp, 0, 1, new);
> +		xfs_iext_insert(ip, 0, 1, new,
> +				whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0);
> +
>  		ASSERT(cur == NULL);
>  		ifp->if_lastex = 0;
>  		if (!isnullstartblock(new->br_startblock)) {
> @@ -849,7 +851,7 @@ xfs_bmap_add_extent_delay_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1,
>  			XFS_DATA_FORK);
>  		XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx, 2);
> +		xfs_iext_remove(ip, idx, 2, state);
>  		ip->i_df.if_lastex = idx - 1;
>  		ip->i_d.di_nextents--;
>  		if (cur == NULL)
> @@ -895,7 +897,7 @@ xfs_bmap_add_extent_delay_real(
>  			XFS_DATA_FORK);
>  		ip->i_df.if_lastex = idx - 1;
>  		XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx, 1);
> +		xfs_iext_remove(ip, idx, 1, state);
>  		if (cur == NULL)
>  			rval = XFS_ILOG_DEXT;
>  		else {
> @@ -930,7 +932,7 @@ xfs_bmap_add_extent_delay_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK);
>  		ip->i_df.if_lastex = idx;
>  		XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx + 1, 1);
> +		xfs_iext_remove(ip, idx + 1, 1, state);
>  		if (cur == NULL)
>  			rval = XFS_ILOG_DEXT;
>  		else {
> @@ -1037,7 +1039,7 @@ xfs_bmap_add_extent_delay_real(
>  		xfs_bmbt_set_blockcount(ep, temp);
>  		XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL,
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx, 1, new);
> +		xfs_iext_insert(ip, idx, 1, new, state);
>  		ip->i_df.if_lastex = idx;
>  		ip->i_d.di_nextents++;
>  		if (cur == NULL)
> @@ -1127,7 +1129,7 @@ xfs_bmap_add_extent_delay_real(
>  		xfs_bmbt_set_blockcount(ep, temp);
>  		XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL,
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx + 1, 1, new);
> +		xfs_iext_insert(ip, idx + 1, 1, new, state);
>  		ip->i_df.if_lastex = idx + 1;
>  		ip->i_d.di_nextents++;
>  		if (cur == NULL)
> @@ -1182,7 +1184,7 @@ xfs_bmap_add_extent_delay_real(
>  		r[1].br_blockcount = temp2;
>  		XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1],
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx + 1, 2, &r[0]);
> +		xfs_iext_insert(ip, idx + 1, 2, &r[0], state);
>  		ip->i_df.if_lastex = idx + 1;
>  		ip->i_d.di_nextents++;
>  		if (cur == NULL)
> @@ -1397,7 +1399,7 @@ xfs_bmap_add_extent_unwritten_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1,
>  			XFS_DATA_FORK);
>  		XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx, 2);
> +		xfs_iext_remove(ip, idx, 2, state);
>  		ip->i_df.if_lastex = idx - 1;
>  		ip->i_d.di_nextents -= 2;
>  		if (cur == NULL)
> @@ -1447,7 +1449,7 @@ xfs_bmap_add_extent_unwritten_real(
>  			XFS_DATA_FORK);
>  		ip->i_df.if_lastex = idx - 1;
>  		XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx, 1);
> +		xfs_iext_remove(ip, idx, 1, state);
>  		ip->i_d.di_nextents--;
>  		if (cur == NULL)
>  			rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
> @@ -1490,7 +1492,7 @@ xfs_bmap_add_extent_unwritten_real(
>  			XFS_DATA_FORK);
>  		ip->i_df.if_lastex = idx;
>  		XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx + 1, 1);
> +		xfs_iext_remove(ip, idx + 1, 1, state);
>  		ip->i_d.di_nextents--;
>  		if (cur == NULL)
>  			rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
> @@ -1616,7 +1618,7 @@ xfs_bmap_add_extent_unwritten_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx, XFS_DATA_FORK);
>  		XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL,
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx, 1, new);
> +		xfs_iext_insert(ip, idx, 1, new, state);
>  		ip->i_df.if_lastex = idx;
>  		ip->i_d.di_nextents++;
>  		if (cur == NULL)
> @@ -1702,7 +1704,7 @@ xfs_bmap_add_extent_unwritten_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK);
>  		XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL,
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx + 1, 1, new);
> +		xfs_iext_insert(ip, idx + 1, 1, new, state);
>  		ip->i_df.if_lastex = idx + 1;
>  		ip->i_d.di_nextents++;
>  		if (cur == NULL)
> @@ -1752,7 +1754,7 @@ xfs_bmap_add_extent_unwritten_real(
>  		r[1].br_state = oldext;
>  		XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1],
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx + 1, 2, &r[0]);
> +		xfs_iext_insert(ip, idx + 1, 2, &r[0], state);
>  		ip->i_df.if_lastex = idx + 1;
>  		ip->i_d.di_nextents += 2;
>  		if (cur == NULL)
> @@ -1918,7 +1920,7 @@ xfs_bmap_add_extent_hole_delay(
>  		XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1,
>  			XFS_DATA_FORK);
>  		XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK);
> -		xfs_iext_remove(ifp, idx, 1);
> +		xfs_iext_remove(ip, idx, 1, state);
>  		ip->i_df.if_lastex = idx - 1;
>  		/* DELTA: Two in-core extents were replaced by one. */
>  		temp2 = temp;
> @@ -1977,7 +1979,7 @@ xfs_bmap_add_extent_hole_delay(
>  		oldlen = newlen = 0;
>  		XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL,
>  			XFS_DATA_FORK);
> -		xfs_iext_insert(ifp, idx, 1, new);
> +		xfs_iext_insert(ip, idx, 1, new, state);
>  		ip->i_df.if_lastex = idx;
>  		/* DELTA: A new in-core extent was added in a hole. */
>  		temp2 = new->br_blockcount;
> @@ -2033,6 +2035,9 @@ xfs_bmap_add_extent_hole_real(
>  	ep = xfs_iext_get_ext(ifp, idx);
>  	state = 0;
> 
> +	if (whichfork == XFS_ATTR_FORK)
> +		state |= BMAP_ATTRFORK;
> +
>  	/*
>  	 * Check and set flags if this segment has a left neighbor.
>  	 */
> @@ -2094,7 +2099,7 @@ xfs_bmap_add_extent_hole_real(
>  		XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1,
>  			whichfork);
>  		XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, whichfork);
> -		xfs_iext_remove(ifp, idx, 1);
> +		xfs_iext_remove(ip, idx, 1, state);
>  		ifp->if_lastex = idx - 1;
>  		XFS_IFORK_NEXT_SET(ip, whichfork,
>  			XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
> @@ -2205,7 +2210,7 @@ xfs_bmap_add_extent_hole_real(
>  		 * Insert a new entry.
>  		 */
>  		XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, whichfork);
> -		xfs_iext_insert(ifp, idx, 1, new);
> +		xfs_iext_insert(ip, idx, 1, new, state);
>  		ifp->if_lastex = idx;
>  		XFS_IFORK_NEXT_SET(ip, whichfork,
>  			XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
> @@ -3147,7 +3152,8 @@ xfs_bmap_del_extent(
>  		 * Matches the whole extent.  Delete the entry.
>  		 */
>  		XFS_BMAP_TRACE_DELETE("3", ip, idx, 1, whichfork);
> -		xfs_iext_remove(ifp, idx, 1);
> +		xfs_iext_remove(ip, idx, 1,
> +				whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0);
>  		ifp->if_lastex = idx;
>  		if (delay)
>  			break;
> @@ -3317,7 +3323,8 @@ xfs_bmap_del_extent(
>  		XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, whichfork);
>  		XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 1, &new, NULL,
>  			whichfork);
> -		xfs_iext_insert(ifp, idx + 1, 1, &new);
> +		xfs_iext_insert(ip, idx + 1, 1, &new,
> +				whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0);
>  		ifp->if_lastex = idx + 1;
>  		break;
>  	}
> Index: linux-2.6/fs/xfs/xfs_inode.c
> ===================================================================
> --- linux-2.6.orig/fs/xfs/xfs_inode.c	2009-11-22 15:51:48.914278285 +0100
> +++ linux-2.6/fs/xfs/xfs_inode.c	2009-11-22 15:59:32.268005938 +0100
> @@ -3300,11 +3300,13 @@ xfs_iext_get_ext(
>   */
>  void
>  xfs_iext_insert(
> -	xfs_ifork_t	*ifp,		/* inode fork pointer */
> +	xfs_inode_t	*ip,		/* incore inode pointer */
>  	xfs_extnum_t	idx,		/* starting index of new items */
>  	xfs_extnum_t	count,		/* number of inserted items */
> -	xfs_bmbt_irec_t	*new)		/* items to insert */
> +	xfs_bmbt_irec_t	*new,		/* items to insert */
> +	int		state)		/* type of extent conversion */
>  {
> +	xfs_ifork_t	*ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
>  	xfs_extnum_t	i;		/* extent record index */
> 
>  	ASSERT(ifp->if_flags & XFS_IFEXTENTS);
> @@ -3549,10 +3551,12 @@ xfs_iext_add_indirect_multi(
>   */
>  void
>  xfs_iext_remove(
> -	xfs_ifork_t	*ifp,		/* inode fork pointer */
> +	xfs_inode_t	*ip,		/* incore inode pointer */
>  	xfs_extnum_t	idx,		/* index to begin removing exts */
> -	int		ext_diff)	/* number of extents to remove */
> +	int		ext_diff,	/* number of extents to remove */
> +	int		state)		/* type of extent conversion */
>  {
> +	xfs_ifork_t	*ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
>  	xfs_extnum_t	nextents;	/* number of extents in file */
>  	int		new_size;	/* size of extents after removal */
> 
> Index: linux-2.6/fs/xfs/xfs_inode.h
> ===================================================================
> --- linux-2.6.orig/fs/xfs/xfs_inode.h	2009-11-22 15:51:48.921276942 +0100
> +++ linux-2.6/fs/xfs/xfs_inode.h	2009-11-22 15:57:45.993323026 +0100
> @@ -577,11 +577,11 @@ int		xfs_iread_extents(struct xfs_trans
>  int		xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int);
> 
>  xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t);
> -void		xfs_iext_insert(xfs_ifork_t *, xfs_extnum_t, xfs_extnum_t,
> -				xfs_bmbt_irec_t *);
> +void		xfs_iext_insert(xfs_inode_t *, xfs_extnum_t, xfs_extnum_t,
> +				xfs_bmbt_irec_t *, int);
>  void		xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int);
>  void		xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int);
> -void		xfs_iext_remove(xfs_ifork_t *, xfs_extnum_t, int);
> +void		xfs_iext_remove(xfs_inode_t *, xfs_extnum_t, int, int);
>  void		xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int);
>  void		xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int);
>  void		xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int);
> Index: linux-2.6/fs/xfs/xfs_bmap.h
> ===================================================================
> --- linux-2.6.orig/fs/xfs/xfs_bmap.h	2009-11-22 15:57:08.815003664 +0100
> +++ linux-2.6/fs/xfs/xfs_bmap.h	2009-11-22 15:57:20.990282919 +0100
> @@ -146,6 +146,7 @@ typedef struct xfs_bmalloca {
>  #define BMAP_RIGHT_DELAY	(1 << 5)
>  #define BMAP_LEFT_VALID		(1 << 6)
>  #define BMAP_RIGHT_VALID	(1 << 7)
> +#define BMAP_ATTRFORK		(1 << 8)
> 
>  #if defined(__KERNEL__) && defined(XFS_BMAP_TRACE)
>  /*
> 
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs




More information about the xfs mailing list