summaryrefslogtreecommitdiff
path: root/mdmon.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-02-08 14:08:13 +1100
committerNeilBrown <neilb@suse.de>2010-02-08 14:08:13 +1100
commitb5c727dc1a55323f02e5f60a50bcecb866dd51ea (patch)
tree85ef79c62ace2c5d548ff1430039faa234351482 /mdmon.c
parenta9596b79a316404bbb4e3792c97b3d0a597ec885 (diff)
mdmon: remove switch-root functionality.
Using switch-root and then creating files in /var/run once that location is writable is racing as most distro clean out /var/run shortly after it is mounted. This can cause the .pid and .sock files to be deleted shortly after they are created. This option doesn't seem to be used at all any, and the alternative of communicating the pid etc in some preserved directory and then restarting mdmon once all is settled seems simpler. So remove the code for supporting switchroot and update man page accordingly. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'mdmon.c')
-rw-r--r--mdmon.c94
1 files changed, 23 insertions, 71 deletions
diff --git a/mdmon.c b/mdmon.c
index 37474603..c590fb20 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -254,28 +254,31 @@ void usage(void)
exit(2);
}
-static int mdmon(char *devname, int devnum, int must_fork, char *switchroot);
+static int mdmon(char *devname, int devnum, int must_fork, int takeover);
int main(int argc, char *argv[])
{
char *container_name = NULL;
- char *switchroot = NULL;
int devnum;
char *devname;
int status = 0;
-
- switch (argc) {
- case 3:
- switchroot = argv[2];
- case 2:
- container_name = argv[1];
- break;
- default:
- usage();
+ int arg;
+ int all = 0;
+ int takeover = 0;
+
+ for (arg = 1; arg < argc; arg++) {
+ if (strcmp(argv[arg], "--all") == 0 ||
+ strcmp(argv[arg], "/proc/mdstat") == 0)
+ all = 1;
+ else if (strcmp(argv[arg], "--takeover") == 0)
+ takeover = 1;
+ else if (container_name == NULL)
+ container_name = argv[arg];
+ else
+ usage();
}
- if (strcmp(container_name, "/proc/mdstat") == 0 ||
- strcmp(container_name, "--all") == 0) {
+ if (all) {
struct mdstat_ent *mdstat, *e;
/* launch an mdmon instance for each container found */
@@ -292,7 +295,7 @@ int main(int argc, char *argv[])
sprintf(container_name, "%s", devname);
}
status |= mdmon(devname, e->devnum, 1,
- switchroot);
+ takeover);
}
}
free_mdstat(mdstat);
@@ -320,10 +323,10 @@ int main(int argc, char *argv[])
container_name);
exit(1);
}
- return mdmon(devname, devnum, do_fork(), switchroot);
+ return mdmon(devname, devnum, do_fork(), takeover);
}
-static int mdmon(char *devname, int devnum, int must_fork, char *switchroot)
+static int mdmon(char *devname, int devnum, int must_fork, int takeover)
{
int mdfd;
struct mdinfo *mdi, *di;
@@ -336,50 +339,7 @@ static int mdmon(char *devname, int devnum, int must_fork, char *switchroot)
pid_t victim = -1;
int victim_sock = -1;
- dprintf("starting mdmon for %s in %s\n",
- devname, switchroot ? : "/");
-
- /* switchroot is either a path name starting with '/', or a
- * pid of the original mdmon (we have already done the chroot).
- * In the latter case, stdin is a socket connected to the original
- * mdmon.
- */
-
- /* try to spawn mdmon instances from the target file system */
- if (switchroot && switchroot[0] == '/' &&
- strcmp(switchroot, "/") != 0) {
- pid_t pid;
- char buf[20];
-
- switch (fork()) {
- case 0:
- victim = mdmon_pid(devnum);
- victim_sock = connect_monitor(devname);
- if (chroot(switchroot) != 0) {
- fprintf(stderr, "mdmon: failed to chroot to '%s': %s\n",
- switchroot, strerror(errno));
- exit(4);
- }
- ignore = chdir("/");
- sprintf(buf, "%d", victim);
- if (victim_sock) {
- close(0);
- dup(victim_sock);
- close(victim_sock);
- }
- execl("/sbin/mdmon", "mdmon", devname, buf, NULL);
- exit(1);
- case -1:
- return 1;
- default:
- pid = wait(&status);
- if (pid > -1 && WIFEXITED(status) &&
- WEXITSTATUS(status) == 0)
- return 0;
- else
- return 1;
- }
- }
+ dprintf("starting mdmon for %s\n", devname);
mdfd = open_dev(devnum);
if (mdfd < 0) {
@@ -486,17 +446,9 @@ static int mdmon(char *devname, int devnum, int must_fork, char *switchroot)
act.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &act, NULL);
- if (switchroot) {
- /* we assume we assume that /sys /proc /dev are available in
- * the new root
- */
- if (switchroot[0] == '/') {
- victim = mdmon_pid(container->devnum);
- victim_sock = connect_monitor(container->devname);
- } else {
- victim = atoi(switchroot);
- victim_sock = 0;
- }
+ if (takeover) {
+ victim = mdmon_pid(container->devnum);
+ victim_sock = connect_monitor(container->devname);
}
ignore = chdir("/");