summaryrefslogtreecommitdiff
path: root/Grow.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-01-20 15:31:45 +1100
committerNeilBrown <neilb@suse.de>2014-01-20 15:31:45 +1100
commit5e7be8389446a4afa016351e65d1ead31a978f16 (patch)
treeb1c5fd57c7cdcb0884867e85a9cd89d0c493d97f /Grow.c
parentf0e876ce03a63f150bb87b2734c139bc8bb285b2 (diff)
Grow: fix problems with prematurely aborting of reshapes.
1/ when unfreezing, make sure the array is frozen first. If it isn't we might end up interrupting a reshape. 2/ When the child finishes, don't call abort_reshape() as that will interrupt the reshape. Just set suspend_* etc explicitly. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Grow.c')
-rw-r--r--Grow.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/Grow.c b/Grow.c
index f9f97920..6f556f65 100644
--- a/Grow.c
+++ b/Grow.c
@@ -612,9 +612,14 @@ static void unfreeze(struct supertype *st)
return unfreeze_container(st);
else {
struct mdinfo *sra = sysfs_read(-1, st->devnm, GET_VERSION);
+ char buf[20];
- if (sra)
+ if (sra &&
+ sysfs_get_str(sra, NULL, "sync_action", buf, 20) > 0
+ && strcmp(buf, "frozen\n") == 0) {
+ printf("unfreeze\n");
sysfs_set_str(sra, NULL, "sync_action", "idle");
+ }
sysfs_free(sra);
}
}
@@ -2666,7 +2671,7 @@ static int impose_level(int fd, int level, char *devname, int verbose)
for (d = 0, found = 0;
d < MAX_DISKS && found < array.nr_disks;
d++) {
- mdu_disk_info_t disk;
+ mdu_disk_info_t disk;
disk.number = d;
if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
continue;
@@ -4316,7 +4321,12 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
}
/* FIXME maybe call progress_reshape one more time instead */
- abort_reshape(sra); /* remove any remaining suspension */
+ /* remove any remaining suspension */
+ 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);
+
if (reshape->before.data_disks == reshape->after.data_disks)
sysfs_set_num(sra, NULL, "sync_speed_min", speed);
free(buf);