Set array size after adding new disks
When new disks are added array size has to be set by mdadm as array grows. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
ef83fa1a7c
commit
582496b2c2
61
Grow.c
61
Grow.c
|
@ -2005,14 +2005,58 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
|
|
||||||
if (backup_file && done)
|
if (backup_file && done)
|
||||||
unlink(backup_file);
|
unlink(backup_file);
|
||||||
if (!done)
|
if (!done) {
|
||||||
abort_reshape(sra);
|
abort_reshape(sra);
|
||||||
else if (info->new_level != info->array.level) {
|
goto out;
|
||||||
|
}
|
||||||
|
/* set new array size if required customer_array_size is used
|
||||||
|
* by this metadata.
|
||||||
|
*/
|
||||||
|
if (reshape.before.data_disks !=
|
||||||
|
reshape.after.data_disks &&
|
||||||
|
info->custom_array_size) {
|
||||||
|
struct mdinfo *info2;
|
||||||
|
char *subarray = strchr(info->text_version+1, '/')+1;
|
||||||
|
|
||||||
|
wait_reshape(sra);
|
||||||
|
ping_monitor(container);
|
||||||
|
|
||||||
|
info2 = st->ss->container_content(st, subarray);
|
||||||
|
if (info2) {
|
||||||
|
unsigned long long current_size = 0;
|
||||||
|
unsigned long long new_size =
|
||||||
|
info2->custom_array_size/2;
|
||||||
|
|
||||||
|
if (sysfs_get_ll(sra,
|
||||||
|
NULL,
|
||||||
|
"array_size",
|
||||||
|
¤t_size) == 0 &&
|
||||||
|
new_size > current_size) {
|
||||||
|
if (sysfs_set_num(sra, NULL,
|
||||||
|
"array_size", new_size)
|
||||||
|
< 0)
|
||||||
|
dprintf("Error: Cannot"
|
||||||
|
" set array size");
|
||||||
|
else
|
||||||
|
dprintf("Array size "
|
||||||
|
"changed");
|
||||||
|
dprintf(" from %llu to %llu.\n",
|
||||||
|
current_size, new_size);
|
||||||
|
}
|
||||||
|
sysfs_free(info2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->new_level != info->array.level) {
|
||||||
/* We need to wait for the reshape to finish
|
/* We need to wait for the reshape to finish
|
||||||
* (which will have happened unless odata < ndata)
|
* (which will have happened unless
|
||||||
* and then set the level
|
* odata < ndata) and then set the level
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (reshape.before.data_disks <
|
||||||
|
reshape.after.data_disks)
|
||||||
|
wait_reshape(sra);
|
||||||
|
|
||||||
c = map_num(pers, info->new_level);
|
c = map_num(pers, info->new_level);
|
||||||
if (c == NULL) {
|
if (c == NULL) {
|
||||||
if (forked)
|
if (forked)
|
||||||
|
@ -2020,14 +2064,13 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
exit(0);/* not possible */
|
exit(0);/* not possible */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reshape.before.data_disks <
|
|
||||||
reshape.after.data_disks)
|
|
||||||
wait_reshape(sra);
|
|
||||||
err = sysfs_set_str(sra, NULL, "level", c);
|
err = sysfs_set_str(sra, NULL, "level", c);
|
||||||
if (err)
|
if (err)
|
||||||
fprintf(stderr, Name ": %s: could not set level to %s\n",
|
fprintf(stderr, Name\
|
||||||
devname, c);
|
": %s: could not set level"
|
||||||
|
"to %s\n", devname, c);
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
if (forked)
|
if (forked)
|
||||||
return 0;
|
return 0;
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
Loading…
Reference in New Issue