|
@@ -790,8 +790,6 @@ 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))
|
|
|
|
|
|
static inline int ext2_find_first_zero_bit(void *vaddr, unsigned int size)
|
|
|
{
|
|
@@ -833,6 +831,47 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size,
|
|
|
return offset + ext2_find_first_zero_bit(p, size);
|
|
|
}
|
|
|
|
|
|
+static inline unsigned long ext2_find_first_bit(void *vaddr,
|
|
|
+ unsigned long size)
|
|
|
+{
|
|
|
+ unsigned long bytes, bits;
|
|
|
+
|
|
|
+ if (!size)
|
|
|
+ return 0;
|
|
|
+ bytes = __ffs_word_loop(vaddr, size);
|
|
|
+ bits = __ffs_word(bytes*8, __load_ulong_le(vaddr, bytes));
|
|
|
+ return (bits < size) ? bits : size;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ext2_find_next_bit(void *vaddr, unsigned long size,
|
|
|
+ unsigned long offset)
|
|
|
+{
|
|
|
+ unsigned long *addr = vaddr, *p;
|
|
|
+ unsigned long bit, set;
|
|
|
+
|
|
|
+ if (offset >= size)
|
|
|
+ return size;
|
|
|
+ bit = offset & (__BITOPS_WORDSIZE - 1);
|
|
|
+ offset -= bit;
|
|
|
+ size -= offset;
|
|
|
+ p = addr + offset / __BITOPS_WORDSIZE;
|
|
|
+ if (bit) {
|
|
|
+ /*
|
|
|
+ * s390 version of ffz returns __BITOPS_WORDSIZE
|
|
|
+ * if no zero bit is present in the word.
|
|
|
+ */
|
|
|
+ set = ffs(__load_ulong_le(p, 0) >> bit) + bit;
|
|
|
+ if (set >= size)
|
|
|
+ return size + offset;
|
|
|
+ if (set < __BITOPS_WORDSIZE)
|
|
|
+ return set + offset;
|
|
|
+ offset += __BITOPS_WORDSIZE;
|
|
|
+ size -= __BITOPS_WORDSIZE;
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+ return offset + ext2_find_first_bit(p, size);
|
|
|
+}
|
|
|
+
|
|
|
#include <asm-generic/bitops/minix.h>
|
|
|
|
|
|
#endif /* __KERNEL__ */
|