Skip to content

Commit

Permalink
[S390] Implement ext2_find_next_bit.
Browse files Browse the repository at this point in the history
Fixes this compile error:

fs/ext4/mballoc.c:
	In function 'ext4_mb_generate_buddy':
fs/ext4/mballoc.c:954:
	error: implicit declaration of function 'generic_find_next_le_bit'

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Feb 5, 2008
1 parent 0abbf05 commit 67fe925
Showing 1 changed file with 41 additions and 2 deletions.
43 changes: 41 additions & 2 deletions include/asm-s390/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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__ */
Expand Down

0 comments on commit 67fe925

Please sign in to comment.