return rc;
}
+int start_reshape(struct mdinfo *sra)
+{
+ int err;
+ err = sysfs_set_num(sra, NULL, "suspend_hi", 0);
+ err = err ?: sysfs_set_num(sra, NULL, "suspend_lo", 0);
+ err = err ?: sysfs_set_num(sra, NULL, "sync_min", 0);
+ err = err ?: sysfs_set_num(sra, NULL, "sync_max", 0);
+ err = err ?: sysfs_set_str(sra, NULL, "sync_action", "reshape");
+
+ return err;
+}
+
+void abort_reshape(struct mdinfo *sra)
+{
+ sysfs_set_str(sra, NULL, "sync_action", "idle");
+ sysfs_set_num(sra, NULL, "suspend_lo", 0x7FFFFFFFFFFFFFFFULL);
+ sysfs_set_num(sra, NULL, "suspend_hi", 0);
+ sysfs_set_num(sra, NULL, "suspend_lo", 0);
+ sysfs_set_num(sra, NULL, "sync_min", 0);
+ sysfs_set_str(sra, NULL, "sync_max", "max");
+}
+
static int reshape_container_raid_disks(char *container, int raid_disks)
{
/* for each subarray switch to a raid level that can
* handling backups of the data...
* This is all done by a forked background process.
*/
+ start_reshape(sra);
switch(fork()) {
case 0:
close(fd);
d - odisks, fdlist+odisks, offsets+odisks);
if (backup_file && done)
unlink(backup_file);
- if (level != UnSet && level != array.level) {
+ if (!done)
+ abort_reshape(sra);
+ else if (level != UnSet && level != array.level) {
/* We need to wait for the reshape to finish
* (which will have happened unless odata < ndata)
* and then set the level
fprintf(stderr, Name ": Cannot run child to monitor reshape: %s\n",
strerror(errno));
rv = 1;
+ abort_reshape(sra);
break;
default:
/* The child will take care of unfreezing the array */
if (fd < 0)
return -1;
sysfs_set_num(sra, NULL, "sync_max", offset + blocks + blocks2);
- if (offset == 0)
- sysfs_set_str(sra, NULL, "sync_action", "reshape");
if (sysfs_fd_get_ll(fd, &completed) < 0) {
close(fd);
if (posix_memalign((void**)&buf, 4096, disks * chunk))
/* Don't start the 'reshape' */
return 0;
- sysfs_set_num(sra, NULL, "suspend_hi", 0);
- sysfs_set_num(sra, NULL, "suspend_lo", 0);
grow_backup(sra, 0, stripes,
fds, offsets, disks, chunk, level, layout,
dests, destfd, destoffsets,
return 0;
start = sra->component_size - stripes * (chunk/512);
sysfs_set_num(sra, NULL, "sync_max", start);
- sysfs_set_str(sra, NULL, "sync_action", "reshape");
- sysfs_set_num(sra, NULL, "suspend_lo", 0);
- sysfs_set_num(sra, NULL, "suspend_hi", 0);
rv = wait_backup(sra, 0, start - stripes * (chunk/512), stripes * (chunk/512),
dests, destfd, destoffsets, 0);
if (rv < 0)
if (posix_memalign((void**)&buf, 4096, disks * chunk))
return 0;
- sysfs_set_num(sra, NULL, "suspend_lo", 0);
- sysfs_set_num(sra, NULL, "suspend_hi", 0);
-
sysfs_get_ll(sra, NULL, "sync_speed_min", &speed);
sysfs_set_num(sra, NULL, "sync_speed_min", 200000);