diff --git a/Grow.c b/Grow.c index 36bb7de..25c55cc 100644 --- a/Grow.c +++ b/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);