Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: Add ext4_find_next_bit()

This function is used by the ext4 multi block allocator patches.

Also add generic_find_next_le_bit

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Cc: <linux-ext4@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Aneesh Kumar K.V and committed by
Theodore Ts'o
aa02ad67 c549a95d

+62
+2
include/asm-arm/bitops.h
··· 310 310 _find_first_zero_bit_le(p,sz) 311 311 #define ext2_find_next_zero_bit(p,sz,off) \ 312 312 _find_next_zero_bit_le(p,sz,off) 313 + #define ext2_find_next_bit(p, sz, off) \ 314 + _find_next_bit_le(p, sz, off) 313 315 314 316 /* 315 317 * Minix is defined to use little-endian byte ordering.
+2
include/asm-generic/bitops/ext2-non-atomic.h
··· 14 14 generic_find_first_zero_le_bit((unsigned long *)(addr), (size)) 15 15 #define ext2_find_next_zero_bit(addr, size, off) \ 16 16 generic_find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) 17 + #define ext2_find_next_bit(addr, size, off) \ 18 + generic_find_next_le_bit((unsigned long *)(addr), (size), (off)) 17 19 18 20 #endif /* _ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_ */
+4
include/asm-generic/bitops/le.h
··· 20 20 #define generic___test_and_clear_le_bit(nr, addr) __test_and_clear_bit(nr, addr) 21 21 22 22 #define generic_find_next_zero_le_bit(addr, size, offset) find_next_zero_bit(addr, size, offset) 23 + #define generic_find_next_le_bit(addr, size, offset) \ 24 + find_next_bit(addr, size, offset) 23 25 24 26 #elif defined(__BIG_ENDIAN) 25 27 ··· 43 41 __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 44 42 45 43 extern unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, 44 + unsigned long size, unsigned long offset); 45 + extern unsigned long generic_find_next_le_bit(const unsigned long *addr, 46 46 unsigned long size, unsigned long offset); 47 47 48 48 #else
+2
include/asm-m68k/bitops.h
··· 410 410 res = ext2_find_first_zero_bit (p, size - 32 * (p - addr)); 411 411 return (p - addr) * 32 + res; 412 412 } 413 + #define ext2_find_next_bit(addr, size, off) \ 414 + generic_find_next_le_bit((unsigned long *)(addr), (size), (off)) 413 415 414 416 #endif /* __KERNEL__ */ 415 417
+2
include/asm-m68knommu/bitops.h
··· 294 294 return result + ffz(__swab32(tmp)); 295 295 } 296 296 297 + #define ext2_find_next_bit(addr, size, off) \ 298 + generic_find_next_le_bit((unsigned long *)(addr), (size), (off)) 297 299 #include <asm-generic/bitops/minix.h> 298 300 299 301 #endif /* __KERNEL__ */
+4
include/asm-powerpc/bitops.h
··· 359 359 unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, 360 360 unsigned long size, unsigned long offset); 361 361 362 + unsigned long generic_find_next_le_bit(const unsigned long *addr, 363 + unsigned long size, unsigned long offset); 362 364 /* Bitmap functions for the ext2 filesystem */ 363 365 364 366 #define ext2_set_bit(nr,addr) \ ··· 380 378 #define ext2_find_next_zero_bit(addr, size, off) \ 381 379 generic_find_next_zero_le_bit((unsigned long*)addr, size, off) 382 380 381 + #define ext2_find_next_bit(addr, size, off) \ 382 + generic_find_next_le_bit((unsigned long *)addr, size, off) 383 383 /* Bitmap functions for the minix filesystem. */ 384 384 385 385 #define minix_test_and_set_bit(nr,addr) \
+2
include/asm-s390/bitops.h
··· 772 772 test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 773 773 #define ext2_test_bit(nr, addr) \ 774 774 test_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) 775 + #define ext2_find_next_bit(addr, size, off) \ 776 + generic_find_next_le_bit((unsigned long *)(addr), (size), (off)) 775 777 776 778 #ifndef __s390x__ 777 779
+1
include/linux/ext4_fs.h
··· 493 493 #define ext4_test_bit ext2_test_bit 494 494 #define ext4_find_first_zero_bit ext2_find_first_zero_bit 495 495 #define ext4_find_next_zero_bit ext2_find_next_zero_bit 496 + #define ext4_find_next_bit ext2_find_next_bit 496 497 497 498 /* 498 499 * Maximal mount counts between two filesystem checks
+43
lib/find_next_bit.c
··· 178 178 179 179 EXPORT_SYMBOL(generic_find_next_zero_le_bit); 180 180 181 + unsigned long generic_find_next_le_bit(const unsigned long *addr, unsigned 182 + long size, unsigned long offset) 183 + { 184 + const unsigned long *p = addr + BITOP_WORD(offset); 185 + unsigned long result = offset & ~(BITS_PER_LONG - 1); 186 + unsigned long tmp; 187 + 188 + if (offset >= size) 189 + return size; 190 + size -= result; 191 + offset &= (BITS_PER_LONG - 1UL); 192 + if (offset) { 193 + tmp = ext2_swabp(p++); 194 + tmp &= (~0UL << offset); 195 + if (size < BITS_PER_LONG) 196 + goto found_first; 197 + if (tmp) 198 + goto found_middle; 199 + size -= BITS_PER_LONG; 200 + result += BITS_PER_LONG; 201 + } 202 + 203 + while (size & ~(BITS_PER_LONG - 1)) { 204 + tmp = *(p++); 205 + if (tmp) 206 + goto found_middle_swap; 207 + result += BITS_PER_LONG; 208 + size -= BITS_PER_LONG; 209 + } 210 + if (!size) 211 + return result; 212 + tmp = ext2_swabp(p); 213 + found_first: 214 + tmp &= (~0UL >> (BITS_PER_LONG - size)); 215 + if (tmp == 0UL) /* Are any bits set? */ 216 + return result + size; /* Nope. */ 217 + found_middle: 218 + return result + __ffs(tmp); 219 + 220 + found_middle_swap: 221 + return result + __ffs(ext2_swab(tmp)); 222 + } 223 + EXPORT_SYMBOL(generic_find_next_le_bit); 181 224 #endif /* __BIG_ENDIAN */