From: Martin Schwidefsky <schwidefsky@de.ibm.com>
Date: Thu, 25 Jul 2013 08:18:17 +0000 (+0200)
Subject: s390/bitops: fix find_next_bit_left
X-Git-Tag: firefly_0821_release~6453^2~1154
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=fa2446744dd5a99a3938aad9faade9b8928aec48;p=firefly-linux-kernel-4.4.55.git

s390/bitops: fix find_next_bit_left

commit 3b0040a47ad63f7147e9e7d2febb61a3b564bb90 upstream.

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.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---

diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h
index 4d8604e311f3..7d4676758733 100644
--- a/arch/s390/include/asm/bitops.h
+++ b/arch/s390/include/asm/bitops.h
@@ -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)