diff options
author | Eric Sandeen <sandeen@redhat.com> | 2008-08-21 13:46:37 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2008-08-21 13:46:41 -0400 |
commit | 152382af4056aadc0c2ea2e8e8258b277be085bf (patch) | |
tree | 05cd2d88b4c1a919b1094f45d426aca808dd5894 | |
parent | 16f7f9564c3ae190954f2ec55f385a268b93ac4d (diff) |
[S390] fix ext2_find_next_bit
ext4 does not work on s390 because ext2_find_next_bit is broken. Fortunately
this function is only used by ext4. The function uses ffs which does not work
analog to ffz. The result of ffs has an offset of 1 which is not taken into
account. To fix this use the low level __ffs_word function directly instead
of the ill defined ffs.
In addition the patch improves find_next_zero_bit and ext2_find_next_zero_bit
by passing the bit offset into __ffz_word instead of adding it after the
function call returned.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r-- | arch/s390/include/asm/bitops.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index b4eb24ab5af9..8e9243ae0c19 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -709,7 +709,7 @@ static inline int find_next_zero_bit (const unsigned long * addr, | |||
709 | * __ffz_word returns __BITOPS_WORDSIZE | 709 | * __ffz_word returns __BITOPS_WORDSIZE |
710 | * if no zero bit is present in the word. | 710 | * if no zero bit is present in the word. |
711 | */ | 711 | */ |
712 | set = __ffz_word(0, *p >> bit) + bit; | 712 | set = __ffz_word(bit, *p >> bit); |
713 | if (set >= size) | 713 | if (set >= size) |
714 | return size + offset; | 714 | return size + offset; |
715 | if (set < __BITOPS_WORDSIZE) | 715 | if (set < __BITOPS_WORDSIZE) |
@@ -824,7 +824,7 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size, | |||
824 | * s390 version of ffz returns __BITOPS_WORDSIZE | 824 | * s390 version of ffz returns __BITOPS_WORDSIZE |
825 | * if no zero bit is present in the word. | 825 | * if no zero bit is present in the word. |
826 | */ | 826 | */ |
827 | set = ffz(__load_ulong_le(p, 0) >> bit) + bit; | 827 | set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit); |
828 | if (set >= size) | 828 | if (set >= size) |
829 | return size + offset; | 829 | return size + offset; |
830 | if (set < __BITOPS_WORDSIZE) | 830 | if (set < __BITOPS_WORDSIZE) |
@@ -865,7 +865,7 @@ static inline int ext2_find_next_bit(void *vaddr, unsigned long size, | |||
865 | * s390 version of ffz returns __BITOPS_WORDSIZE | 865 | * s390 version of ffz returns __BITOPS_WORDSIZE |
866 | * if no zero bit is present in the word. | 866 | * if no zero bit is present in the word. |
867 | */ | 867 | */ |
868 | set = ffs(__load_ulong_le(p, 0) >> bit) + bit; | 868 | set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit)); |
869 | if (set >= size) | 869 | if (set >= size) |
870 | return size + offset; | 870 | return size + offset; |
871 | if (set < __BITOPS_WORDSIZE) | 871 | if (set < __BITOPS_WORDSIZE) |