mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
[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: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
030babac6a
commit
1eb29128c6
@ -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)
|
|||||||
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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user