forked from Minki/linux
[PATCH] md: use correct size of raid5 stripe cache when measuring how full it is
The raid5 stripe cache was recently changed from fixed size (NR_STRIPES) to variable size (conf->max_nr_stripes). However there are two places that still use the constant and as a result, reducing the size of the stripe cache can result in a deadlock. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
3795bb0fc5
commit
5036805be7
@ -98,7 +98,7 @@ static inline void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
|
|||||||
list_add_tail(&sh->lru, &conf->inactive_list);
|
list_add_tail(&sh->lru, &conf->inactive_list);
|
||||||
atomic_dec(&conf->active_stripes);
|
atomic_dec(&conf->active_stripes);
|
||||||
if (!conf->inactive_blocked ||
|
if (!conf->inactive_blocked ||
|
||||||
atomic_read(&conf->active_stripes) < (NR_STRIPES*3/4))
|
atomic_read(&conf->active_stripes) < (conf->max_nr_stripes*3/4))
|
||||||
wake_up(&conf->wait_for_stripe);
|
wake_up(&conf->wait_for_stripe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -264,7 +264,8 @@ static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector
|
|||||||
conf->inactive_blocked = 1;
|
conf->inactive_blocked = 1;
|
||||||
wait_event_lock_irq(conf->wait_for_stripe,
|
wait_event_lock_irq(conf->wait_for_stripe,
|
||||||
!list_empty(&conf->inactive_list) &&
|
!list_empty(&conf->inactive_list) &&
|
||||||
(atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
|
(atomic_read(&conf->active_stripes)
|
||||||
|
< (conf->max_nr_stripes *3/4)
|
||||||
|| !conf->inactive_blocked),
|
|| !conf->inactive_blocked),
|
||||||
conf->device_lock,
|
conf->device_lock,
|
||||||
unplug_slaves(conf->mddev);
|
unplug_slaves(conf->mddev);
|
||||||
@ -1917,7 +1918,7 @@ static int run(mddev_t *mddev)
|
|||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
|
memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
|
||||||
conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
|
conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
|
||||||
if (grow_stripes(conf, conf->max_nr_stripes)) {
|
if (grow_stripes(conf, conf->max_nr_stripes)) {
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
|
Loading…
Reference in New Issue
Block a user