diff options
| -rw-r--r-- | include/asm-arm/bitops.h | 2 | ||||
| -rw-r--r-- | include/asm-generic/bitops/ext2-non-atomic.h | 2 | ||||
| -rw-r--r-- | include/asm-generic/bitops/le.h | 4 | ||||
| -rw-r--r-- | include/asm-m68k/bitops.h | 2 | ||||
| -rw-r--r-- | include/asm-m68knommu/bitops.h | 2 | ||||
| -rw-r--r-- | include/asm-powerpc/bitops.h | 4 | ||||
| -rw-r--r-- | include/asm-s390/bitops.h | 2 | ||||
| -rw-r--r-- | include/linux/ext4_fs.h | 1 | ||||
| -rw-r--r-- | lib/find_next_bit.c | 43 | 
9 files changed, 62 insertions, 0 deletions
diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index 47a6b086eee..5c60bfc1a84 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h @@ -310,6 +310,8 @@ static inline int constant_fls(int x)  		_find_first_zero_bit_le(p,sz)  #define ext2_find_next_zero_bit(p,sz,off)	\  		_find_next_zero_bit_le(p,sz,off) +#define ext2_find_next_bit(p, sz, off) \ +		_find_next_bit_le(p, sz, off)  /*   * Minix is defined to use little-endian byte ordering. diff --git a/include/asm-generic/bitops/ext2-non-atomic.h b/include/asm-generic/bitops/ext2-non-atomic.h index 1697404afa0..63cf822431a 100644 --- a/include/asm-generic/bitops/ext2-non-atomic.h +++ b/include/asm-generic/bitops/ext2-non-atomic.h @@ -14,5 +14,7 @@  	generic_find_first_zero_le_bit((unsigned long *)(addr), (size))  #define ext2_find_next_zero_bit(addr, size, off) \  	generic_find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) +#define ext2_find_next_bit(addr, size, off) \ +	generic_find_next_le_bit((unsigned long *)(addr), (size), (off))  #endif /* _ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_ */ diff --git a/include/asm-generic/bitops/le.h b/include/asm-generic/bitops/le.h index b9c7e5d2d2a..80e3bf13b2b 100644 --- a/include/asm-generic/bitops/le.h +++ b/include/asm-generic/bitops/le.h @@ -20,6 +20,8 @@  #define generic___test_and_clear_le_bit(nr, addr) __test_and_clear_bit(nr, addr)  #define generic_find_next_zero_le_bit(addr, size, offset) find_next_zero_bit(addr, size, offset) +#define generic_find_next_le_bit(addr, size, offset) \ +			find_next_bit(addr, size, offset)  #elif defined(__BIG_ENDIAN) @@ -42,6 +44,8 @@  extern unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,  		unsigned long size, unsigned long offset); +extern unsigned long generic_find_next_le_bit(const unsigned long *addr, +		unsigned long size, unsigned long offset);  #else  #error "Please fix <asm/byteorder.h>" diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h index 2976b5d68e9..83d1f286230 100644 --- a/include/asm-m68k/bitops.h +++ b/include/asm-m68k/bitops.h @@ -410,6 +410,8 @@ static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size,  	res = ext2_find_first_zero_bit (p, size - 32 * (p - addr));  	return (p - addr) * 32 + res;  } +#define ext2_find_next_bit(addr, size, off) \ +	generic_find_next_le_bit((unsigned long *)(addr), (size), (off))  #endif /* __KERNEL__ */ diff --git a/include/asm-m68knommu/bitops.h b/include/asm-m68knommu/bitops.h index f8dfb7ba2e2..f43afe1fc3b 100644 --- a/include/asm-m68knommu/bitops.h +++ b/include/asm-m68knommu/bitops.h @@ -294,6 +294,8 @@ found_middle:  	return result + ffz(__swab32(tmp));  } +#define ext2_find_next_bit(addr, size, off) \ +	generic_find_next_le_bit((unsigned long *)(addr), (size), (off))  #include <asm-generic/bitops/minix.h>  #endif /* __KERNEL__ */ diff --git a/include/asm-powerpc/bitops.h b/include/asm-powerpc/bitops.h index 733b4af7f4f..220d9a781ab 100644 --- a/include/asm-powerpc/bitops.h +++ b/include/asm-powerpc/bitops.h @@ -359,6 +359,8 @@ static __inline__ int test_le_bit(unsigned long nr,  unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,  				    unsigned long size, unsigned long offset); +unsigned long generic_find_next_le_bit(const unsigned long *addr, +				    unsigned long size, unsigned long offset);  /* Bitmap functions for the ext2 filesystem */  #define ext2_set_bit(nr,addr) \ @@ -378,6 +380,8 @@ unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,  #define ext2_find_next_zero_bit(addr, size, off) \  	generic_find_next_zero_le_bit((unsigned long*)addr, size, off) +#define ext2_find_next_bit(addr, size, off) \ +	generic_find_next_le_bit((unsigned long *)addr, size, off)  /* Bitmap functions for the minix filesystem.  */  #define minix_test_and_set_bit(nr,addr) \ diff --git a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h index 34d9a6357c3..dba6fecad0b 100644 --- a/include/asm-s390/bitops.h +++ b/include/asm-s390/bitops.h @@ -772,6 +772,8 @@ static inline int sched_find_first_bit(unsigned long *b)  	test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)  #define ext2_test_bit(nr, addr)      \  	test_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) +#define ext2_find_next_bit(addr, size, off) \ +	generic_find_next_le_bit((unsigned long *)(addr), (size), (off))  #ifndef __s390x__ diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index 213974f7c5d..d0b7ca99b91 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h @@ -493,6 +493,7 @@ do {									       \  #define ext4_test_bit			ext2_test_bit  #define ext4_find_first_zero_bit	ext2_find_first_zero_bit  #define ext4_find_next_zero_bit		ext2_find_next_zero_bit +#define ext4_find_next_bit		ext2_find_next_bit  /*   * Maximal mount counts between two filesystem checks diff --git a/lib/find_next_bit.c b/lib/find_next_bit.c index bda0d71a251..78ccd73a884 100644 --- a/lib/find_next_bit.c +++ b/lib/find_next_bit.c @@ -178,4 +178,47 @@ found_middle_swap:  EXPORT_SYMBOL(generic_find_next_zero_le_bit); +unsigned long generic_find_next_le_bit(const unsigned long *addr, unsigned +		long size, unsigned long offset) +{ +	const unsigned long *p = addr + BITOP_WORD(offset); +	unsigned long result = offset & ~(BITS_PER_LONG - 1); +	unsigned long tmp; + +	if (offset >= size) +		return size; +	size -= result; +	offset &= (BITS_PER_LONG - 1UL); +	if (offset) { +		tmp = ext2_swabp(p++); +		tmp &= (~0UL << offset); +		if (size < BITS_PER_LONG) +			goto found_first; +		if (tmp) +			goto found_middle; +		size -= BITS_PER_LONG; +		result += BITS_PER_LONG; +	} + +	while (size & ~(BITS_PER_LONG - 1)) { +		tmp = *(p++); +		if (tmp) +			goto found_middle_swap; +		result += BITS_PER_LONG; +		size -= BITS_PER_LONG; +	} +	if (!size) +		return result; +	tmp = ext2_swabp(p); +found_first: +	tmp &= (~0UL >> (BITS_PER_LONG - size)); +	if (tmp == 0UL)		/* Are any bits set? */ +		return result + size; /* Nope. */ +found_middle: +	return result + __ffs(tmp); + +found_middle_swap: +	return result + __ffs(ext2_swab(tmp)); +} +EXPORT_SYMBOL(generic_find_next_le_bit);  #endif /* __BIG_ENDIAN */  |