diff options
| author | Rasmus Villemoes <[email protected]> | 2014-08-06 23:10:22 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2014-08-07 01:01:27 +0000 |
| commit | 7e5f97d1927f41affa21aa5b321865ceab1994ce (patch) | |
| tree | 671aaafdac301ef670434667f4b157cd127d8525 /lib/bitmap.c | |
| parent | lib: bitmap: add missing mask in bitmap_shift_right (diff) | |
| download | kernel-7e5f97d1927f41affa21aa5b321865ceab1994ce.tar.gz kernel-7e5f97d1927f41affa21aa5b321865ceab1994ce.zip | |
lib: bitmap: add missing mask in bitmap_and
Apparently, bitmap_and is supposed to return whether the new bitmap is
empty. But it didn't take potential garbage bits in the last word into
account.
Signed-off-by: Rasmus Villemoes <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'lib/bitmap.c')
| -rw-r--r-- | lib/bitmap.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/bitmap.c b/lib/bitmap.c index faaf7206d4cf..ce2ec80bf431 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -185,11 +185,14 @@ int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, const unsigned long *bitmap2, unsigned int bits) { unsigned int k; - unsigned int nr = BITS_TO_LONGS(bits); + unsigned int lim = bits/BITS_PER_LONG; unsigned long result = 0; - for (k = 0; k < nr; k++) + for (k = 0; k < lim; k++) result |= (dst[k] = bitmap1[k] & bitmap2[k]); + if (bits % BITS_PER_LONG) + result |= (dst[k] = bitmap1[k] & bitmap2[k] & + BITMAP_LAST_WORD_MASK(bits)); return result != 0; } EXPORT_SYMBOL(__bitmap_and); |
