Commit 1eb29128 authored by Neil Brown's avatar Neil Brown Committed by Linus Torvalds

[PATCH] Fix raid0's attempt to divide by 64bit numbers

Apparently sector_div is only guaranteed to work with a 32bit divisor, even
on 64bit architectures.  So allow for this in raid0.
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 030babac
...@@ -314,16 +314,16 @@ static int raid0_run (mddev_t *mddev) ...@@ -314,16 +314,16 @@ static int raid0_run (mddev_t *mddev)
sector_t space = conf->hash_spacing; sector_t space = conf->hash_spacing;
int round; int round;
conf->preshift = 0; conf->preshift = 0;
if (sizeof(sector_t) > sizeof(unsigned long)) { if (sizeof(sector_t) > sizeof(u32)) {
/*shift down space and s so that sector_div will work */ /*shift down space and s so that sector_div will work */
while (space > (sector_t) (~(unsigned long)0)) { while (space > (sector_t) (~(u32)0)) {
s >>= 1; s >>= 1;
space >>= 1; space >>= 1;
s += 1; /* force round-up */ s += 1; /* force round-up */
conf->preshift++; conf->preshift++;
} }
} }
round = sector_div(s, (unsigned long)space) ? 1 : 0; round = sector_div(s, (u32)space) ? 1 : 0;
nb_zone = s + round; nb_zone = s + round;
} }
printk("raid0 : nb_zone is %d.\n", nb_zone); printk("raid0 : nb_zone is %d.\n", nb_zone);
...@@ -443,7 +443,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio) ...@@ -443,7 +443,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio)
volatile volatile
#endif #endif
sector_t x = block >> conf->preshift; sector_t x = block >> conf->preshift;
sector_div(x, (unsigned long)conf->hash_spacing); sector_div(x, (u32)conf->hash_spacing);
zone = conf->hash_table[x]; zone = conf->hash_table[x];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment