m68k: Add ext2_find_{first,next}_bit() for ext4
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Thu, 12 Jun 2008 22:21:29 +0000 (15:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 13 Jun 2008 01:05:39 +0000 (18:05 -0700)
Add ext2_find_{first,next}_bit(), which are needed for ext4.  They're
derived out of the ext2_find_next_zero_bit found in the same file.
Compile tested with crosstools

[Reworked to preserve all symmetry with ext2_find_{first,next}_zero_bit()]

This fixes http://bugzilla.kernel.org/show_bug.cgi?id=10393

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/asm-m68k/bitops.h

index 83d1f286230b6da68492a6b64fedaaaad8e5746e..3e8106442d5af6e7953b887ebdb8a35203e5f029 100644 (file)
@@ -410,8 +410,49 @@ 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))
+
+static inline int ext2_find_first_bit(const void *vaddr, unsigned size)
+{
+       const unsigned long *p = vaddr, *addr = vaddr;
+       int res;
+
+       if (!size)
+               return 0;
+
+       size = (size >> 5) + ((size & 31) > 0);
+       while (*p++ == 0UL) {
+               if (--size == 0)
+                       return (p - addr) << 5;
+       }
+
+       --p;
+       for (res = 0; res < 32; res++)
+               if (ext2_test_bit(res, p))
+                       break;
+       return (p - addr) * 32 + res;
+}
+
+static inline int ext2_find_next_bit(const void *vaddr, unsigned size,
+                                    unsigned offset)
+{
+       const unsigned long *addr = vaddr;
+       const unsigned long *p = addr + (offset >> 5);
+       int bit = offset & 31UL, res;
+
+       if (offset >= size)
+               return size;
+
+       if (bit) {
+               /* Look for one in first longword */
+               for (res = bit; res < 32; res++)
+                       if (ext2_test_bit(res, p))
+                               return (p - addr) * 32 + res;
+               p++;
+       }
+       /* No set bit yet, search remaining full bytes for a set bit */
+       res = ext2_find_first_bit(p, size - 32 * (p - addr));
+       return (p - addr) * 32 + res;
+}
 
 #endif /* __KERNEL__ */