mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
md/raid5: reallocate page array after setting new stripe_size
When try to resize stripe_size, we also need to free old shared page array and allocate new. Signed-off-by: Yufen Yu <yuyufen@huawei.com> Signed-off-by: Song Liu <songliubraving@fb.com>
This commit is contained in:
parent
f16acaf328
commit
3891258443
@ -6682,6 +6682,7 @@ raid5_store_stripe_size(struct mddev *mddev, const char *page, size_t len)
|
||||
struct r5conf *conf;
|
||||
unsigned long new;
|
||||
int err;
|
||||
int size;
|
||||
|
||||
if (len >= PAGE_SIZE)
|
||||
return -EINVAL;
|
||||
@ -6714,10 +6715,29 @@ raid5_store_stripe_size(struct mddev *mddev, const char *page, size_t len)
|
||||
pr_debug("md/raid: change stripe_size from %lu to %lu\n",
|
||||
conf->stripe_size, new);
|
||||
|
||||
if (mddev->sync_thread ||
|
||||
test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
|
||||
mddev->reshape_position != MaxSector ||
|
||||
mddev->sysfs_active) {
|
||||
err = -EBUSY;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
mddev_suspend(mddev);
|
||||
mutex_lock(&conf->cache_size_mutex);
|
||||
size = conf->max_nr_stripes;
|
||||
|
||||
shrink_stripes(conf);
|
||||
|
||||
conf->stripe_size = new;
|
||||
conf->stripe_shift = ilog2(new) - 9;
|
||||
conf->stripe_sectors = new >> 9;
|
||||
if (grow_stripes(conf, size)) {
|
||||
pr_warn("md/raid:%s: couldn't allocate buffers\n",
|
||||
mdname(mddev));
|
||||
err = -ENOMEM;
|
||||
}
|
||||
mutex_unlock(&conf->cache_size_mutex);
|
||||
mddev_resume(mddev);
|
||||
|
||||
out_unlock:
|
||||
|
Loading…
Reference in New Issue
Block a user