diff options
Diffstat (limited to 'fs/xfs/xfs_bit.h')
| -rw-r--r-- | fs/xfs/xfs_bit.h | 34 | 
1 files changed, 30 insertions, 4 deletions
| diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h index 082641a9782c..8e0e463dae2d 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); | 
