diff options
author | Linus Torvalds <torvalds@evo.osdl.org> | 2005-07-29 11:01:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@evo.osdl.org> | 2005-07-29 11:01:22 -0400 |
commit | d6d2a2ab05da6e44bd127fe375078bb7c36a0ad0 (patch) | |
tree | 7b4f2893d8c09fba67c83458efeea9396977bc70 | |
parent | 33ac02aa4cef417871e128ab4a6565e751e5f3b2 (diff) | |
download | op-kernel-dev-d6d2a2ab05da6e44bd127fe375078bb7c36a0ad0.zip op-kernel-dev-d6d2a2ab05da6e44bd127fe375078bb7c36a0ad0.tar.gz |
x86: fix new find_first_bit()
Some edge problems with the original C rewrite.
Thanks go to Cal Peake, who pinpointed the breakage to the rewrite, and
tested this fixed version.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | include/asm-i386/bitops.h | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h index 1caee10..ddf1739 100644 --- a/include/asm-i386/bitops.h +++ b/include/asm-i386/bitops.h @@ -335,14 +335,13 @@ static inline unsigned long __ffs(unsigned long word) static inline int find_first_bit(const unsigned long *addr, unsigned size) { int x = 0; - do { - if (*addr) - return __ffs(*addr) + x; - addr++; - if (x >= size) - break; + + while (x < size) { + unsigned long val = *addr++; + if (val) + return __ffs(val) + x; x += (sizeof(*addr)<<3); - } while (1); + } return x; } |