Grow: split continue_via_systemd into a separate function.
This allows it to be used for containers too. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
b0140ae83c
commit
b0b67933dc
95
Grow.c
95
Grow.c
|
@ -2753,6 +2753,48 @@ static void catch_term(int sig)
|
||||||
sigterm = 1;
|
sigterm = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int continue_via_systemd(char *devnm)
|
||||||
|
{
|
||||||
|
int skipped, i, pid, status;
|
||||||
|
char pathbuf[1024];
|
||||||
|
/* In a systemd/udev world, it is best to get systemd to
|
||||||
|
* run "mdadm --grow --continue" rather than running in the
|
||||||
|
* background.
|
||||||
|
*/
|
||||||
|
switch(fork()) {
|
||||||
|
case 0:
|
||||||
|
/* FIXME yuk. CLOSE_EXEC?? */
|
||||||
|
skipped = 0;
|
||||||
|
for (i = 3; skipped < 20; i++)
|
||||||
|
if (close(i) < 0)
|
||||||
|
skipped++;
|
||||||
|
else
|
||||||
|
skipped = 0;
|
||||||
|
|
||||||
|
/* Don't want to see error messages from
|
||||||
|
* systemctl. If the service doesn't exist,
|
||||||
|
* we fork ourselves.
|
||||||
|
*/
|
||||||
|
close(2);
|
||||||
|
open("/dev/null", O_WRONLY);
|
||||||
|
snprintf(pathbuf, sizeof(pathbuf), "mdadm-grow-continue@%s.service",
|
||||||
|
devnm);
|
||||||
|
status = execl("/usr/bin/systemctl", "systemctl",
|
||||||
|
"start",
|
||||||
|
pathbuf, NULL);
|
||||||
|
status = execl("/bin/systemctl", "systemctl", "start",
|
||||||
|
pathbuf, NULL);
|
||||||
|
exit(1);
|
||||||
|
case -1: /* Just do it ourselves. */
|
||||||
|
break;
|
||||||
|
default: /* parent - good */
|
||||||
|
pid = wait(&status);
|
||||||
|
if (pid >= 0 && status == 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int reshape_array(char *container, int fd, char *devname,
|
static int reshape_array(char *container, int fd, char *devname,
|
||||||
struct supertype *st, struct mdinfo *info,
|
struct supertype *st, struct mdinfo *info,
|
||||||
int force, struct mddev_dev *devlist,
|
int force, struct mddev_dev *devlist,
|
||||||
|
@ -3232,54 +3274,13 @@ started:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!forked && !check_env("MDADM_NO_SYSTEMCTL")) {
|
if (!forked && !check_env("MDADM_NO_SYSTEMCTL"))
|
||||||
int skipped, i, pid, status;
|
if (continue_via_systemd(container ?: sra->sys_name)) {
|
||||||
char pathbuf[1024];
|
free(fdlist);
|
||||||
char *devnm;
|
free(offsets);
|
||||||
/* In a systemd/udev world, it is best to get systemd to
|
sysfs_free(sra);
|
||||||
* run "mdadm --grow --continue" rather than running in the
|
return 0;
|
||||||
* background.
|
|
||||||
*/
|
|
||||||
if (container)
|
|
||||||
devnm = container;
|
|
||||||
else
|
|
||||||
devnm = sra->sys_name;
|
|
||||||
switch(fork()) {
|
|
||||||
case 0:
|
|
||||||
/* FIXME yuk. CLOSE_EXEC?? */
|
|
||||||
skipped = 0;
|
|
||||||
for (i = 3; skipped < 20; i++)
|
|
||||||
if (close(i) < 0)
|
|
||||||
skipped++;
|
|
||||||
else
|
|
||||||
skipped = 0;
|
|
||||||
|
|
||||||
/* Don't want to see error messages from
|
|
||||||
* systemctl. If the service doesn't exist,
|
|
||||||
* we fork ourselves.
|
|
||||||
*/
|
|
||||||
close(2);
|
|
||||||
open("/dev/null", O_WRONLY);
|
|
||||||
snprintf(pathbuf, sizeof(pathbuf), "mdadm-grow-continue@%s.service",
|
|
||||||
devnm);
|
|
||||||
status = execl("/usr/bin/systemctl", "systemctl",
|
|
||||||
"start",
|
|
||||||
pathbuf, NULL);
|
|
||||||
status = execl("/bin/systemctl", "systemctl", "start",
|
|
||||||
pathbuf, NULL);
|
|
||||||
exit(1);
|
|
||||||
case -1: /* Just do it ourselves. */
|
|
||||||
break;
|
|
||||||
default: /* parent - good */
|
|
||||||
pid = wait(&status);
|
|
||||||
if (pid >= 0 && status == 0) {
|
|
||||||
free(fdlist);
|
|
||||||
free(offsets);
|
|
||||||
sysfs_free(sra);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Now we just need to kick off the reshape and watch, while
|
/* Now we just need to kick off the reshape and watch, while
|
||||||
* handling backups of the data...
|
* handling backups of the data...
|
||||||
|
|
Loading…
Reference in New Issue