#include "dlink.h"
#include <sys/mman.h>
#include <stdint.h>
+#include <signal.h>
#if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN)
#error no endian defined
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");
+ // It isn't safe to reset sync_max as we aren't monitoring.
+ // Array really should be stopped at this point.
}
int remove_disks_for_takeover(struct supertype *st,
return 0;
}
+int sigterm = 0;
+static void catch_term(int sig)
+{
+ sigterm = 1;
+}
+
static int reshape_array(char *container, int fd, char *devname,
struct supertype *st, struct mdinfo *info,
int force, struct mddev_dev *devlist,
fd = -1;
mlockall(MCL_FUTURE);
+ signal(SIGTERM, catch_term);
+
if (st->ss->external) {
/* metadata handler takes it from here */
done = st->ss->manage_reshape(
forget_backup(dests, destfd,
destoffsets, 1);
}
-
+ if (sigterm)
+ rv = -2;
if (rv < 0) {
if (rv == -1)
done = 1;
dprintf("wait_for_reshape_imsm returned error!\n");
goto abort;
}
+ if (sigterm)
+ goto abort;
if (save_checkpoint_imsm(st, sra, UNIT_SRC_NORMAL) == 1) {
/* ignore error == 2, this can mean end of reshape here