aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bitmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bitmap.c')
-rw-r--r--lib/bitmap.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/lib/bitmap.c b/lib/bitmap.c
index 36e380da00c5..a13c7f4e325a 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -159,7 +159,7 @@ void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
159 unsigned int shift, unsigned int nbits) 159 unsigned int shift, unsigned int nbits)
160{ 160{
161 int k; 161 int k;
162 unsigned int lim = BITS_TO_LONGS(nbits), left = nbits % BITS_PER_LONG; 162 unsigned int lim = BITS_TO_LONGS(nbits);
163 unsigned int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; 163 unsigned int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
164 for (k = lim - off - 1; k >= 0; --k) { 164 for (k = lim - off - 1; k >= 0; --k) {
165 unsigned long upper, lower; 165 unsigned long upper, lower;
@@ -172,13 +172,8 @@ void __bitmap_shift_left(unsigned long *dst, const unsigned long *src,
172 lower = src[k - 1] >> (BITS_PER_LONG - rem); 172 lower = src[k - 1] >> (BITS_PER_LONG - rem);
173 else 173 else
174 lower = 0; 174 lower = 0;
175 upper = src[k]; 175 upper = src[k] << rem;
176 if (left && k == lim - 1)
177 upper &= (1UL << left) - 1;
178 upper <<= rem;
179 dst[k + off] = lower | upper; 176 dst[k + off] = lower | upper;
180 if (left && k + off == lim - 1)
181 dst[k + off] &= (1UL << left) - 1;
182 } 177 }
183 if (off) 178 if (off)
184 memset(dst, 0, off*sizeof(unsigned long)); 179 memset(dst, 0, off*sizeof(unsigned long));