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)
|
||||
unlink(backup_file);
|
||||
if (!done)
|
||||
if (!done) {
|
||||
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
|
||||
* (which will have happened unless odata < ndata)
|
||||
* and then set the level
|
||||
* (which will have happened unless
|
||||
* 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);
|
||||
if (c == NULL) {
|
||||
if (forked)
|
||||
|
@ -2020,14 +2064,13 @@ static int reshape_array(char *container, int fd, char *devname,
|
|||
exit(0);/* not possible */
|
||||
}
|
||||
|
||||
if (reshape.before.data_disks <
|
||||
reshape.after.data_disks)
|
||||
wait_reshape(sra);
|
||||
err = sysfs_set_str(sra, NULL, "level", c);
|
||||
if (err)
|
||||
fprintf(stderr, Name ": %s: could not set level to %s\n",
|
||||
devname, c);
|
||||
fprintf(stderr, Name\
|
||||
": %s: could not set level"
|
||||
"to %s\n", devname, c);
|
||||
}
|
||||
out:
|
||||
if (forked)
|
||||
return 0;
|
||||
exit(0);
|
||||
|
|
Loading…
Reference in New Issue