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)
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);