|
@@ -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));
|
|
res = ext2_find_first_zero_bit (p, size - 32 * (p - addr));
|
|
return (p - addr) * 32 + res;
|
|
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__ */
|
|
#endif /* __KERNEL__ */
|
|
|
|
|