s390/bitops: fix find_next_bit_left
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 25 Jul 2013 08:18:17 +0000 (10:18 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 26 Jul 2013 11:25:21 +0000 (13:25 +0200)
The find_next_bit_left function is broken if used with an offset which
is not a multiple of 64. The shift to mask the bits of a 64-bit word
not to search is in the wrong direction, the result can be either a
bit found smaller than the offset or failure to find a set bit.

Cc: <stable@vger.kernel.org> # v3.8+
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/bitops.h

index 4d8604e..7d46767 100644 (file)
@@ -693,7 +693,7 @@ static inline int find_next_bit_left(const unsigned long *addr,
        size -= offset;
        p = addr + offset / BITS_PER_LONG;
        if (bit) {
-               set = __flo_word(0, *p & (~0UL << bit));
+               set = __flo_word(0, *p & (~0UL >> bit));
                if (set >= size)
                        return size + offset;
                if (set < BITS_PER_LONG)