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:
Adam Kwolek 2011-01-06 18:29:20 +11:00 committed by NeilBrown
parent ef83fa1a7c
commit 582496b2c2
1 changed files with 52 additions and 9 deletions

61
Grow.c
View File

@ -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",
&current_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);