diff options
| author | David Chinner <david@fromorbit.com> | 2008-08-13 15:41:12 +1000 | 
|---|---|---|
| committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-08-13 15:41:12 +1000 | 
| commit | 79071eb0b2f142b9cc6531d04fa2915943938b5e (patch) | |
| tree | dfab0f9e306322454f98c5ae77e93d1150aefbeb | |
| parent | 10fec20ef5eec1c91913baec1225400f0d02df40 (diff) | |
| download | olio-linux-3.10-79071eb0b2f142b9cc6531d04fa2915943938b5e.tar.xz olio-linux-3.10-79071eb0b2f142b9cc6531d04fa2915943938b5e.zip  | |
[XFS] Use the generic bitops rather than implementing them ourselves.
This keeps xfs_lowbit64 as it was since there aren't good generic helpers
there ... Patch inspired by Andi Kleen.
SGI-PV: 981498
SGI-Modid: xfs-linux-melb:xfs-kern:31472a
Signed-off-by: David Chinner <david@fromorbit.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Signed-off-by: Donald Douwsma <donaldd@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
| -rw-r--r-- | fs/xfs/xfs_bit.c | 103 | ||||
| -rw-r--r-- | fs/xfs/xfs_bit.h | 34 | ||||
| -rw-r--r-- | fs/xfs/xfs_rtalloc.c | 19 | 
3 files changed, 37 insertions, 119 deletions
diff --git a/fs/xfs/xfs_bit.c b/fs/xfs/xfs_bit.c index fab0b6d5a41..48228848f5a 100644 --- a/fs/xfs/xfs_bit.c +++ b/fs/xfs/xfs_bit.c @@ -25,109 +25,6 @@   * XFS bit manipulation routines, used in non-realtime code.   */ -#ifndef HAVE_ARCH_HIGHBIT -/* - * Index of high bit number in byte, -1 for none set, 0..7 otherwise. - */ -static const char xfs_highbit[256] = { -       -1, 0, 1, 1, 2, 2, 2, 2,			/* 00 .. 07 */ -	3, 3, 3, 3, 3, 3, 3, 3,			/* 08 .. 0f */ -	4, 4, 4, 4, 4, 4, 4, 4,			/* 10 .. 17 */ -	4, 4, 4, 4, 4, 4, 4, 4,			/* 18 .. 1f */ -	5, 5, 5, 5, 5, 5, 5, 5,			/* 20 .. 27 */ -	5, 5, 5, 5, 5, 5, 5, 5,			/* 28 .. 2f */ -	5, 5, 5, 5, 5, 5, 5, 5,			/* 30 .. 37 */ -	5, 5, 5, 5, 5, 5, 5, 5,			/* 38 .. 3f */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 40 .. 47 */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 48 .. 4f */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 50 .. 57 */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 58 .. 5f */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 60 .. 67 */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 68 .. 6f */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 70 .. 77 */ -	6, 6, 6, 6, 6, 6, 6, 6,			/* 78 .. 7f */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* 80 .. 87 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* 88 .. 8f */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* 90 .. 97 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* 98 .. 9f */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* a0 .. a7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* a8 .. af */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* b0 .. b7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* b8 .. bf */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* c0 .. c7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* c8 .. cf */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* d0 .. d7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* d8 .. df */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* e0 .. e7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* e8 .. ef */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* f0 .. f7 */ -	7, 7, 7, 7, 7, 7, 7, 7,			/* f8 .. ff */ -}; -#endif - -/* - * xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set. - */ -inline int -xfs_highbit32( -	__uint32_t	v) -{ -#ifdef HAVE_ARCH_HIGHBIT -	return highbit32(v); -#else -	int		i; - -	if (v & 0xffff0000) -		if (v & 0xff000000) -			i = 24; -		else -			i = 16; -	else if (v & 0x0000ffff) -		if (v & 0x0000ff00) -			i = 8; -		else -			i = 0; -	else -		return -1; -	return i + xfs_highbit[(v >> i) & 0xff]; -#endif -} - -/* - * xfs_lowbit64: get low bit set out of 64-bit argument, -1 if none set. - */ -int -xfs_lowbit64( -	__uint64_t	v) -{ -	__uint32_t	w = (__uint32_t)v; -	int		n = 0; - -	if (w) {	/* lower bits */ -		n = ffs(w); -	} else {	/* upper bits */ -		w = (__uint32_t)(v >> 32); -		if (w && (n = ffs(w))) -			n += 32; -	} -	return n - 1; -} - -/* - * xfs_highbit64: get high bit set out of 64-bit argument, -1 if none set. - */ -int -xfs_highbit64( -	__uint64_t	v) -{ -	__uint32_t	h = (__uint32_t)(v >> 32); - -	if (h) -		return xfs_highbit32(h) + 32; -	return xfs_highbit32((__uint32_t)v); -} - -  /*   * Return whether bitmap is empty.   * Size is number of words in the bitmap, which is padded to word boundary diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h index 082641a9782..8e0e463dae2 100644 --- a/fs/xfs/xfs_bit.h +++ b/fs/xfs/xfs_bit.h @@ -47,13 +47,39 @@ static inline __uint64_t xfs_mask64lo(int n)  }  /* Get high bit set out of 32-bit argument, -1 if none set */ -extern int xfs_highbit32(__uint32_t v); +static inline int xfs_highbit32(__uint32_t v) +{ +	return fls(v) - 1; +} + +/* Get high bit set out of 64-bit argument, -1 if none set */ +static inline int xfs_highbit64(__uint64_t v) +{ +	return fls64(v) - 1; +} + +/* Get low bit set out of 32-bit argument, -1 if none set */ +static inline int xfs_lowbit32(__uint32_t v) +{ +	unsigned long	t = v; +	return (v) ? find_first_bit(&t, 32) : -1; +}  /* Get low bit set out of 64-bit argument, -1 if none set */ -extern int xfs_lowbit64(__uint64_t v); +static inline int xfs_lowbit64(__uint64_t v) +{ +	__uint32_t	w = (__uint32_t)v; +	int		n = 0; -/* Get high bit set out of 64-bit argument, -1 if none set */ -extern int xfs_highbit64(__uint64_t); +	if (w) {	/* lower bits */ +		n = ffs(w); +	} else {	/* upper bits */ +		w = (__uint32_t)(v >> 32); +		if (w && (n = ffs(w))) +		n += 32; +	} +	return n - 1; +}  /* Return whether bitmap is empty (1 == empty) */  extern int xfs_bitmap_empty(uint *map, uint size); diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index bf87a591350..e2f68de1615 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -74,18 +74,6 @@ STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int,   */  /* - * xfs_lowbit32: get low bit set out of 32-bit argument, -1 if none set. - */ -STATIC int -xfs_lowbit32( -	__uint32_t	v) -{ -	if (v) -		return ffs(v) - 1; -	return -1; -} - -/*   * Allocate space to the bitmap or summary file, and zero it, for growfs.   */  STATIC int				/* error */ @@ -450,6 +438,7 @@ xfs_rtallocate_extent_near(  	}  	bbno = XFS_BITTOBLOCK(mp, bno);  	i = 0; +	ASSERT(minlen != 0);  	log2len = xfs_highbit32(minlen);  	/*  	 * Loop over all bitmap blocks (bbno + i is current block). @@ -618,6 +607,8 @@ xfs_rtallocate_extent_size(  	xfs_suminfo_t	sum;		/* summary information for extents */  	ASSERT(minlen % prod == 0 && maxlen % prod == 0); +	ASSERT(maxlen != 0); +  	/*  	 * Loop over all the levels starting with maxlen.  	 * At each level, look at all the bitmap blocks, to see if there @@ -675,6 +666,9 @@ xfs_rtallocate_extent_size(  		*rtblock = NULLRTBLOCK;  		return 0;  	} +	ASSERT(minlen != 0); +	ASSERT(maxlen != 0); +  	/*  	 * Loop over sizes, from maxlen down to minlen.  	 * This time, when we do the allocations, allow smaller ones @@ -1961,6 +1955,7 @@ xfs_growfs_rt(  				  nsbp->sb_blocksize * nsbp->sb_rextsize);  		nsbp->sb_rextents = nsbp->sb_rblocks;  		do_div(nsbp->sb_rextents, nsbp->sb_rextsize); +		ASSERT(nsbp->sb_rextents != 0);  		nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);  		nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;  		nrsumsize =  |