From eb49460b74f42e23bf284c4ccf92f4b6da2c582d Mon Sep 17 00:00:00 2001 From: Luca Berra Date: Sat, 27 Feb 2010 16:07:04 +0100 Subject: [PATCH] fix mdmon option parsing running mdmon --takeover --all resulted in a segfault. Also allow "--all" to be longer so that e.g. md_d127 can successfully over-write it in the argument list visible to 'ps'. Signed-off-by: Luca Berra Signed-off-by: NeilBrown --- mdmon.8 | 10 +++++++++- mdmon.c | 16 ++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/mdmon.8 b/mdmon.8 index df9dfbc..8a482b3 100644 --- a/mdmon.8 +++ b/mdmon.8 @@ -157,6 +157,14 @@ This tells mdmon to find any active containers and start monitoring each of them if appropriate. This is normally used with .B \-\-takeover late in the boot sequence. +A separate +.I mdmon +process is started for each container as the +.B \-\-all +argument is over-written with the name of the container. To allow for +containers with names longer than 5 characters, this argument can be +arbitrarily extended, e.g. to +.BR \-\-all-active-arrays . .PP Note that @@ -228,7 +236,7 @@ filesystem, like the root filesystem, should be remounted read-only. .SH EXAMPLES -.B " mdmon \-\-all \-\-takeover" +.B " mdmon \-\-all-active-arrays \-\-takeover" .br Any .I mdmon diff --git a/mdmon.c b/mdmon.c index 8e62a68..a3da795 100644 --- a/mdmon.c +++ b/mdmon.c @@ -247,7 +247,7 @@ static int do_fork(void) void usage(void) { - fprintf(stderr, "Usage: mdmon /device/name/for/container [target_dir]\n"); + fprintf(stderr, "Usage: mdmon [--all] [--takeover] CONTAINER\n"); exit(2); } @@ -264,19 +264,23 @@ int main(int argc, char *argv[]) int takeover = 0; for (arg = 1; arg < argc; arg++) { - if (strcmp(argv[arg], "--all") == 0 || - strcmp(argv[arg], "/proc/mdstat") == 0) + if (strncmp(argv[arg], "--all",5) == 0 || + strcmp(argv[arg], "/proc/mdstat") == 0) { + container_name = argv[arg]; all = 1; - else if (strcmp(argv[arg], "--takeover") == 0) + } else if (strcmp(argv[arg], "--takeover") == 0) takeover = 1; else if (container_name == NULL) container_name = argv[arg]; else usage(); } + if (container_name == NULL) + usage(); if (all) { struct mdstat_ent *mdstat, *e; + int container_len = strlen(container_name); /* launch an mdmon instance for each container found */ mdstat = mdstat_read(0, 0); @@ -287,8 +291,8 @@ int main(int argc, char *argv[]) /* update cmdline so this mdmon instance can be * distinguished from others in a call to ps(1) */ - if (strlen(devname) <= strlen(container_name)) { - memset(container_name, 0, strlen(container_name)); + if (strlen(devname) <= container_len) { + memset(container_name, 0, container_len); sprintf(container_name, "%s", devname); } status |= mdmon(devname, e->devnum, 1,