summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Berra <bluca@comedia.it>2010-02-27 16:07:04 +0100
committerNeilBrown <neilb@suse.de>2010-03-03 11:06:08 +1100
commiteb49460b74f42e23bf284c4ccf92f4b6da2c582d (patch)
treedb3264401bc5fb2413e4d78fcb2c2b27502b8de1
parentfcf5762500297536d3c3376945684c4f654ffe44 (diff)
downloadmdadm-eb49460b74f42e23bf284c4ccf92f4b6da2c582d.tar.gz
mdadm-eb49460b74f42e23bf284c4ccf92f4b6da2c582d.tar.xz
mdadm-eb49460b74f42e23bf284c4ccf92f4b6da2c582d.zip
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 <bluca@comedia.it> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--mdmon.810
-rw-r--r--mdmon.c16
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,